|
Код получения прерывания от RXSETUP на SAM7S |
|
|
|
Nov 30 2009, 12:10
|
Частый гость
 
Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494

|
Вот функция конфигурирования конечной точки. Для нулевой точки пишу size = 8. CODE //------------------------------------------------------------------------------ /// Конфигурирование конечной точки //------------------------------------------------------------------------------ static void ConfigureEndpoint(const int EndpointNum) { unsigned char Type; unsigned char EndpointDir; if (EndpointNum == 0) { Endpoint[EndpointNum].size=8; Type= 0; EndpointDir = 0; } else { //Other Endpoints }
//Настройка регистра UDP_ CSRx [x = EndpointNumber] SET_CSR(EndpointNum, (unsigned int)AT91C_UDP_EPEDS | (Type << 8) | (EndpointDir << 10)); Endpoint[EndpointNum].state = UDP_ENDPOINT_IDLE; if (Type == 0) //Если точка контрольная, то разрешить прерывание EPxINT [x = EndpointNumber] { AT91C_BASE_UDP->UDP_IER = (1 << EndpointNum); } } Макросы действительно большие, но атмеловский код работает, а мой нет. Вот и пытаюсь приближать. Как только получится результат, я перепишу весь код заново попроще  А это: Код if (count!=0){return;} count++; Для того, чтобы прошел только один RXSETUP...
Причина редактирования: Уменьшение видимого размера цитаты исходника.
|
|
|
|
|
Dec 1 2009, 12:37
|
Частый гость
 
Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494

|
Уважаемый aaarrr, изучил тему с Вашим участием. Посмотрел пример Protossa. Сравнил со своим. Ну все так же. Но так и не отправляет последние два байта дескриптора, хотя почему-то происходит запрос SET_ADDRESS. Не могли бы Вы заглянуть в мой проект, может и я банально затупил где-нибудь. Знаю, что тратите свое время. Буду очень благодарен.
ARM_USB.rar ( 335.65 килобайт )
Кол-во скачиваний: 106
|
|
|
|
|
Dec 1 2009, 14:14
|
Частый гость
 
Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494

|
Ага спасибо. Процесс дошел до получения дескриптора конфигурации. В нем есть поле wTotalLength - общий объем данных (в байтах) возвращаемый для данной конфигурации. Это поле равно: Код sizeof(USBConfigurationDescriptor)+sizeof(USBInterfaceDescriptor) Или нет?
|
|
|
|
|
Dec 2 2009, 15:11
|
Частый гость
 
Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494

|
2aaarrr Ок. Устройство распознается windows как неизвестное. Немного не понимаю процесс конфигурирования. После запроса GET_CONFIGURATION отправляется дескриптор конфигурации в котором есть общая длина данных для передачи, включая, как Вы и сказали, длину дескриптора конфигурации, дескриптора интерфейса и двух точек. Также а дескрипторе конфигурации говорится, что данная конфигурация имеет один интерфейс. После отправки дескриптора конфигурации мне нужно ждать GET_INTERFACE_DESCRIPTOR? Или уже начинается работа драйвера для моего устройства? И в какой момент времени должен отправляться дескриптор первой точки, а когда второй.  Спасибо за Вашу помощь.
|
|
|
|
|
Dec 9 2009, 15:59
|
Частый гость
 
Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494

|
Добрый день. Продолжаю свою эпопею. Собрал в DriverStudio драйвер под свой девайс. Драйвер ставится, но выдает код 10 (невозможно запустить устройство). В микроконтроллере приходит SET_CONFIGURATION с номером конфигурации 0. Видимо дело в драйвере. У отсылаю такой общий дескриптор: CODE const DriverConfigurationDescriptors driverConfigurationDescriptor = { { sizeof(USBConfigurationDescriptor), USBGenericDescriptor_CONFIGURATION, sizeof(DriverConfigurationDescriptors), 0, // No interface in this configuration 1, // This is configuration #1 0, // No string descriptor for this configuration 0, USBConfigurationDescriptor_POWER(100) }, { sizeof(USBInterfaceDescriptor), USBGenericDescriptor_INTERFACE, 0, // This is interface #0 0, // This is setting #0 for interface 2, // Interface has 2 endpoint 0, // No interface class code 0, // No interface subclass code 0, // No interface protocol code 0, // No string descriptor }, { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, (((0 & 0x01) << 7) | (1 & 0xF)), 2, 0x01, 0x00 // Does not apply to Bulk endpoints }, // Bulk-IN endpoint descriptor { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, (((1 & 0x01) << 7) | (2 & 0xF)), 2, 0x01, 0x00 // Does not apply to Bulk endpoints } } ;
То есть хочу две точки, на вход и на выход. Точки настроил так: CODE //------------------------------------------------------------------------------ /// Конфигурирование конечной точки //------------------------------------------------------------------------------ static void ConfigureEndpoint0(void) { const int EndpointNum = 0; AT91C_BASE_UDP->UDP_RSTEP = AT91C_UDP_EP0; AT91C_BASE_UDP->UDP_RSTEP = 0; Endpoint[EndpointNum].size=8; SET_CSR(0,(unsigned int)AT91C_UDP_EPEDS | (0 << 8) | (0 << 7)); AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN; AT91C_BASE_UDP->UDP_IER = (1 << EndpointNum); }
//------------------------------------------------------------------------------ /// Конфигурирование конечной точки //------------------------------------------------------------------------------ static void ConfigureEndpoint1(void) { const int EndpointNum = 1; AT91C_BASE_UDP->UDP_RSTEP = AT91C_UDP_EP1; AT91C_BASE_UDP->UDP_RSTEP = 0; Endpoint[EndpointNum].size=64; SET_CSR(1,(unsigned int)AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_OUT | (1<<7)); AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN; }
//------------------------------------------------------------------------------ /// Конфигурирование конечной точки //------------------------------------------------------------------------------ static void ConfigureEndpoint2(void) { const int EndpointNum = 2; AT91C_BASE_UDP->UDP_RSTEP = AT91C_UDP_EP2; AT91C_BASE_UDP->UDP_RSTEP = 0; Endpoint[EndpointNum].size=64; SET_CSR(1,(unsigned int)AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_IN | (0<<7)); AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN; }
Из за чего вообще такое может происходить? Укажите направление раскопок  PS Раскопал. В конфигурационном дескрипторе сказал, что для данной конфигурации нет интерфейса....
Сообщение отредактировал Shaienn - Dec 9 2009, 16:02
|
|
|
|
|
Jan 9 2010, 15:37
|
Частый гость
 
Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494

|
Добрый день. После небольшой паузы возвращаюсь к этой задаче. Используя WinDriver собрал драйвер для устройства и сейчас пытаюсь отправить что-то с микроконтроллера в windows. написал следующую функцию: Код unsigned char Send64BytePacket(unsigned char EndpointNum, const void *pData) { unsigned int Length; //Подготовка данных if((AT91C_BASE_UDP->UDP_CSR[EndpointNum] & AT91C_UDP_TXPKTRDY)==0) { Length = sizeof(pData); if (Length%Endpoint[EndpointNum].size == 0) { Endpoint[EndpointNum].options = SEND_ZERO_LENGTH_PKT; } Endpoint[EndpointNum].remaining = Length; Endpoint[EndpointNum].pData = (void *)pData; //Процесс передачи while(Endpoint[EndpointNum].remaining!=0) { unsigned int status = AT91C_BASE_UDP->UDP_CSR[EndpointNum];
if ((status & AT91C_UDP_TXPKTRDY) == 0) { if (Endpoint[EndpointNum].remaining != 0) //Не все данные переданы { USB_WriteFIFO(EndpointNum); CLEAR_CSR(EndpointNum,AT91C_UDP_TXCOMP); } else { if (Endpoint[EndpointNum].options == SEND_ZERO_LENGTH_PKT) { LED_Toggle(0); USB_PrepareTransfer(EndpointNum,0,0); Endpoint[EndpointNum].options =0; } CLEAR_CSR(EndpointNum,AT91C_UDP_TXCOMP); } }
} } return 1; } В сниффере WinDriver`a ничего не вижу, в связи с этим пара вопросов: а) В результате начальных действий устройство стоит в сконфигурированном состоянии. Чтобы мне начать пересылку, мне нужно записать данные в FIFO и выставить флаг TXPKTRDY? Т.е. микроконтроллер начинает пересылку с момента появление флага TXPKTRDY в соответствующем UDP_CSR? б) Посмотрите пожалуйста на дескриптор конечной точки на передачу к хосту: Код { sizeof(USBEndpointDescriptor), USBGenericDescriptor_ENDPOINT, (((0 & 0x01) << 7) | (2 & 0xF)), 2, 0x40, 0x00 // Does not apply to Bulk endpoints } и на инициализацию этой конечной точки: Код static void ConfigureEndpoint1(void) { const int EndpointNum = 1; AT91C_BASE_UDP->UDP_RSTEP = AT91C_UDP_EP1; AT91C_BASE_UDP->UDP_RSTEP = 0; Endpoint[EndpointNum].size=64; SET_CSR(1,(unsigned int)AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_BULK_OUT); AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN; } Не напортачил ли я где? Заранее спасибо
|
|
|
|
|
Jan 9 2010, 15:54
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Shaienn @ Jan 9 2010, 18:37)  а) В результате начальных действий устройство стоит в сконфигурированном состоянии. Чтобы мне начать пересылку, мне нужно записать данные в FIFO и выставить флаг TXPKTRDY? Т.е. микроконтроллер начинает пересылку с момента появление флага TXPKTRDY в соответствующем UDP_CSR? Да. Цитата(Shaienn @ Jan 9 2010, 18:37)  б) Посмотрите пожалуйста на дескриптор конечной точки на передачу к хосту: Это дескриптор OUT-точки, т.е. от хоста к устройству. Цитата(Shaienn @ Jan 9 2010, 18:37)  и на инициализацию этой конечной точки: Здесь та же ошибка, кроме того как-то странно записывать в этой процедуре UDP_FADDR. Цитата(Shaienn @ Jan 9 2010, 18:37)  Не напортачил ли я где? Вот, например: Код Length = sizeof(pData); Length будет всегда равна 4-м.
|
|
|
|
|
Jan 11 2010, 04:23
|
Частый гость
 
Группа: Участник
Сообщений: 103
Регистрация: 21-06-09
Пользователь №: 50 494

|
Добрый день. Написал такой тестовый код: Код unsigned char Send64BytePacket(unsigned char EndpointNum, const void *pData) { char code,*data; signed int d; signed int size; d = 0x1f044a; size = sizeof(d); data = (void *)&d; while(AT91C_BASE_UDP->UDP_CSR[EndpointNum]&AT91C_UDP_TXPKTRDY); while (size--) { AT91C_BASE_UDP->UDP_FDR[EndpointNum] = *data; data++; } SET_CSR(EndpointNum,AT91C_UDP_TXPKTRDY);
return 1; Почему я передаю 0x001f044a, а принимаю зеркальное 0x4a041f00? Это особенность USB или мой косяк? Спасибо.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|