реклама на сайте
подробности

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> USB своими руками для sam7x256, или проблемы с которыми я столкнулся.
e0000
сообщение Aug 29 2011, 12:05
Сообщение #46


Участник
*

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



Доброе время суток, всезнающий All!
Возвращаюсь к теме, так как своих мозгов уже не хватает:
Устойство ожило и работает вполне коректно.
Появилась следующая необходимость: гонять пакеты размерностью больше чем размер конечной точки...
И тут затык.
Влетаем по прерыванию в обработку приема конечной точки, считываем от дуда данные в количестве RXBYTECNT...
сбрасываем флаг соответвующего банка, через который этот пакет влетел. Но его размер принятых данных равен максимальному размеру конечной точки...
Ладно - делаем буферезацию и ждем следующего куска и... следующего прерывания не происходит sad.gif
Может кто сталкивался с подобной проблемой, может у кого-то есть опыД в подобных вещах...

В целом вопрос заключается в двух вопросах:
1. Как принять данные больше чем конечная точка?
2. Возникает ли рерывание, когда должен прилететь второй(третий, пятый) блок данных одного пакета данных?


--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 29 2011, 13:42
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
e0000
сообщение Aug 29 2011, 14:47
Сообщение #48


Участник
*

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



в том-то и дело, что прерывание не возникает sad.gif

Но если не сложно, то пришлите - гляну, может я что-то не так делаю...
(мейл отправил в личку)


--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 29 2011, 14:58
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(e0000 @ Aug 29 2011, 17:47) *
Но если не сложно, то пришлите - гляну, может я что-то не так делаю...
(мейл отправил в личку)


Отправил. Очень прошу не распространять !
Go to the top of the page
 
+Quote Post
e0000
сообщение Aug 29 2011, 17:42
Сообщение #50


Участник
*

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



- Очень прошу не распространять!
умрет вместе со мной!


--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
Go to the top of the page
 
+Quote Post
shrek
сообщение Aug 31 2011, 05:29
Сообщение #51


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



А у меня наоборот проблема с отправкой пакета размером больше конечной точки rolleyes.gif.
А вот прием идет шустро) посылаю 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]
Go to the top of the page
 
+Quote Post
e0000
сообщение Aug 31 2011, 11:30
Сообщение #52


Участник
*

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



Хм....
если у нас прилетает пакет равный размеру конечной точки, прилетит ли после этого нулевой пакет?

Сообщение отредактировал e0000 - Aug 31 2011, 11:32


--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
Go to the top of the page
 
+Quote Post
shrek
сообщение Sep 1 2011, 05:54
Сообщение #53


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



нулевой по идее прилетит последним в кадре если размер пакета кратен конечной точке. Так жеж и с отправкой. Если отправляешь пакет кратный размеру конечной точки то последним надо отправлять пустой байт. Вот в принципе поэтому 1023 байта можно отправить через bulk точку, чтобы не отправлять нулевой байт (видать не хватает времени устройству чтобы отправить все за кадр).
Go to the top of the page
 
+Quote Post
e0000
сообщение Sep 1 2011, 11:32
Сообщение #54


Участник
*

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



но у меня не прилетает "нулевой пакет" если я принимаю 64 байта sad.gif
(размер конечной точки 64 байта)

Сообщение отредактировал e0000 - Sep 1 2011, 12:20


--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
Go to the top of the page
 
+Quote Post
shrek
сообщение Sep 2 2011, 05:39
Сообщение #55


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



хотя в принципе в моем обработчике прерываний как то все равно придет или не придет нулевой байт) rolleyes.gif
Вам этот нулевой байт сильно нужен?)
Нулевой байт по идее в конце кадра должен приходить. Кадр 1 мс. В течении 1 мс можно принять 1023 байта для FS устройств. Вот нулевой байт по идее должен прийти если число байт в кадре кратно размеру конечной точки. Вот 1023 байта пакет. Нулевой не прилетит. А вот 960 байт по идее должен.

Сообщение отредактировал shrek - Sep 2 2011, 05:42
Go to the top of the page
 
+Quote Post
e0000
сообщение Sep 2 2011, 07:48
Сообщение #56


Участник
*

Группа: Участник
Сообщений: 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 он не попадает, хотя длины пакетов вычисляются правильно - проверил дебагером


--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
Go to the top of the page
 
+Quote Post
shrek
сообщение Sep 6 2011, 11:47
Сообщение #57


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Вообще для того чтобы узнать сколько байт прилетело к какой-то конечной точке достаточно прочитать поле RXBYTECNT регистра UDP_CSRx. Я обычно это поле читаю перед тем как прочитать данные из буфера. А перед этим смотрятся флаги которые вызвали прерывание.
За что отвечает BulkStage_OUT?
Go to the top of the page
 
+Quote Post
e0000
сообщение Sep 8 2011, 14:01
Сообщение #58


Участник
*

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



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


--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
Go to the top of the page
 
+Quote Post
shrek
сообщение Sep 9 2011, 11:32
Сообщение #59


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



а если 65 байт?)
у некоторых программ для работы с com портом (тест типа netweak) могут быть ограничения в размере буфера...

Если 65 байт или например 129 принимает то в принципе то ваше устройство работоспособно)))
Go to the top of the page
 
+Quote Post
e0000
сообщение Sep 12 2011, 09:34
Сообщение #60


Участник
*

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



при 65 принимаю только 64, а последний не вызывает прерывание...


--------------------
Уважающая себя схема, как уважающая себя женщина, никогда с первого раза не даст того, что от нее хотят. (с) мое
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016