ISA-8 SD-контроллер (SPI) на CPLD
Moderator: Shaos
-
- Doomed
- Posts: 662
- Joined: 18 Nov 2013 02:38
- Location: Москва
Re: ISA-8 SD-контроллер (SPI) на CPLD
Почему-то читает предыдущий записываемый байт... То есть цикл:
for i = 0 to 255 do
begin
port[$3b0] := i;
while port[$3b1] and $40 <> 0;
tmp := port[$3b0];
if tmp <> i then WriteLn('ERR ....',i,' ret=',tmp,' port=', Port[$3b0]);
end;
Дает такую картину:
for i = 0 to 255 do
begin
port[$3b0] := i;
while port[$3b1] and $40 <> 0;
tmp := port[$3b0];
if tmp <> i then WriteLn('ERR ....',i,' ret=',tmp,' port=', Port[$3b0]);
end;
Дает такую картину:
You do not have the required permissions to view the files attached to this post.
-
- Doomed
- Posts: 662
- Joined: 18 Nov 2013 02:38
- Location: Москва
Re: ISA-8 SD-контроллер (SPI) на CPLD
А, нет. Читает правильно. А вот пишет не правильно.
Идет
MOSI = 41; MISO = 41
MOSI = 42; MISO = 42
MOSI = 43; MISO = 43
MOSI = 44; MISO = 44
MOSI = 44; MISO = 44 <---- не записал 45 сюда, продублировал предыдущее значение
MOSI = 46; MISO = 46
Идет
MOSI = 41; MISO = 41
MOSI = 42; MISO = 42
MOSI = 43; MISO = 43
MOSI = 44; MISO = 44
MOSI = 44; MISO = 44 <---- не записал 45 сюда, продублировал предыдущее значение
MOSI = 46; MISO = 46
-
- Devil
- Posts: 716
- Joined: 30 Nov 2013 11:08
- Location: WWW
Re: ISA-8 SD-контроллер (SPI) на CPLD
Что-то не понял - проверка готовности или просто пауза между выдачами байтов есть ?
-
- Doomed
- Posts: 662
- Joined: 18 Nov 2013 02:38
- Location: Москва
Re: ISA-8 SD-контроллер (SPI) на CPLD
есть проверка готовности while port[$3b1] and $40 <> 0;newold86 wrote:Что-то не понял - проверка готовности или просто пауза между выдачами байтов есть ?
-
- Devil
- Posts: 716
- Joined: 30 Nov 2013 11:08
- Location: WWW
Re: ISA-8 SD-контроллер (SPI) на CPLD
А можно вместо проверки готовности вставить паузу, гарантированно достаточную для передачи байта ?
-
- Doomed
- Posts: 662
- Joined: 18 Nov 2013 02:38
- Location: Москва
Re: ISA-8 SD-контроллер (SPI) на CPLD
С гарантированной паузой ошибок меньше, но они есть.
-
- Doomed
- Posts: 662
- Joined: 18 Nov 2013 02:38
- Location: Москва
Re: ISA-8 SD-контроллер (SPI) на CPLD
Нет, ну это провал. Взял схемную реализацию от Specialist MX http://www.spetsialist-mx.ru/index32.html
Выкинул из делителя тройку тригеров, влезла в 31 ячейку. Инвертировал сигнал RESET на схеме, ввел дополнительно /RD. Из порта управления читается хрень 0x4F всегда, что бы я туда не записал.
Порт данных вроде бы работает, но точно так же периодически идут ошибки. Так как контрол порт не работает, делал просто с задержкой 10 мс. Даже 20 мс. Пофигу.
Но ошибки другого рода, видимо сдвиг не до конца происходит бит.
Сдаюсь.
Выкинул из делителя тройку тригеров, влезла в 31 ячейку. Инвертировал сигнал RESET на схеме, ввел дополнительно /RD. Из порта управления читается хрень 0x4F всегда, что бы я туда не записал.
Порт данных вроде бы работает, но точно так же периодически идут ошибки. Так как контрол порт не работает, делал просто с задержкой 10 мс. Даже 20 мс. Пофигу.
Но ошибки другого рода, видимо сдвиг не до конца происходит бит.
Сдаюсь.
You do not have the required permissions to view the files attached to this post.
-
- Supreme God
- Posts: 16703
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: ISA-8 SD-контроллер (SPI) на CPLD
Я всё жду, когда Tronix напишет: прогрел "феном от станции на 450 градусов все подряд" и всё заработало! 

iLavr
-
- Doomed
- Posts: 662
- Joined: 18 Nov 2013 02:38
- Location: Москва
Re: ISA-8 SD-контроллер (SPI) на CPLD
Не знаю как и почему, но оно заработало.
Игрался от безысходности с кодом, в частности с блокирующими и не блокирующими присваиваниями. С привязкой всего чего можно к Clk. С negedge и posedge. И в один прекрасный момент звезды совпали так, что видимо я куда нужно что-то воткнул, а где не нужно что-то выткнул. И заработало. Правда, еще оказалось, что все-таки подтяжка всех SPI сигналов к Vcc нужна, без нее не устойчиво карта определялась, да и только лишь когда параллельно был анализатор подключен. Ну 4 резистора припаял, мне не сложно.
Код получился такой:

Код получился такой:
Code: Select all
module MX2_CPLD(
// Системные
input Clk, // Входная частота 14.31818 МГц
input Res, // Входной сигнал сброса, активный уровень лог.0
input nRD, // Вход строба чтения
input nWR, // Вход строба записи
input nCS, // Вход выбора контроллера
input Adr, // Вход адреса данные/управление
inout [7:0]Dat, // Шина данных
// SPI
output nSEL, // Выходной сигнал выбора карты
output reg SCK, // Выход тактовой частоты SPI
input MISO, // Вход данных SPI
output MOSI, // Выход данных SPI
output nRED, // Выход управления красным светодиодом
input nINS // Вход датчика вставления карты
);
// Внутренние регистры
reg [2:0]Pre; // Делитель частоты
reg [2:0]Ctrl; // Регистр управления
reg [7:0]Data; // Регистр данных
reg [2:0]Bits; // Счетчик сдвигаемых бит
reg RMISO; // Защелка сигнала MISO
reg BUSY; // SPI занят передачей
// Комбинаторика
assign nSEL = ~Ctrl[0]; // Выбор карты
assign nRED = ~Ctrl[2]; // Красная лампочка
assign MOSI = Data[7]; // Выход MOSI SPI
assign Dat[7:0] = (~nCS & ~nRD & ~Clk) ?
(Adr) ? {~nINS,BUSY,3'h0,Ctrl[2:0]} : Data[7:0]
: 8'hZZ;
// Синхронная логика
always @(posedge Clk) begin
// Делитель частоты
Pre[2:0] <= Pre[2:0] + 3'h1;
// Запись в управление может происходить асинхронно
if (~nCS & ~nWR & Adr) Ctrl[2:0] = Dat[2:0];
// Сигнал сброса имеет приоритет вне зависимости от выбранной скорости
if (Res)
begin
// Сброс действует на эти регистры
Ctrl[2:0] <= 3'h0;
Bits[2:0] <= 3'h0;
BUSY <= 1'b0;
SCK <= 1'b0;
end
else
begin
// Состояние SPI
if (BUSY)
begin
// Делитель частоты
if (((Pre[2] & Pre[1]) | Ctrl[1]) & Pre[0])
begin
// SPI работает
if (SCK)
begin
// Сбрасываем такт
SCK <= 1'b0;
// Спад, поэтому сдвигаем
Data[7:0] <= {Data[6:0],RMISO};
// Считаем биты
Bits[2:0] <= Bits[2:0] + 3'h1;
// Это был 7й бит?
if (Bits[2] & Bits[1] & Bits[0]) BUSY = 1'b0;
end else begin
// Устанавливаем такт
SCK <= 1'b1;
// Это фронт, поэтому сэмплируем вход
RMISO <= MISO;
end
end
end else begin
// Обнуляем счетчик бит
Bits[2:0] <= 3'h0;
// Запись в регистр данных возможна только если SPI не занят
if (~nCS & ~nWR & ~Adr)
begin
Data[7:0] = Dat[7:0];
BUSY = 1'b1;
end
end
end
end
// Конец
endmodule
You do not have the required permissions to view the files attached to this post.
-
- Doomed
- Posts: 662
- Joined: 18 Nov 2013 02:38
- Location: Москва
Re: ISA-8 SD-контроллер (SPI) на CPLD
Это на Поиск-2. На 386 тоже делает вид, что работает (спишем пару зависаний при тесте на неконтакт в ISA слотах на стенде без корпуса). На первом пне - снова ошибки.
Вообщем крайне не стабильная система, увы.
Вообщем крайне не стабильная система, увы.
-
- Doomed
- Posts: 449
- Joined: 08 Apr 2013 04:04
- Location: 213.247.249.139
Re: ISA-8 SD-контроллер (SPI) на CPLD
Если в ква включить галку "slow slew rate" -- не улучшает стабильность?
привет засранцу лавру :)
-
- Devil
- Posts: 716
- Joined: 30 Nov 2013 11:08
- Location: WWW
Re: ISA-8 SD-контроллер (SPI) на CPLD
Ну, я вроде где-то раньше упоминал известный (мне) факт о приработке софта - много раз запустишь, оно и притираетсяTronix wrote:Не знаю как и почему, но оно заработало.

На телефоне сложно сравнивать - код чем-то отличается от предыдущего ?
Думаю, что шина слишком шустрая для такого способа общения с ней...Tronix wrote:На первом пне - снова ошибки.
-
- Doomed
- Posts: 662
- Joined: 18 Nov 2013 02:38
- Location: Москва
Re: ISA-8 SD-контроллер (SPI) на CPLD
Попробую, спасибо.angry_troll wrote:Если в ква включить галку "slow slew rate" -- не улучшает стабильность?
Чем то отличается. = вместо <= в некоторых местах, чтение из регистра не только по nCS & nRD но и по Clk. Что то еще может быть.newold86 wrote:код чем-то отличается от предыдущего ?
Это как? Чем шина на пне отличается от шины не на пне?newold86 wrote:Думаю, что шина слишком шустрая для такого способа общения с ней...
-
- Maniac
- Posts: 261
- Joined: 22 Jun 2005 04:35
- Location: МО Россия
Re: ISA-8 SD-контроллер (SPI) на CPLD
На всех диаграммах ISA, которые нагугливаются, data гарантированно присутствует на поседже nWR.
Вот к этой строчке
if (~nCS & ~nWR & Adr) Ctrl[2:0] = Dat[2:0];
Это тоже относится.
И к чтению, процессором, из СПИ это тоже относится. Процессор может читать(не уверен) на поседже nRD
Нужно цеплять логический анализатор не на СПИ, а на ISA
Вот к этой строчке
if (~nCS & ~nWR & Adr) Ctrl[2:0] = Dat[2:0];
Это тоже относится.
И к чтению, процессором, из СПИ это тоже относится. Процессор может читать(не уверен) на поседже nRD
Нужно цеплять логический анализатор не на СПИ, а на ISA
-
- Doomed
- Posts: 662
- Joined: 18 Nov 2013 02:38
- Location: Москва
Re: ISA-8 SD-контроллер (SPI) на CPLD
А нет, карта работает и на пне тоже. Опять тестирую закоротив MISO и MOSI. Цикл в 65535 прогонов в каждом цикл по 255 прогонов отрабатывает без ошибок. Значит что-то не так где-то в другом месте (драйвер).