Перейти к содержанию
    

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

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

 

Изменено пользователем Intel4004

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Kabdim said:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Intel4004 said:

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

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

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, aaarrr said:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, Intel4004 said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Изменено пользователем Intel4004

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Kabdim said:

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...