nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 27 Apr 2024 06:03



Reply to topic  [ 198 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6 ... 14  Next
ISA-8 SD-контроллер (SPI) на CPLD 
Author Message
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Любая sd-карта инитится на 7мгц(клок спи), клок схемы 14мгц
В z-контроллере никогда не было пониженной частоты.


03 Dec 2017 12:54
Profile ICQ
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Tronix wrote:
Спасибо всем за подсказки, взял этот код, как основной: http://zx-pk.ru/threads/27418-rabota-s- ... post901946 Действительно без проблем лезет в epm3032.

Частоту хочу взять с OSC 14,31818 МГц. Убрал из кода управление зеленым светодиодом, чтобы добавить еще один бит в делитель, сократив Ctrl[3:0] до Ctrl[2:0]. Итого 14,31818 МГц должен делится на 32 для low speed и на 2 для high speed.

При делении на два, возможно, надо будет поправить верилог.

На zx-pk верилог рассчитан на Clk много больший(мгц) чем SCK. Так как всё засинхрино на подъёме Clk.
Времянки могут не сойтись.
Поэтому(возможно) нужно разделить исходник на две части, одна на поседже Clk, вторая на негедже Clk

П.С. ЕПМ3064 и ЕПМ3128 тоже толерантны к 5в


03 Dec 2017 22:59
Profile ICQ
Devil

Joined: 06 Oct 2006 03:17
Posts: 859
Location: г.Лянтор,Сургутского р-на,ХМАО
Reply with quote
Посмотрел спецификацию на SD интерфейс "SanDisk Secure Digital Card". Там частота инициализации и обычной работы с SD картой должны быть соответственно: 0,1...0,4 и до 25 МГц.


04 Dec 2017 03:19
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Не работает :P

Просто посылка десяти байт от 1 до 10:

Attachment:
xtsd.png
xtsd.png [ 13.33 KiB | Viewed 5033 times ]


Ради интереса пробовал писать в порт управления числа от 0 до 7 и тут же читать обратно из порта управления по кругу 65000 раз. Без ошибок. Что записал, то и считал.

_________________
https://t.me/tronix_blog


04 Dec 2017 11:43
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
.


04 Dec 2017 11:46
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Tronix wrote:
Не работает :P

Просто посылка десяти байт от 1 до 10:

Attachment:
xtsd.png


Ради интереса пробовал писать в порт управления числа от 0 до 7 и тут же читать обратно из порта управления по кругу 65000 раз. Без ошибок. Что записал, то и считал.

Картинку не видно.
Что конкретно не работает?


04 Dec 2017 22:55
Profile ICQ
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22599
Location: Silicon Valley
Reply with quote
Вложения пока не доехали - едут...

_________________
:dj: https://mastodon.social/@Shaos


04 Dec 2017 22:58
Profile WWW
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
DimkaM wrote:
Что конкретно не работает?


Воспользовался советом Lavr, прикрепил картинку к форуму... Мда. У меня картинка тоже дома осталась, подождем пока "доедут" вложения.

Там с лог анализатора картинка SPI - передача 10 байт, от 0x01 до 0x0A. Так вот, передалось успешно байта 4, у всех остальных вместо данных - 0xFF. То есть там примерно так: 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x05 и тд. При этом на каждый байт клок генерится...

_________________
https://t.me/tronix_blog


04 Dec 2017 23:11
Profile
Doomed

Joined: 12 Feb 2016 13:39
Posts: 463
Reply with quote
может скорость тактирования или слишком высокая или наоборот слишком низкая? в плисах там же синхронные сигналы бегают, и импулься 'слипаются'?


05 Dec 2017 01:30
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Скорость тактирования 14,431818 МГц

_________________
https://t.me/tronix_blog


05 Dec 2017 02:16
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
К сожалению, пока проблема слишком общая, плюс код на Verilog'е, который я читаю медленно и со словарем :(, поэтому на данном этапе особо помочь не могу...


05 Dec 2017 02:32
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Конкретно сейчас такой код:

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 [4: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) ?
                    (Adr) ? {~nINS,BUSY,3'h0,Ctrl[2:0]} : Data[7:0]
                    : 8'hZZ;
// Синхронная логика
always @(posedge Clk) begin
    // Делитель частоты
    Pre[4:0] <= Pre[4:0] + 5'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[4] & Pre[3] & 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

_________________
https://t.me/tronix_blog


Last edited by Tronix on 06 Dec 2017 10:44, edited 1 time in total.



05 Dec 2017 02:34
Profile
Doomed

Joined: 12 Feb 2016 13:39
Posts: 463
Reply with quote
а не здесь ли собака порылась? - в конце этого кода стоит условие, если передача не завершена, то новое ничего не записывать, так вот ПО 'извне' накидало в SPI порт байты не контроллируя признак занятости, вот и получили пропуски...когда передача одного байта завершилась, новый байт принимается и передается, а если нет, то пропуск.
Можно ли между байтами при передаче паузы сделать 'хорошие'?


05 Dec 2017 03:48
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
Естественно, можно с умным видом рассказать о метастабильности, так как внешние асинхронные сигналы приходят внутрь без синхронизаторов. Но, если честно, вряд ли это может проявляться часто...

1. Такое поведение стабильно, или каждый раз теряются разные байты ?
2. Изменится ли картина, если между посылками байтов вставить паузу, заведомо бОльшую, чем время на передачу байта ?


05 Dec 2017 03:51
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
PVV wrote:
Можно ли между байтами при передаче паузы сделать 'хорошие'?

Как одинаково мыслим :)


05 Dec 2017 03:51
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 198 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6 ... 14  Next

Who is online

Users browsing this forum: No registered users and 40 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.