|
|
  |
USB своими руками для sam7x256, или проблемы с которыми я столкнулся. |
|
|
|
Aug 29 2011, 12:05
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Доброе время суток, всезнающий All! Возвращаюсь к теме, так как своих мозгов уже не хватает: Устойство ожило и работает вполне коректно. Появилась следующая необходимость: гонять пакеты размерностью больше чем размер конечной точки... И тут затык. Влетаем по прерыванию в обработку приема конечной точки, считываем от дуда данные в количестве RXBYTECNT... сбрасываем флаг соответвующего банка, через который этот пакет влетел. Но его размер принятых данных равен максимальному размеру конечной точки... Ладно - делаем буферезацию и ждем следующего куска и... следующего прерывания не происходит  Может кто сталкивался с подобной проблемой, может у кого-то есть опыД в подобных вещах... В целом вопрос заключается в двух вопросах: 1. Как принять данные больше чем конечная точка? 2. Возникает ли рерывание, когда должен прилететь второй(третий, пятый) блок данных одного пакета данных?
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Aug 29 2011, 13:42
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(e0000 @ Aug 29 2011, 15:05)  В целом вопрос заключается в двух вопросах: 1. Как принять данные больше чем конечная точка? 2. Возникает ли рерывание, когда должен прилететь второй(третий, пятый) блок данных одного пакета данных? Не помню, хоть расстреляйте. Делал весной. деталей не помню. Есть проект - отлаженный и рабочий, для AT91SAM9XE512 (mass-storage). Посмотрите, как там сделано. Дать ? P.S. Насколько я помню, там с приходом каждого нового кусочка генерится прерывание, и по нему данные выбираются из буфера и добавляются к уже существующим. А вот как это выглядит в деталях ... см. выше
Сообщение отредактировал kovigor - Aug 29 2011, 13:44
|
|
|
|
|
Aug 29 2011, 14:47
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
в том-то и дело, что прерывание не возникает  Но если не сложно, то пришлите - гляну, может я что-то не так делаю... (мейл отправил в личку)
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Aug 29 2011, 17:42
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
- Очень прошу не распространять! умрет вместе со мной!
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Aug 31 2011, 05:29
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
А у меня наоборот проблема с отправкой пакета размером больше конечной точки  . А вот прием идет шустро) посылаю 1023 байта все за кадр приходят) Не забывайте что хост когда отправляет пакеты чередует данные DATA0 и DATA1 это разные прерывания RX_DATA_BK1 и RX_DATA_BK0 от одного источника (и разные буферы). мой кусок обработки прерывания: CODE //---Обработка прерываний от конечной точки------------------------------------- void USB_EP_INT() { switch ((AT91C_BASE_UDP -> UDP_CSR[POINT]) & UDP_CSR_STATUS) { case AT91C_UDP_RXSETUP: { send_byte(0xF1);//для отладки по RS-232 USB_READ_FIFO_EP((unsigned char *) pSetup_Packet, POINT);//переход на функцию сохранения байтов в память RXSETUP_CLEAR(POINT);//Сброс бита RXSetup (данные из буфера прочитал) switch ((pSetup_Packet -> bmRequestType) & USB_TYPE_REQUEST) { case USB_TYPE_STANDARD: { switch (pSetup_Packet -> bRequest) //че комп от меня хочет? { case GET_DESCRIPTOR: {USB_GET_DESCRIPTOR(); break;}//запрос дескриптора case SET_ADRESS: {USB_SET_ADRESS(); break;}//установка адреса case SET_CONFIGURATION: {USB_SET_CONFIGURATION(); break;} case CLEAR_FEATURE: {USB_CLEAR_FEATURE(); break;} default: {USB_STALL(); break;} //если запрос не известен то выход из оператора switch } break; } case USB_TYPE_CLASS: { switch (pSetup_Packet -> bRequest)//че комп от меня хочет? { case SET_LINE_CODING: {k = 1; break;} case GET_LINE_CODING: {pData[POINT] = (unsigned char *) pLine_Control; dLenght[POINT] = 7; USB_WRITE_FIFO_EP(POINT); break;} case SET_CONTROL_LINE_STATE: {ZERO_PACKET(); break;} default: {USB_STALL(); break;} //если запрос не известен то выход из оператора switch } break; } default: {USB_STALL(); break;} } break; } //------------------------------------------------------------------------------ case AT91C_UDP_TXCOMP: { send_byte(0xF2); TXCOMP_CLEAR(POINT);//сбрасываем бит TXCOMP if (pStatus[POINT]) { USB_WRITE_FIFO_EP(POINT); } break; } //------------------------------------------------------------------------------ case AT91C_UDP_ISOERROR: { send_byte(0xF3); STALL_CLEAR(POINT); FORCESTALL_CLEAR(POINT); break; } //------------------------------------------------------------------------------ case AT91C_UDP_RX_DATA_BK0: case AT91C_UDP_RX_DATA_BK1: { send_byte(0xF4); if (k) {k = 0; USB_READ_FIFO_EP((unsigned char *) pLine_Control, POINT); RX_DATA_BK_CLEAR(POINT); ZERO_PACKET();} else {USB_READ_FIFO_EP(DATA, POINT); RX_DATA_BK_CLEAR(POINT);} break; } default: break; } } //============================================================================== Этот обработчик написан для CDC конфигурации USB устройства (находится в стадии оптимизации). Проблемы с приемом не возникали, но... Возникали проблемы с открытием порта. Открывался некорректно! Подвисал програмки для работы с COM портом. Потом разобрался сейчас не вспомню в чем проблема была. Вспомнил в чем проблема. Проблема в корректной обработки запроса SET_LINE_CODING. Я с начала отправлял пустой пакет подтверждения после приема запроса, но потом оказалось пустой пакет надо отправлять после приема данных по запросу SET_LINE_CODING Код if (k) {k = 0; USB_READ_FIFO_EP((unsigned char *) pLine_Control, POINT); RX_DATA_BK_CLEAR(POINT); ZERO_PACKET();} При этом бит DIR контрольной точки менять не нужно...
Сообщение отредактировал IgorKossak - Aug 31 2011, 07:23
Причина редактирования: [codebox]
|
|
|
|
|
Aug 31 2011, 11:30
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Хм.... если у нас прилетает пакет равный размеру конечной точки, прилетит ли после этого нулевой пакет?
Сообщение отредактировал e0000 - Aug 31 2011, 11:32
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Sep 1 2011, 11:32
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
но у меня не прилетает "нулевой пакет" если я принимаю 64 байта  (размер конечной точки 64 байта)
Сообщение отредактировал e0000 - Sep 1 2011, 12:20
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Sep 2 2011, 05:39
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126

|
хотя в принципе в моем обработчике прерываний как то все равно придет или не придет нулевой байт) Вам этот нулевой байт сильно нужен?) Нулевой байт по идее в конце кадра должен приходить. Кадр 1 мс. В течении 1 мс можно принять 1023 байта для FS устройств. Вот нулевой байт по идее должен прийти если число байт в кадре кратно размеру конечной точки. Вот 1023 байта пакет. Нулевой не прилетит. А вот 960 байт по идее должен.
Сообщение отредактировал shrek - Sep 2 2011, 05:42
|
|
|
|
|
Sep 2 2011, 07:48
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Ситуация какова... Я не знаю сколько мне прилетит данных и вычисляю их по ходу в первом пакете Но если ко мне летит Обработчик следующий: Код void BulkOut (void) { U32 i; U8 temp;
BulkLen = USB_ReadEP(EP_OUT_L, &BulkBuf[0]); //смотрим длинну пакета
switch (BulkStage_OUT){ //проверяем на каком мы свете case BS_CBW: {Get_CMD(); break;} case BS_DATA_OUT: {GoonGet_CMD(); break;} } } так вот в состояние BS_DATA_OUT он не попадает, хотя длины пакетов вычисляются правильно - проверил дебагером
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Sep 8 2011, 14:01
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
Обнаружил следующее: 1. Если пакет меньше 64 байта - все ок! 2. Если пакет кратен 64 байта - все ok! 3. Если пакет не кратен 64 байта и при этом больше чем 64 (например 255 байт) то первые 3 по 64 прилетают и я их вижу, а последние 63 не прилетают..
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
Sep 12 2011, 09:34
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-04-09
Пользователь №: 48 029

|
при 65 принимаю только 64, а последний не вызывает прерывание...
--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|