Intel4004 2 1 апреля, 2019 Опубликовано 1 апреля, 2019 (изменено) · Жалоба Пишу CMSIS UDBD драйвер для ATSAM4E. Не могу найти источник глюка. SETUP пакет регулярно приходит с потерей байт. Причем размер пакета (RXBYTECNT в UDP_CSR[0]) правильный, 8 байт, но сам пакет считанный из FIFO сдвинут на один/два байта и дополнен мусором до 8 байт. Например должно прийти: 80 06 00 01 00 00 40 00 приходит: -- 06 00 01 00 00 40 00 dd должно прийти: 00 05 01 00 00 00 00 00 приходит: -- 05 01 00 00 00 00 00 eb должно прийти: 02 01 00 00 84 00 00 00 приходит: -- 01 00 00 84 00 00 00 06 или: -- -- 00 00 84 00 00 00 06 1d Глюк проявляется случайным образом примерно на одном пакете из десяти. Исходник проверил, вылизал и практически уверен, что проблема не в нем. Железяка пока в единственном экземпляре, т.ч. проверить на другой возможности нет. Никто с подобным не сталкивался? В чем может быть источник проблемы? UPD. Причем проблема только с SETUP пакетами. Когда дело доходит до CBW - то OUT транзакции с CBW пакетами проблем не имеют... UPD2. Нет, это я поторопился. bulk транзакции так-же корежатся: INQUIRY H TX 55 53 42 43 d0 1b bc 0d 24 00 00 00 80 00 06 12 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 D RX 55 53 42 43 d0 1b bc 0d 24 00 00 00 80 00 06 12 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 D TX 00 80 00 02 1f 00 00 00 4b 65 69 6c 20 20 20 20 44 69 73 6b 20 30 20 20 20 20 20 20 20 20 20 20 31 2e 30 20 H RX 00 80 00 02 1f 00 00 00 4b 65 69 6c 20 20 20 20 44 69 73 6b 20 30 20 20 20 20 20 20 20 20 20 20 31 2e 30 20 D TX 55 53 42 53 d0 1b bc 0d 00 00 00 00 00 H RX 55 53 42 53 d0 1b bc 0d 00 00 00 00 00 READ FORMAT CAPACITIES H TX 55 53 42 43 d0 6b b1 0d fc 00 00 00 80 00 0a 23 00 00 00 00 00 00 00 fc 00 00 00 00 00 00 00 D RX 55 53 42 43 d0 6b b1 0d fc 00 00 00 80 00 0a 23 00 00 00 00 00 00 00 fc 00 00 00 00 00 00 00 D TX -- 00 00 00 08 00 ee 20 00 02 00 02 00 H RX 00 00 00 00 08 00 ee 20 00 02 00 02 00 D TX 55 53 42 53 d0 6b b1 0d f0 00 00 00 00 H RX 55 53 42 53 d0 6b b1 0d f0 00 00 00 00 INQUIRY H TX 55 53 42 43 d0 6b b1 0d ff 00 00 00 80 00 06 12 01 80 00 ff 00 00 00 00 00 00 00 00 00 00 00 D RX -- -- 42 43 d0 6b b1 0d ff 00 00 00 80 00 06 12 01 80 00 ff 00 00 00 00 00 00 00 00 00 00 00 62 f3 Изменено 1 апреля, 2019 пользователем Intel4004 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 2 апреля, 2019 Опубликовано 2 апреля, 2019 · Жалоба Проверить примеры самого Атмела на своей железке? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 2 2 апреля, 2019 Опубликовано 2 апреля, 2019 · Жалоба 1 hour ago, Kabdim said: Проверить примеры самого Атмела на своей железке? А их нет. Когда атмел был еще атмелом - примеры были на каждый чих, как он стал микрочипом - примеры исчезли как класс. Есть Atmel Studio и Atmel Software Framework (ASF), на них можно собрать что-то вроде примера, с минимальным написанием собственного кода - но с ними еще разбираться надо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 2 апреля, 2019 Опубликовано 2 апреля, 2019 · Жалоба 2 hours ago, Intel4004 said: А их нет. Когда атмел был еще атмелом - примеры были на каждый чих, как он стал микрочипом - примеры исчезли как класс. Есть Atmel Studio и Atmel Software Framework (ASF), на них можно собрать что-то вроде примера, с минимальным написанием собственного кода - но с ними еще разбираться надо... Насколько я помню ASF входит в сотстав Atmel Studio, и даже вроде обновляется. На ATSAM4S нормально работал MS из ASF. А вот на M7 ASF был кривой, приходилось atmel start использовать. Скорее всего вы с прерываниями, кешем или частотой ядра намудрили. Ерату-то читали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 2 2 апреля, 2019 Опубликовано 2 апреля, 2019 · Жалоба Собрал по быстрому MSC пример в Atmel Studio. Оказалось достаточно просто... Он работает! С теми-же настройками PMC, на тех-же частотах. Железо в порядке. Прошелся по обоим проектам от начала и до прихода первого SETUP пакета. Ничем не отличаются (я на ASF и поглядывал, когда писал). Те-же самые записи, в те-же регистры, в том-же порядке. У них работает, у меня пакет регулярно приходит битым. Поставил брейкпоинт в обоих проектах на прерывание SETUP(когда все уже давно отконфигурировано) и сравнил настройки кеша, EFC, PMC. Привел в соответствие, теперь они идентичны. У прерывания UDP - самый высокий приоритет, но на всякий случай завернул все функции в запретить/восстановить. Даже понатыкал __DMB() где надо и где не надо. Пофигу. Ничего не помогает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 2 апреля, 2019 Опубликовано 2 апреля, 2019 · Жалоба А не читает ли параллельно FIFO еще кто-нибудь? Тот же отладчик, например? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 2 2 апреля, 2019 Опубликовано 2 апреля, 2019 · Жалоба 4 minutes ago, aaarrr said: А не читает ли параллельно FIFO еще кто-нибудь? Тот же отладчик, например? МамаМиа! Деру себя за волосы! Выдернул JLink, ребутнул железяку. ОНО РАБОТАЕТ!!! Поехал водку пить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 2 апреля, 2019 Опубликовано 2 апреля, 2019 · Жалоба #ВырвиJTAG Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 2 апреля, 2019 Опубликовано 2 апреля, 2019 · Жалоба 11 minutes ago, Intel4004 said: Поехал водку пить... Однажды будучи сильно нетрезвым написал драйвер I2C. На следующий день посмотрел свежим взглядом - хорош получился! Может быть и у вас получится понять в этом состоянии, почему JTAG сильно влияет на USB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 2 2 апреля, 2019 Опубликовано 2 апреля, 2019 (изменено) · Жалоба Такого в моей практике еще не было. Больше недели трахался с абсолютно рабочим исходником. Кстати, как оказалось бит DTGLE вполне можно использовать для определения какой банк сбрасывать (RX_DATA_BK0 или RX_DATA_BK1). status = UDP->UDP_CSR[ep_num]; ... if ((status & (UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1)) != (UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1)) status &= UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1; else { if (status & UDP_CSR_DTGLE) status = UDP_CSR_RX_DATA_BK1; else status = UDP_CSR_RX_DATA_BK0; } UDP_CSR_CLEAR(ep_num, status); Интересно, почему во всех фреймворках используют не DTGLE, а программный флаг, полностью эмулирующий поведение DTGLE? Кстати, кейловский CMSIS MSC оказался не таким тормозным как я ожидал. С SD-флешкой 600Kb/s на запись, 750Kb/s на чтение. Изменено 2 апреля, 2019 пользователем Intel4004 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 3 апреля, 2019 Опубликовано 3 апреля, 2019 · Жалоба 9 часов назад, Intel4004 сказал: почему во всех фреймворках используют не DTGLE, а программный флаг, полностью эмулирующий поведение DTGLE Он может быть закеширован, а чтение из регистра переферии - нет. 18 часов назад, Intel4004 сказал: МамаМиа! Деру себя за волосы! Почему у вас атмелоский пример работал тогда? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Intel4004 2 3 апреля, 2019 Опубликовано 3 апреля, 2019 · Жалоба 3 hours ago, Kabdim said: Почему у вас атмелоский пример работал тогда? Я же UDP отлаживал, соответственно у меня открыто окно с регистрами UDP (Peripherals->System Viewer->UDP). И галочка "periodic update" стоит. Вот он и портил FIFO. Достаточно убрать галочку или закрыть окошко с регистрами - все нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться