ISA-8 SD-контроллер (SPI) на CPLD

16-битные ПЦ-совместимые компьютеры с процессорами 8086/8088/80286 работающие под управлением ДОС

Moderator: Shaos

Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Почему-то читает предыдущий записываемый байт... То есть цикл:

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;

Дает такую картину:
P71208-205447_измен.размер.jpg
You do not have the required permissions to view the files attached to this post.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

А, нет. Читает правильно. А вот пишет не правильно.

Идет
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
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

Что-то не понял - проверка готовности или просто пауза между выдачами байтов есть ?
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

newold86 wrote:Что-то не понял - проверка готовности или просто пауза между выдачами байтов есть ?
есть проверка готовности while port[$3b1] and $40 <> 0;
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

А можно вместо проверки готовности вставить паузу, гарантированно достаточную для передачи байта ?
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

С гарантированной паузой ошибок меньше, но они есть.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Нет, ну это провал. Взял схемную реализацию от Specialist MX http://www.spetsialist-mx.ru/index32.html
Выкинул из делителя тройку тригеров, влезла в 31 ячейку. Инвертировал сигнал RESET на схеме, ввел дополнительно /RD. Из порта управления читается хрень 0x4F всегда, что бы я туда не записал.
Порт данных вроде бы работает, но точно так же периодически идут ошибки. Так как контрол порт не работает, делал просто с задержкой 10 мс. Даже 20 мс. Пофигу.
Но ошибки другого рода, видимо сдвиг не до конца происходит бит.
Сдаюсь.
P71209-121345_измен.размер.jpg
You do not have the required permissions to view the files attached to this post.
User avatar
Lavr
Supreme God
Posts: 16703
Joined: 21 Oct 2009 08:08
Location: Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Lavr »

Я всё жду, когда Tronix напишет: прогрел "феном от станции на 450 градусов все подряд" и всё заработало! :mrgreen:
iLavr
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Не знаю как и почему, но оно заработало. :o Игрался от безысходности с кодом, в частности с блокирующими и не блокирующими присваиваниями. С привязкой всего чего можно к 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
P71209-195954_измен.размер.jpg
P71209-194556_измен.размер.jpg
You do not have the required permissions to view the files attached to this post.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Это на Поиск-2. На 386 тоже делает вид, что работает (спишем пару зависаний при тесте на неконтакт в ISA слотах на стенде без корпуса). На первом пне - снова ошибки.

Вообщем крайне не стабильная система, увы.
angry_troll
Doomed
Posts: 449
Joined: 08 Apr 2013 04:04
Location: 213.247.249.139

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by angry_troll »

Если в ква включить галку "slow slew rate" -- не улучшает стабильность?
привет засранцу лавру :)
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

Tronix wrote:Не знаю как и почему, но оно заработало.
Ну, я вроде где-то раньше упоминал известный (мне) факт о приработке софта - много раз запустишь, оно и притирается :)

На телефоне сложно сравнивать - код чем-то отличается от предыдущего ?
Tronix wrote:На первом пне - снова ошибки.
Думаю, что шина слишком шустрая для такого способа общения с ней...
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

angry_troll wrote:Если в ква включить галку "slow slew rate" -- не улучшает стабильность?
Попробую, спасибо.

newold86 wrote:код чем-то отличается от предыдущего ?
Чем то отличается. = вместо <= в некоторых местах, чтение из регистра не только по nCS & nRD но и по Clk. Что то еще может быть.
newold86 wrote:Думаю, что шина слишком шустрая для такого способа общения с ней...
Это как? Чем шина на пне отличается от шины не на пне?
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by DimkaM »

На всех диаграммах ISA, которые нагугливаются, data гарантированно присутствует на поседже nWR.

Вот к этой строчке
if (~nCS & ~nWR & Adr) Ctrl[2:0] = Dat[2:0];
Это тоже относится.

И к чтению, процессором, из СПИ это тоже относится. Процессор может читать(не уверен) на поседже nRD

Нужно цеплять логический анализатор не на СПИ, а на ISA
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

А нет, карта работает и на пне тоже. Опять тестирую закоротив MISO и MOSI. Цикл в 65535 прогонов в каждом цикл по 255 прогонов отрабатывает без ошибок. Значит что-то не так где-то в другом месте (драйвер).