Подниму тему...
Тут играюсь с асинхронным Slave Fifo (AUTOIN, на SLWR генератор 4 МГц) - столкнулся с интересным эффектом.
При чтении в хост с EP6 или EP8 все читается нормально (пакеты по 512 байт). Читаю в Borland C++ Builder с помощью BulkInEndPoint->XferData по 512 байт.
При использовании EP4 почему-то за один вызов читается только 2 байта (параметр len после вызова = 2), причем похоже на мусор (причем эти 2 байта повторяются помойму через раз от вызова к вызову). Аналогичный результат при чтении просто консолью Cypress.
С EP2 - вообще весело: в первый раз читается 512 байт, потом 2 байта, потом еще раз 2, потом уже 512 и далее нормально - как-то так.
Вот инициализация МК:
Код
void TD_Init(void) // Called once at startup
{
REVCTL = 0x03; // must set REVCTL.0 and REVCTL.1 to 1
SYNCDELAY;
EP2CFG = 0xE0; // Valid, IN, BULK, 512 byte, quad buf
SYNCDELAY;
EP4CFG = 0xE0; // Valid, IN, BULK, 512 byte, double buf (биты 0...3 не настраиваются)
SYNCDELAY;
EP6CFG = 0xE2; // Valid, IN, BULK, 512 byte, double buf
SYNCDELAY;
EP8CFG = 0xE0; // Valid, IN, BULK, 512 byte, double buf (биты 0...3 не настраиваются)
SYNCDELAY;
IFCONFIG = 0xCB;
SYNCDELAY;
EP2FIFOCFG = 0x09; // AUTOIN, 16 bit
SYNCDELAY;
EP4FIFOCFG = 0x09; // AUTOIN, 16 bit
SYNCDELAY;
EP6FIFOCFG = 0x09; // AUTOIN, 16 bit
SYNCDELAY;
EP8FIFOCFG = 0x09; // AUTOIN, 16 bit
SYNCDELAY;
FIFORESET = 0x80;
SYNCDELAY;
FIFORESET = 0x02;
SYNCDELAY;
FIFORESET = 0x04;
SYNCDELAY;
FIFORESET = 0x06;
SYNCDELAY;
FIFORESET = 0x08;
SYNCDELAY;
FIFORESET = 0x00;
SYNCDELAY;
}
В коде видно, что в EPxCFG пишу разные значения - хочу поиграться с буферированием (для EP4, EP8 значения по дефолту, т.к. в них это не настраивается).
Однако EP8 работает правильно, EP4 - нет, хотя настроены абсолютно одинаково...
Номер EP меняю в dscr.a51 (меняется в одной строчке) и перемычками на плате.
PKTEND пробовал и к земле, и к питанию привязывать...
P.S.: вопрос в догонку. Как добавить ендпоинтов в dscr.a51? Пробовал просто скопировать секцию для bulk EP ниже, изменить номер EP и увеличить счетчик ендпоинтов на 1. Но после ренумерации контроллер не определяется EZ Control Panel...
----------- далее автоматически скленный следующий пост ------------
Все, кажется разобрался...
Наверное я нарушил правила выбора конфигурации ендпоинтов из даташита.
Там одну из 12 выбрать можно, а моя конфигурация требовала 10*512 байт fifo памяти, хотя на чипе доступоно только 8*512
Возник правда новый вопрос. Допустим сконфигурировал я EP2 на 1024 байта, quad-buffered путем записи в EP2CFG (имею на это право по документации). Но это использует всю память, и EP4, 6, 8 я использовать не могу. Собственно как отказаться от других EP? Достаточно ли просто не писать их в dscr.a51? Просто в других EPxCFG поидее прописаны дефолтные значения... - не приведет ли это к тому, что память и под них будет выделяться? Не надо ли что-то еще делать, напрмер бит VALID = 0?
P.S.: рано радовался. Переписал инициализацию так:
EP2CFG = 0xE0; // Valid, IN, BULK, 512 byte, quad buf
SYNCDELAY;
EP6CFG = 0xE2; // Valid, IN, BULK, 512 byte, double buf
SYNCDELAY;
EP8CFG = 0xE0; // Valid, IN, BULK, 512 byte, double buf (биты 0...3 не настраиваются)
SYNCDELAY;
т.е. убрал EP4. Теперь EP2 с EP4 не должны конфликтовать. В даташите такой конфиг есть. Все равно EP2 глючит как и раньше - читает по 2 байта. Если сделать EP2 double-buffered, то не глючит...
Видимо это подтверждает еще раз мое предположение, что неиспользуемые ендпоинты (EP4) надо как-то отключать... (или дело вообще не в этом). Пробовал у EP4 ставить флаг VALID=0 и пробовал Type писать 00 (invalid) вместо дефолтного Bulk. Не помогло...
И остается все-таки вторая часть предыдущего вопроса - как добавлять ендпоинты в dscr.h (или что-то еще надо редактировать?)