Author |
Message |
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Почему-то читает предыдущий записываемый байт... То есть цикл: 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; Дает такую картину:
|
08 Dec 2017 11:00 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
А, нет. Читает правильно. А вот пишет не правильно.
Идет 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
|
08 Dec 2017 11:08 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Что-то не понял - проверка готовности или просто пауза между выдачами байтов есть ?
|
08 Dec 2017 11:24 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
есть проверка готовности while port[$3b1] and $40 <> 0;
|
08 Dec 2017 11:26 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
А можно вместо проверки готовности вставить паузу, гарантированно достаточную для передачи байта ?
|
08 Dec 2017 11:28 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
С гарантированной паузой ошибок меньше, но они есть.
|
08 Dec 2017 11:42 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Нет, ну это провал. Взял схемную реализацию от Specialist MX http://www.spetsialist-mx.ru/index32.htmlВыкинул из делителя тройку тригеров, влезла в 31 ячейку. Инвертировал сигнал RESET на схеме, ввел дополнительно /RD. Из порта управления читается хрень 0x4F всегда, что бы я туда не записал. Порт данных вроде бы работает, но точно так же периодически идут ошибки. Так как контрол порт не работает, делал просто с задержкой 10 мс. Даже 20 мс. Пофигу. Но ошибки другого рода, видимо сдвиг не до конца происходит бит. Сдаюсь.
|
09 Dec 2017 02:19 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я всё жду, когда Tronix напишет: прогрел " феном от станции на 450 градусов все подряд" и всё заработало!
_________________ iLavr
|
09 Dec 2017 05:18 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Не знаю как и почему, но оно заработало. Игрался от безысходности с кодом, в частности с блокирующими и не блокирующими присваиваниями. С привязкой всего чего можно к Clk. С negedge и posedge. И в один прекрасный момент звезды совпали так, что видимо я куда нужно что-то воткнул, а где не нужно что-то выткнул. И заработало. Правда, еще оказалось, что все-таки подтяжка всех SPI сигналов к Vcc нужна, без нее не устойчиво карта определялась, да и только лишь когда параллельно был анализатор подключен. Ну 4 резистора припаял, мне не сложно. Код получился такой: | | | | Code: 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 | | | | |
|
09 Dec 2017 09:50 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Это на Поиск-2. На 386 тоже делает вид, что работает (спишем пару зависаний при тесте на неконтакт в ISA слотах на стенде без корпуса). На первом пне - снова ошибки.
Вообщем крайне не стабильная система, увы.
|
09 Dec 2017 12:04 |
|
|
angry_troll
Doomed
Joined: 08 Apr 2013 04:04 Posts: 449 Location: 213.247.249.139
|
Если в ква включить галку "slow slew rate" -- не улучшает стабильность?
_________________ привет засранцу лавру :)
|
09 Dec 2017 14:04 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Ну, я вроде где-то раньше упоминал известный (мне) факт о приработке софта - много раз запустишь, оно и притирается На телефоне сложно сравнивать - код чем-то отличается от предыдущего ? Думаю, что шина слишком шустрая для такого способа общения с ней...
|
09 Dec 2017 19:54 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Попробую, спасибо. Чем то отличается. = вместо <= в некоторых местах, чтение из регистра не только по nCS & nRD но и по Clk. Что то еще может быть. Это как? Чем шина на пне отличается от шины не на пне?
|
10 Dec 2017 00:06 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
На всех диаграммах ISA, которые нагугливаются, data гарантированно присутствует на поседже nWR.
Вот к этой строчке if (~nCS & ~nWR & Adr) Ctrl[2:0] = Dat[2:0]; Это тоже относится.
И к чтению, процессором, из СПИ это тоже относится. Процессор может читать(не уверен) на поседже nRD
Нужно цеплять логический анализатор не на СПИ, а на ISA
|
10 Dec 2017 00:41 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
А нет, карта работает и на пне тоже. Опять тестирую закоротив MISO и MOSI. Цикл в 65535 прогонов в каждом цикл по 255 прогонов отрабатывает без ошибок. Значит что-то не так где-то в другом месте (драйвер).
|
10 Dec 2017 01:13 |
|
|