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

Проблема с отправкой USB дискриптора

lpc2468. Достоверно известно, что USB работает

Инициализировал USBD1 интерфейс чётко по мануалу. Использовал переработанные кейловские функции. Кстати, кейловский пример USBMem для lpc24xx не работает вообще.

Картина такая (номер пункта соответствует порядковому номеру прерывания):
1. Приходит reset. Я полагаю, что ничего здесь делать пока не надо и не делаю.
2. Приходитят данные пакета "0х8006000100004000". Пытаюсь отправить первые 8 байтов дескриптора, через slave mode регистры. При опросе регистра USBDevIntSt бит ERR_INT не устанавливается.
При запросе кода ошибки SIE показывает 0х19, что соответствует "send/received NAK". Обе нулевые конечные точки при запросе их статуса показывают 0х00.

Далее прерывания начинают чередоваться, сначала 1, потом 2, потом снова 1, потом 2 и, наконец, я вижу, что хаб наказал моему устройству перейти в suspend mode, что говорит о том, что дескриптор  отправлен не был.

Так вот вопросы: "Поднимал ли кто-то USB без кейловских библиотек? Сталкивались ли с чем-то таким? С чем это может быть связано?"

Из странного: биты RXENDPKT и TXENDPKT регистра USBDevIntSt не устанавливаются, что при передаче, что при приёме. Хотя в даташите написано, что должны.

Если что-то забыл упомянуть - спросите

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

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


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

1 час назад, VladislavS сказал:

А почему 8 байт дескриптора, когда хост просит 64?

Потому что это первый обмен пакетами, хост еще не в курсе какая у нулевой конечной точки максимальная длина поля данных пакета. Надо передать минимально возможное количество данных, т. е. 8 байт, насколько я понял(да и, вроде бы, в дескрипторе устройства больше 18 байт быть не может, по протоколу). Потом от хоста должен последовать пакет SET_ADDRESS (но я не в курсе обрабатывает его SIE или программа мк) и вот уже после должен быть пакет с похожим содержанием, только с нормальной, для запроса дескриптора, длинной IN пакета - 18 байт, Таким образом пакет будет выглядел вот так "0х8006000100001200" , но я такого пакета еще не видел.

 

Впрочем, я и 18 и 64 байт отправлял. Результат тот же

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

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


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

48 минут назад, doeslo сказал:

Потому что это первый обмен пакетами, хост еще не в курсе какая у нулевой конечной точки максимальная длина поля данных пакета. Надо передать минимально возможное количество данных, т. е. 8 байт, насколько я понял(да и, вроде бы, в дескрипторе устройства больше 18 байт быть не может, по протоколу). Потом от хоста должен последовать пакет SET_ADDRESS (но я не в курсе обрабатывает его SIE или программа мк) и вот уже после должен быть пакет с похожим содержанием, только с нормальной, для запроса дескриптора, длинной IN пакета - 18 байт, Таким образом пакет будет выглядел вот так "0х8006000100001200" , но я такого пакета еще не видел.

 

Впрочем, я и 18 и 64 байт отправлял. Результат тот же

 

Неправильно понимаете.

Первый раз хост, действительно, не знает размер буфера ваше EP0 и просит вас передать не более 64 байт, по первым 8 байтам дескриптора он определит размер буфера вашей EP0. В ответ вы должны выбрать минимальное из трех значений (запрошенные 64 байта, размер буфера EP0, размер дескриптора 18 байт) и ровно столько отправить. К примеру если размер буфера EP0 равен 16 байтам - то и отправлять нужно 16, а если размер буфера EP0 64 байта - то отправлять нужно 18 байт.

В ответ хост должен прислать RESET, затем повторно запрос дескриптора и только потом назначить адрес.

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

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


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

3 часа назад, doeslo сказал:

Так вот вопросы: "Поднимал ли кто-то USB без кейловских библиотек? Сталкивались ли с чем-то таким? С чем это может быть связано?"

Поднимали. Давным-давно на похожем МК (LPC23xx). USB-device. За основу тогда брал примеры идущие с IAR. Всё работало нормально.

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


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

19 минут назад, nibelung сказал:

Неправильно понимаете.

Первый раз хост, действительно, не знает размер буфера ваше EP0 и просит вас передать не более 64 байт, по первым 8 байтам дескриптора он определит размер буфера вашей EP0. В ответ вы должны выбрать минимальное из трех значений (запрошенные 64 байта, размер буфера EP0, размер дескриптора 18 байт) и ровно столько отправить. К примеру если размер буфера EP0 равен 16 байтам - то и отправлять нужно 16, а если размер буфера EP0 64 байта - то отправлять нужно 18 байт.

В ответ хост должен прислать RESET, затем повторно запрос дескриптора и только потом назначить адрес.

 

Хм. Таким образом, если у меня максимальный размер буффера 8 байт, то отсылаю я сначала 8, жду ресета и уже после этого ко мне должен прийти "0х8006000100001200", на который я отвечу 18 байтами, а потом SET_ADDRESS?

 

18 минут назад, jcxz сказал:

Поднимали. Давным-давно на похожем МК (LPC23xx). USB-device. За основу тогда брал примеры идущие с IAR. Всё работало нормально.

Спасибо за наводку. Завтра гляну

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

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


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

9 минут назад, doeslo сказал:

Хм. Таким образом, если у меня максимальный размер буффера 8 байт, то отсылаю я сначала 8, жду ресета и уже после этого ко мне должен прийти "0х8006000100001200", на который я отвечу 18 байтами, а потом SET_ADDRESS?

 

Ну да. Только отвечать нужно будет 8 байт, затем, когда хост их заберет еще 8 байт и потом еще 2 байта. Только я не уверен что на lpc24xx нужно делать именно так. Я поднимал USB на stm32f103, а там данные нужно самостоятельно на блоки в размер буфер конечной точки разбивать.

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


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

1 минуту назад, nibelung сказал:

Ну да. Только отвечать нужно будет 8 байт, затем, когда хост их заберет еще 8 байт и потом еще 2 байта. Только я не уверен что на lpc24xx нужно делать именно так. Я поднимал USB на stm32f103, а там данные нужно самостоятельно на блоки в размер буфер конечной точки разбивать.

Здесь, вроде бы, так же. Не подумал об этом, на самом деле. Может в этом была ошибка. Но почему биты RXENDPKT и TXENDPKT не устанавливаются - загадка...

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


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

Нет, проблема осталась. У меня вообще не идут прерывания от tx контрольной точки, которая сигнализировала бы о том, что данные переданы. Вместо этого у меня происходят описанные в шапке прерывания, а в статусе конечной точки высвечивается, что буфер полон, хотя я только что считал из него данные (я даже пробовал несколько раз данные считывать в одном прерывании, что странно, результат тот же и флаги статуса такие же), в этом же прерывании при запросе кода ошибки от SIE возвращается "send/received NAK". Что очень странно. Ничего не понимаю.

 

Буду смотреть что там в IAR

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


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

Я полагаю, что проблема была в огромном количестве посылок в UART в течении USB-прерывания. Так делать нельзя

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


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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...