Jump to content

    
Sign in to follow this  
Intel4004

USBD. Битые пакеты...

Recommended Posts

Пишу 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

 

Edited by Intel4004

Share this post


Link to post
Share on other sites
1 hour ago, Kabdim said:

Проверить примеры самого Атмела на своей железке?

А их нет. Когда атмел был еще атмелом - примеры были на каждый чих, как он стал микрочипом - примеры исчезли как класс.

Есть Atmel Studio и Atmel Software Framework (ASF), на них можно собрать что-то вроде примера, с минимальным написанием собственного кода - но с ними еще разбираться надо...

Share this post


Link to post
Share on other sites
2 hours ago, Intel4004 said:

А их нет. Когда атмел был еще атмелом - примеры были на каждый чих, как он стал микрочипом - примеры исчезли как класс.

Есть Atmel Studio и Atmel Software Framework (ASF), на них можно собрать что-то вроде примера, с минимальным написанием собственного кода - но с ними еще разбираться надо...

Насколько я помню ASF входит в сотстав Atmel Studio, и даже вроде обновляется.

На ATSAM4S нормально работал MS из ASF.

 

А вот на M7 ASF был кривой, приходилось atmel start  использовать.

 

Скорее всего вы с прерываниями, кешем или частотой ядра намудрили. Ерату-то читали?

Share this post


Link to post
Share on other sites

Собрал по быстрому MSC пример в Atmel Studio. Оказалось достаточно просто...

Он работает! С теми-же настройками PMC, на тех-же частотах. Железо в порядке.

Прошелся по обоим проектам от начала и до прихода первого SETUP пакета. Ничем не отличаются (я на ASF и поглядывал, когда писал). Те-же самые записи, в те-же регистры, в том-же порядке.

У них работает, у меня пакет регулярно приходит битым.

Поставил брейкпоинт в обоих проектах на прерывание SETUP(когда все уже давно отконфигурировано) и сравнил настройки кеша, EFC, PMC. Привел в соответствие, теперь они идентичны.

У прерывания UDP - самый высокий приоритет, но на всякий случай завернул все функции в запретить/восстановить.

Даже понатыкал __DMB() где надо и где не надо.

Пофигу. Ничего не помогает.

Share this post


Link to post
Share on other sites
4 minutes ago, aaarrr said:

А не читает ли параллельно FIFO еще кто-нибудь? Тот же отладчик, например?

МамаМиа! Деру себя за волосы!

Выдернул JLink, ребутнул железяку. ОНО РАБОТАЕТ!!!

Поехал водку пить...

Share this post


Link to post
Share on other sites
11 minutes ago, Intel4004 said:

Поехал водку пить...

Однажды будучи сильно нетрезвым написал драйвер I2C. На следующий день посмотрел свежим взглядом - хорош получился! Может быть и у вас получится понять в этом состоянии, почему JTAG сильно влияет на USB:air_kiss:

Share this post


Link to post
Share on other sites

Такого в моей практике еще не было. Больше недели трахался с абсолютно рабочим исходником.

Кстати, как оказалось бит 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 на чтение.

Edited by Intel4004

Share this post


Link to post
Share on other sites
9 часов назад, Intel4004 сказал:

почему во всех фреймворках используют не DTGLE, а программный флаг, полностью эмулирующий поведение DTGLE

Он может быть закеширован, а чтение из регистра переферии - нет.

18 часов назад, Intel4004 сказал:

МамаМиа! Деру себя за волосы!

Почему у вас атмелоский пример работал тогда?

Share this post


Link to post
Share on other sites
3 hours ago, Kabdim said:

Почему у вас атмелоский пример работал тогда?

Я же UDP отлаживал, соответственно у меня открыто окно с регистрами UDP (Peripherals->System Viewer->UDP). И галочка "periodic update" стоит. Вот он и портил FIFO. Достаточно убрать галочку или закрыть окошко с регистрами - все нормально.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this