Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Трабла с приемом данных в режиме Slave FIFO на чипе Cypress FX2LP
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
DiMonstr
Всем привет!
Весь мозг вынес мне этот контроллер!!! smile3046.gif
У меня следующая проблема. Мастером является FPGA.
Делаю девайс USB to SATA HDD. Драйвер хоста стандартный для Mass Storage Device.
Cypress преобразует SCSI команды в команды SATA и отправляет их в FPGA.
Из FPGA необходимо принимать пакеты с данными (сектора) по 512 байт и по завершению чтения всех секторов
принимать 20 байт ответа, но на хост ответ уходить не должен.
Никак не могу сделать корректный прием данных из FPGA и передать их драйверу на хост. Хоть убейся!!!
Если EP8 настроена на AUTOIN, то на хост приползают все пакеты из FPGA.
Реакции на INPKTEND = 0x88 - нет.
В общем так не канает.

Тогда настраиваю на прием пакетов из FPGA по EP8 в режиме MANUAL.
Код
    WRITEDELAY();
    EP8CFG = 0xE2;          // ep8 is valid BULK IN 512 double buffered
    WRITEDELAY();
    EP8FIFOCFG = 0x01;      // set EP8:  0x05=MANUAL, 0x09=AUTOIN
    
    WRITEDELAY();
    EP8AUTOINLENH = 0x02; // Auto-commit 512-byte packets
    WRITEDELAY();
    EP8AUTOINLENL = 0x00;


Прием реализовал так:

Код
    // для отладки читаем один сектор не зависимо от команды SCSI
    sectorcount = 1;
    while (sectorcount--)
    {
    // ждем, когда EP8 будет FULL
    while( !( EP68FIFOFLGS & 0x10 ) );

    // firmware commits EP8 packet
    INPKTEND = 0x08;

    while( !( EP68FIFOFLGS & 0x10 ) );
    // skip пакет, т.к. это 20 байт ответа
    INPKTEND = 0x88;
        }
    }

Работает не корректно. Да вообще творится черт знает что!!!
- сектор засасывается на хост несколькими частями
- когда приходит новая SCSI команда, то продолжаю передаваться куски предыдущего сектора
- а также передаются 20 байт, которым я сделал SKIP!

Могу выложить логи USB сниффера.

Я так подозреваю, что ожидание заполнения FIFO while( !( EP68FIFOFLGS & 0x10 ) ); не так работает.
По докам, этот флаг валидный, когда FPGA установила FIFOADR = "11".
А у меня выходит, когда FPGA отправила сектор в EP8, происходит переключение снова на EP4, т.е. чтение с хоста.

Как сделать правильно?
DiMonstr
Понедельник день тяжелый, я понимаю...

Наверно трудно будет с лёту вкурить, что я изложил, поэтому сформулирю вопрос так:
1. В EP8IN приходит первый пакет данных.
2. Перед передачей его хосту необходимо в начало пакета добавить заголовок.
3. Затем в хост передать заголовок+данные.

Как реализовать такой алгоритм в режиме ручного управления fifo?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.