|
10 страниц
1 2 3 > »
|
 |
Ответов
(1 - 99)
|
Jul 13 2011, 15:51
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 26-11-05
Пользователь №: 11 420

|
Вновь поднимаю тему. Пример-то заработал. Но тянуть к себе в проект дикий фреймворк из-за одного эндпоинта для HID совсем не хочется. Стал разбираться в регистрах по даташиту и примеру. Инициализацию вроде-бы сделал. Получаю USBRST, ENUMDNE, потом получаю запрос GET_DEVICE_DESCRIPTOR. И тут-то все начинается. Настраиваю DIEPTSIZ0, DIEPCTL0 . Помещаю в фифо данные. Получаю прерывание на IN endpoint XFRCM. Вроде все ОК. Но HOST этого дескриптора не видит. В результате, вместо SET_ADDRESS опять получаю GET_DEVICE_DESCRIPTOR и все по кругу. Так раз 5 и HOST прекращает енумерацию.
Уже два дня голову ломаю. Может кто-нибудь сталкивался? Подскажите, в какую сторону посмотреть.
|
|
|
|
|
Sep 9 2012, 11:41
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
Ровно та же проблема, как и в последнем сообщении. XFRCM прерывание получаю, от компа на дескриптор ноль реакции. Дескриптор заведомо рабочий, взят из проекта, который делал на МК другого производителя. Пробовал делать как строго по даташиту, так и переставлять всё, что только возможно - не работает. Если автор решил проблему - хотелось бы узнать как
|
|
|
|
|
Sep 9 2012, 15:07
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(V_M_Luck @ Jul 13 2011, 19:51)  ...Подскажите, в какую сторону посмотреть... Попробуте все ваши дискрипторы вставить в заведомо рабочий проект, пусть даже с "толстым" фреймворком. Далее можно просто записать все, что отправляется/принимается хостом (соот. прогой) и сравнивать уже с логами уже своего проекта. Наверняка, будет в чем-то разница, оттуда и копать
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Sep 9 2012, 16:10
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
В моём случае, дескриптор взят из заведомо рабочего проекта, но под другой МК (ARM от атмела, ATSAM3S). Там я писал полностью сам, без библиотек, так что в протоколе USB немного понимаю (как мне кажется). Решил пересесть на STM, и вот такой затык. Цитата Далее можно просто записать все, что отправляется/принимается хостом (соот. прогой) К сожалению, не всё. Я пробовал SniffUSB, но он начинает запись только после корректного опознания устройства, тоесть абсолютно бесполезен в моём случае. Мой текущий дескриптор девайса выглядит так (как я уже сказал, он заведомо рабочий): Код static char device_descriptor[18]={ /* Standard USB device descriptor for the CDC serial driver */ sizeof(device_descriptor), // size 1, // USBGenericDescriptor_DEVICE 0x00,0x02, // USBDeviceDescriptor_USB2_00 2, // CDCDeviceDescriptor_CLASS 0, // CDCDeviceDescriptor_SUBCLASS 0, // CDCDeviceDescriptor_PROTOCOL 64, // BOARD_USB_ENDPOINTS_MAXPACKETSIZE 0xEB,0x03, // CDCDSerialDriverDescriptors_VENDORID 0x24,0x61, // CDCDSerialDriverDescriptors_PRODUCTID 0x10,0x01, // CDCDSerialDriverDescriptors_RELEASE 1, // Index of manufacturer description //0 2, // Index of product description //0 3, // Index of serial number description //0 1, // One possible configuration }; (остальные не привожу, т.к. до них вообще дело не доходит) Что происходит на заведомо рабочей плате с SAM3S: 1. usb сброс 2. приходит setup пакет с запросом дескриптора девайса 3. МК отправляет дескриптор (18 байт) 4. usb сброс 5. приходит фрейм, назначающий адрес usb устройству 6. и т.д. Что происходит с STM32F4: не работает. 1. usb сброс 2. приходит setup пакет с запросом дескриптора девайса 3. МК отправляет дескриптор (18 байт) 4. а дальше тишина, и через 3 секунды переходим к п.1 Приблизительный код для стм32 (упрощено до безобразия в целях отладки): Код volatile uint32_t * fifo=(uint32_t *)(OTG_FS_DFIFO0_BASE); OTG_FS->DIEPTSIZ0=(1<<19)|18; // PKTCNT; XFRSIZ OTG_FS->DIEPCTL0=(1<<31)|(1<<26); // EPENA; CNAK *fifo=0x02000112; *fifo=0x40000002; *fifo=0x612403EB; *fifo=0x02010110; *fifo=0x00000103; Работу с FIFO предполагаю, на основе того, что чтение работает таким образом: Код volatile uint32_t * fifo=(uint32_t *)OTG_FS_DFIFO0_BASE; int i=0; for(i=0;i<BCNT;i+=4){ int data=*fifo; rbuf[i+0]=(data>>0)&0xFF; rbuf[i+1]=(data>>8)&0xFF; rbuf[i+2]=(data>>16)&0xFF; rbuf[i+3]=(data>>24)&0xFF; pprintf("< %02X%02X%02X%02X", rbuf[i+0], rbuf[i+1], rbuf[i+2], rbuf[i+3]); } Исходя из даташита, я делаю правильно. 1. DIEPTSIZ0 должен устанавливаться до того, как поставлю EPENA в DIEPCTL0 Цитата The application must modify this register before enabling endpoint 0. Once endpoint 0 is enabled using the endpoint enable bit in the device control endpoint 0 control registers (EPENA in OTG_FS_DIEPCTL0), the core modifies this register. The application can only read this register 2. EPENA в DIEPCTL0 должен устанавливаться до того, как начну писать данные в FIFO. Цитата 1. Program the OTG_FS_DIEPCTLx register with the endpoint characteristics and set the CNAK and EPENA bits. 2. Write the data to be transmitted in the next frame to the transmit FIFO. Цитата 1. The application must set the transfer size and packet count fields in the endpointspecific registers and enable the endpoint to transmit the data. 2. The application must also write the required data to the transmit FIFO for the endpoint. Однако, я пробовал и другой порядок действий, безрезультатно.
|
|
|
|
|
Sep 9 2012, 22:19
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
Вот же однако... Заработало! Плюс вам в карму, если б она тут была  А я CNAK только один раз при инициализации ставил, и думал оно так и будет... Интересно, а когда "по правилам" его надо ставить? "после обработки setup" это когда 1. закончил приём setup запроса 2. только записал ответ на setup в FIFO 3. когда отправка моего ответа уже завершена (сейчас я поставил от балды)
|
|
|
|
|
Sep 17 2012, 00:32
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
Пытаюсь реализовать CDC девайс. Что получилось: 1. Приём от компа к девайсу - без проблем, любое количество данных. 2. Отправка от девайса к компу - отправляется только первый пакет. Дальше ничего не шлётся. Что я мог упустить? Код void hwtx(){ volatile uint32_t * fifo=(uint32_t *)OTG_FS_DFIFO2_BASE; int i; int len=12; char data[]={"Hello world\n"}; pprintf("1. FIFO: %i words free", OTG_FS->DTXFSTS2&0xFFFF); OTG_FS->DIEPTSIZ2=(1<<19)|(len<<0); // PKTCNT; XFRSIZ OTG_FS->DIEPCTL2|=(1UL<<31)|(1<<26); // EPENA; CNAK for(i=0;i<len;i+=4){ *fifo=((data[i+0]&0xFF)<<0)|((data[i+1]&0xFF)<<8)|((data[i+2]&0xFF)<<16)|((data[i+3]&0xFF)<<24); } pprintf("2. FIFO: %i words free", OTG_FS->DTXFSTS2&0xFFFF); } попытка 1, строка приходит 1. FIFO: 64 words free 2. FIFO: 61 words free IRQ: SOF IRQ: EP2 IN XFRC (Transfer completed) попытка 2: 1. FIFO: 64 words free 2. FIFO: 61 words free попытка 3: 1. FIFO: 61 words free 2. FIFO: 58 words free тоесть далее просто забивается FIFO, а отправка не идёт...
Сообщение отредактировал SviMik - Sep 17 2012, 00:35
|
|
|
|
|
Sep 18 2012, 00:11
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
Вомзжно, я что-то не так понял с FIFO буфферами. Если верить даташиту, размер буффера указывается в word, т.е. по 4 байта. Текущая инициализация FIFO выглядит так: Код OTG_FS->GRXFSIZ=64; // RX FIFO = x words OTG_FS->DIEPTXF0=(128<<16) | 64; // TX FIFO 0 = x words; start=x OTG_FS->DIEPTXF1=(64<<16) | 192; // TX FIFO 1 = x words; start=x OTG_FS->DIEPTXF2=(64<<16) | 256; // TX FIFO 2 = x words; start=x Это конфигурация, при которой девайс нормально инициализируется. При попытке уменьшить приёмный буффер, инициализация уже не проходит. Хотя 64 cлова (256 байт) явно избыточно для SETUP пакетов. Инициализация эндпоинтов: Код /* CDC endpoints: 0:control, 1:bulk out, 2:bulk in, 3:int in */ /* OUT */ OTG_FS->DOEPCTL0=(1<<26)|(1<<15)|(0<<0); // CNAK; active endpoint; Maximum packet size=64; OTG_FS->DOEPCTL1=(1<<26)|(2<<18)|(1<<15)|(64<<0); // CNAK; Endpoint type; active endpoint; Maximum packet size; /* IN */ OTG_FS->DIEPCTL0=(0<<22)|(1<<15)|(0<<0); // TxFIFO number; active endpoint; Maximum packet size=64; OTG_FS->DIEPCTL2=(2<<22)|(2<<18)|(1<<15)|(64<<0); // TxFIFO number; Endpoint type; active endpoint; Maximum packet size;
|
|
|
|
|
Sep 18 2012, 10:49
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(SviMik @ Sep 18 2012, 04:11)  Это конфигурация, при которой девайс нормально инициализируется. receive fifo шареный. Он не только для setup-пакетов используется. Плюсом, не забываете DIEPTXFx offset сдвигать при уменьшении GRXFSIZ? Еще чтение мануалов рулит: 10 locations must be reserved in the receive FIFO to receive SETUP packets on control endpoint. The core does not use these locations, which are reserved for SETUP packets, to write any other data. One location is to be allocated for Global OUT NAK. Status information is written to the FIFO along with each received packet. Therefore, a minimum space of (Largest Packet Size / 4) + 1 must be allocated to receive packets. If multiple isochronous endpoints are enabled, then at least two (Largest Packet Size / 4) + 1 spaces must be allocated to receive back-to-back packets. Typically, two (Largest Packet Size / 4) + 1 spaces are recommended so that when the previous packet is being transferred to the CPU, the USB can receive the subsequent packet. От себя добавлю, что рекомендация two (Largest Packet Size / 4) + 1 исходит из того, что, пока мы один буфер из FIFO забираем, железо уже принимает второй.
Сообщение отредактировал MBR - Sep 18 2012, 10:54
|
|
|
|
|
Sep 18 2012, 13:48
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
Хорошо. Тоесть моя конфигурация выше впринципе правильная, и должна работать? Но почему же с отправкой у меня проблемы... При этом, в нулевой эндпоинт отправлять дескрипторы проблем нет, а отправить данные в второй эндпоинт - проходит только первый пакет и всё. Возможно, с bulk эндпоинтами как-то иначе поступать надо? А документация уже утомила своими ляпами... В таблице одно, в тексте другое... Доходит до того, что в таблице бит подписан Reserved, а ниже в тексте даётся его нормальное описание. Или в таблице "r", а в описании сказано, что в него писать надо. IN и OUT тоже путают, приходится логически до всего доходить. Даже ссылки неправильные. кликаю в оглавлении на DIEPTSIZx, попадаю на DOEPTSIZx... такой вот тест на внимательность  Извиняюсь, накипело...
|
|
|
|
|
Sep 18 2012, 14:05
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(SviMik @ Sep 18 2012, 17:48)  При этом, в нулевой эндпоинт отправлять дескрипторы проблем нет, а отправить данные в второй эндпоинт - проходит только первый пакет и всё. Возможно, с bulk эндпоинтами как-то иначе поступать надо? А XFRC не забываете сбрасывать после приема пакета?
|
|
|
|
|
Sep 18 2012, 14:27
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
Всмысле флаг прерывания? Да, как и все остальные прерывания, сбрасываю. Код }else if(OTG_FS->DAINT&(1<<2)){ // IEPINT on EP 2 //print("- DAINT_IRQ: EP2 IN"); if(OTG_FS->DIEPINT2&(1<<0)){ // Data IN transaction completed OTG_FS->DIEPINT2=(1<<0); pprintf("EP_IRQ(IN): EP2 XFRC"); }else if(OTG_FS->DIEPINT2&(1<<1)){ // Endpoint disabled interrupt OTG_FS->DIEPINT2=(1<<1); pprintf("EP_IRQ(IN): EP2 EPDISD"); }else if(OTG_FS->DIEPINT2&(1<<3)){ // Timeout condition mask OTG_FS->DIEPINT2=(1<<3); pprintf("EP_IRQ(IN): EP2 TOC"); }else if(OTG_FS->DIEPINT2&(1<<4)){ // IN token received when TxFIFO is empty OTG_FS->DIEPINT2=(1<<4); pprintf("EP_IRQ(IN): EP2 ITTXFE"); }else if(OTG_FS->DIEPINT2&(1<<6)){ // IN endpoint NAK effective OTG_FS->DIEPINT2=(1<<6); pprintf("EP_IRQ(IN): EP2 INEPNE"); }else if(OTG_FS->DIEPINT2&(1<<7)){ // Transmit FIFO empty OTG_FS->DIEPINT2=(1<<7); pprintf("EP_IRQ(IN): EP2 TXFE"); }else{ pprintf("EP_IRQ(IN): EP2 %i", OTG_FS->DIEPINT2); } }
|
|
|
|
|
Sep 18 2012, 15:11
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
Всмысле? Функция hwtx() выше, вызываю её вручную, по команде в UART консоль. Код while(1){ if((USART3->SR & USART_SR_RXNE)){ // data received char c=USART3->DR; //... if(c=='3'){hwtx();} }
|
|
|
|
|
Sep 18 2012, 22:30
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
Кажется, чего-то я в этой жизни не понимаю  Из девайса в комп через второй эндпоинт отправляется только один пакет, после чего этот эндпоинт наглухо виснет. Пробовал: 1. Сбрасывать FIFO через регистр GRSTCTL. Как выборочно, так и все. 2. Отключать-включать эндпоинт, ставить CNAK 3. Сбрасывать весь регистр DIEPCTL2 в ноль, и заново конфигурировать 4. Плясать с бубном Идеи закончились. После успешной отправки "Hello world" на комп, второй раз отправить не удаётся. Только перетыкание кабеля срабатывает.
|
|
|
|
|
Sep 19 2012, 15:01
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
(Назначение hwtx - слать Hello World. Исключительно для дебага, поэтому упрощена до безобразия) Скорее всего, я упустил что-то важное, но не могу понять что  Для общения через нулевой эндпоинт используется тот же алгоритм, и он работает. Разница только в типах эндпоинтов (control и bulk). И вот с bulk что-то не выходит. Код void hwtx(){ volatile uint32_t * fifo=(uint32_t *)OTG_FS_DFIFO2_BASE; int i; int len=12; char data[]={"Hello world\n"}; pprintf("1. FIFO: %i words free", OTG_FS->DTXFSTS2&0xFFFF); OTG_FS->DIEPTSIZ2=(1<<19)|(len<<0); // PKTCNT; XFRSIZ OTG_FS->DIEPCTL2|=(1UL<<31)|(1<<26); // EPENA; CNAK for(i=0;i<len;i+=4){ *fifo=((data[i+0]&0xFF)<<0)|((data[i+1]&0xFF)<<8)|((data[i+2]&0xFF)<<16)|((data[i+3]&0xFF)<<24); } pprintf("2. FIFO: %i words free", OTG_FS->DTXFSTS2&0xFFFF); }
Сообщение отредактировал SviMik - Sep 19 2012, 15:05
|
|
|
|
|
Sep 22 2012, 22:15
|
Группа: Участник
Сообщений: 11
Регистрация: 9-09-12
Пользователь №: 73 458

|
Я сдаюсь  Можете выложить какой-нибудь минимальный рабочий пример с USB? Или может я выложу свой проект целиком?
|
|
|
|
|
Mar 16 2015, 09:49
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Подниму древнюю тему.
STM32F107, родной стек из Cube напугал множеством лишних телодвижений. Почти 20 К кода за виртуальный COM мне кажется многовато. Пишу свой, запнулся на элементарном - не отсылаются данные (дескриптор). Получаю setup запрос на device descriptor размером 8 байт. Проверяю наличие места в FIFO (DTXFSTS0), там 0x40 слов. Прописываю в DIEPTSIZ0 количество пакетов (PKTCNT) = 1 и размер посылки (XFRSIZ) = 8. Прописываю в FIFO два слова. После записи каждого слова наблюдаю уменьшение на 1 содержимого DTXFSTS0. После записи обоих слов XFRSIZ становится равным нулю, а DTXFSTS0, соответственно, 0x3E. Запускаю обмен (одновременно выставляю CNAK и EPENA в DIEPCTL0). Попадаю в прерывание XFRC, то есть ядро думает, что пакет отправило. При этом PKTCNT становится равен нулю. Но комп посланного дескриптора не видит, а свободное место в FIFO увеличивается всего на одно слово (DTXFSTS0 становится равным 0x3F). Как будто ядро вместо восьми байтов отсылает не более четырех. Родной пример из Cube работает, и если никто не подскажет - буду вставлять отладочный вывод в пример Cube. Но, мало ли, кто-то знает что ему не нравится? Такое ощущение, что ядро при передаче неправильно воспринимает записанный в XFRSIZ размер, но он уменьшается до нуля именно в момент записи в FIFO последнего слова, четко в соотвествии с руководством пользователя. В общем уже третий вечер перечитываю руководство, хожу по шагам по своей программе и по примеру из Cube, вроде все делаю так же, а каменный цветок не выходит хоть тресни. Отсылка пакета нулевого размера (ZLP) после установки адреса проходит нормально.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 17 2015, 23:10
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Сергей Борщ @ Mar 16 2015, 11:49)  Но комп посланного дескриптора не видит, а свободное место в FIFO увеличивается всего на одно слово (DTXFSTS0 становится равным 0x3F). Как будто ядро вместо восьми байтов отсылает не более четырех. Разобрался. Нужно сначала запускать передачу установкой CNAK и EPENA, а уже потом запихивать данные в FIFO. Надо внимательнее читать документацию: Цитата Using one of the above mentioned methods, when the application determines that there is enough space to write a transmit packet, the application must first write into the endpoint control register, before writing the data into the data FIFO.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 7 2015, 09:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Ещё разик подниму тему. На эти грабли: https://my.st.com/public/STe2ecommunities/m...rrentviews=1592 никто не наступал? Прикрутил библиотеку libopencm3, сделал из неё HID. Обмен - по нулевому endpoint'у блоками в 32 байта. setup-пакеты ходят нормально, а от data out пропадают первые 4 байта. Странный костыль в библиотеке - добавить тысячу NOP'ов перед считыванием - не помогает. Да и выглядит он некрасиво...
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Apr 8 2015, 13:57
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-09-08
Пользователь №: 40 477

|
Цитата(esaulenka @ Apr 7 2015, 12:57)  Ещё разик подниму тему. На эти грабли: https://my.st.com/public/STe2ecommunities/m...rrentviews=1592 никто не наступал? Прикрутил библиотеку libopencm3, сделал из неё HID. Обмен - по нулевому endpoint'у блоками в 32 байта. setup-пакеты ходят нормально, а от data out пропадают первые 4 байта. Странный костыль в библиотеке - добавить тысячу NOP'ов перед считыванием - не помогает. Да и выглядит он некрасиво... Попробуйте стандартную от st - у меня вполне нормально завелась как CustomHID. Использовал STM32_USB-Host-Device_Lib_V2.1.0 на проце stm32f105, плюс FreeRtos. Делал CAN-USB сниффер - сливать дампы FMS j1939 с грузовиков. На стресс тестах правда пропускной способности USB не хватает - ограничение HID, но не хочется отказываться от использования дефолтных драйверов в windows. И я надеюсь что в реальных условиях такого потока не будет.  Правда на текущий момент есть два "нюанса": 1) Не работает на одном из ноутбуков у сотрудника - устройство обнаруживается, но данные в программу от устройства не поступают. Вполне возможно что проблемы не в либе - ноутбук этот ремонтный. Так же возможно проблема в компоненте HID для lazarus, который я использую в программе на большом брате. Все руки не доходят разобраться. 2) Несколько раз были замечены случаи переподключения устройства - внешне проявляется как будто устройство отключили и сразу подключили. Опять же склоняюсь к мысли, что это не из-за либы. Скорее всего это ошибки в моей реализации остального функционала - похоже что попадаю в HardFault и перегружаюсь по WDT. Проявляется этот глюк крайне редко - пока пытаюсь поймать. libopencm3 мельком смотрел - смутила необходимость в цикличном выполнении функции usbd_poll. В библиотеке от st все callback'и из OTG_FS_IRQHandler дергаются.
|
|
|
|
|
Apr 14 2015, 10:58
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Рекомендацию библиотеки ST спасибо. Знать, что оно таки работоспособно, это хорошо :-) Допилил этот CustomHID из крайней версии CubeMX (он там сломаный, просто куда-то потеряли кусок кода). Да, действительно, работает. Да, действительно, данные не теряет. При сравнении CubeMX и libopencm3 была обнаружена интересная особенность. Как известно, эндпоинт после завершения обмена становится неактивным, и его надо постоянно включать. Авторы libopencm3 делают это при первой же возможности (для OUT-транзакции - сразу после вычитывания из FIFO), а в "родной" библиотеке - после многочисленных действий (обработать пакет, подумать, какой будет следующим, какого он размера...). В итоге, в в libopencm3 в один фрейм попадает и SETUP с указанием "а сейчас будет SET REPORT" и собственно данные этого report'а. Точнее, не все данные, а сдвинутые на 4 байта (и дополненные мусором в конце). Подробности - с фоточками осциллографа (пардон за качество. флешки, которую он поймёт, под рукой нету..) и состоянием регистра прерываний, здесь (кликнуть по картинке, там две страницы). Если по приему setup пакета ничего не делать и не разрешать обратно эндпоинт в течении 1 мс, всё начинает работать корректно. Но меееедленно. Собственно, вопрос: 1) я правильно понимаю, что спецификация USB 2.0 Full Speed не запрещает посылать setup и out в один эндпоинт за один фрейм? 2) у кого-нибудь на этом FS OTG использовал возможность использовать несколько транзакций в одном фрейме? Цитата(johnshadow @ Apr 8 2015, 16:57)  2) Несколько раз были замечены случаи переподключения устройства - внешне проявляется как будто устройство отключили и сразу подключили. Опять же склоняюсь к мысли, что это не из-за либы. Скорее всего это ошибки в моей реализации остального функционала - похоже что попадаю в HardFault и перегружаюсь по WDT. Проявляется этот глюк крайне редко - пока пытаюсь поймать. Возможно, это какие-то "электрические" проблемы. Если рядом есть грузовик, надо рассчитывать, что в любой момент с неожиданной стороны придёт помеха. Цитата(johnshadow @ Apr 8 2015, 16:57)  libopencm3 мельком смотрел - смутила необходимость в цикличном выполнении функции usbd_poll. В библиотеке от st все callback'и из OTG_FS_IRQHandler дергаются. Не понимаю, почему так сделали, но там уже почти всё готово для оборачивания этого poll() в прерывание. Собственно, эта часть заработала почти сразу. Дальше - аналогично, штатными callback'оми (правда, тут они динамические - через указатели).
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Sep 22 2015, 12:52
|
Участник

Группа: Участник
Сообщений: 18
Регистрация: 17-06-14
Пользователь №: 81 969

|
Может подскажет кто: В соответствии с вот этой штукой: http://blogs.msdn.com/b/usbcoreblog/archiv...e-a-device.aspxдохожу до п.6, отправляю дескриптор, и хост меня ресетит. Вероятно туплю с фазой статуса контрольной передачи. STM32F429 Вопрос - мы получаем от хоста токен OUT и нулевой пакет данных. Чтобы ответить мы должны сделать так: DIEPTSIZ0 |= 0x00080000; DIEPCTL0 |= (USB_OTG_DIEPCTL_CNAK|USB_OTG_DIEPCTL_EPENA); Или нет? Или где в RM прочитать?
|
|
|
|
|
Oct 25 2015, 13:07
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(prottoss @ Oct 25 2015, 15:30)  Данные вроде отправляются, судя по количеству прерываний (п. 4) но хост ресетит девай после отправки двух пакетов и далее все по новой. Хост сначала запрашивает 8 байт дескриптора устройства, поэтому фраза "количество прерываний" несколько настораживает. Можете рассказать подробнее, что и в какой последовательности происходит? Цитата(prottoss @ Oct 25 2015, 15:30)  Вопрос - нужно ли, в обработчике OTG_FS_GINTSTS_RXFLVL вычитывать данные (что я не делаю)сразу или можно дожидаться прихода прерывания от OUT точки с флагом OTG_FS_DOEPINTx_STUP? Я ориентировался по полю PKTSTS регистра OTG_FS_GRXSTSP - чтение по "SETUP data packet received", обработка по "SETUP transaction completed".
|
|
|
|
|
Oct 25 2015, 13:37
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(aaarrr @ Oct 25 2015, 19:07)  Хост сначала запрашивает 8 байт дескриптора устройства, поэтому фраза "количество прерываний" несколько настораживает. Можете рассказать подробнее, что и в какой последовательности происходит? Не совсем так по поводу запроса дескриптора устройства. Хост не может запрашивать 8 байт. Он запрашивает намного больше. Но после отправки первых 8 байт (для Windows) должен сделать USB Reset. За тем, по новой, запрос дескриптора устройства, если все в порядке, установка адреса и за тем уже все прочее. У меня вот такой порядок прерываний (флаги OTG_FS): 1. OTG_FS_GINTSTS_USBRST /* USB device bus reset */ 2. OTG_FS_GINTSTS_ENUMDNE /* Enumeration done */ 3. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ 4. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ 5. OTG_FS_GINTSTS_USBRST /* USB device bus reset */ 6. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ 7. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ 8. OTG_FS_GINTSTS_OEPINT /* EP OUT event */ 8.1. OTG_FS_DOEPINTx_STUP/* Setup Phase Done (control EPs) */ - Здесь обрабатывам запрос и разрешаем прерывание TX FIFO empty */ 9. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ 10. OTG_FS_GINTSTS_IEPINT /* EP IN event */ 10.1 OTG_FS_DIEPINTx_TXFE /* IN endpoint FIFO empty */ - Здесь отправляем данные хосту - дескриптор устройтсва, первые 8 байт */ 11. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ - Не понял че такое??? 10. OTG_FS_GINTSTS_IEPINT /* EP IN event */ -ага! данные улетели. Наверное... 12. OTG_FS_GINTSTS_OEPINT /* EP OUT event */ - вы че творите??? 12.1. 8.1. OTG_FS_DOEPINTx_STUP/* Setup Phase Done (control EPs) */ - Это че за запрос??? В поле bRequest = 0 */ Потом куча прерываний OTG_FS_GINTSTS_RXFLVL. Потом сброс шины. Потом все по новой Отредактировал В каждом прерывании нужный флаг закрывается - пишется единица в соответствующий бит/регистр
--------------------
|
|
|
|
|
Oct 25 2015, 13:46
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(prottoss @ Oct 25 2015, 16:29)  Хост не может запрашивать 8 байт. Как это не может? Может, запрашивает, и сбасывает шину при попытке передать больше, например. Цитата(prottoss @ Oct 25 2015, 16:29)  У меня вот такой порядок прерываний (флаги OTG_FS): Подозрительно уже начиная с п.5, какой промежуток времени проходит между пп.4-5?
|
|
|
|
|
Oct 25 2015, 14:17
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(aaarrr @ Oct 25 2015, 19:46)  Как это не может? Может, запрашивает, и сбасывает шину при попытке передать больше, например. Не может запрашивать меньше байт чем размер Device Descriptor. Обычно запрашивает 256 байт. Но после приема первой посылки отрубает. Т.е. отправил первые 8 байт (если ЕР0 размер равен 8 байт). Получаешь событие, что отправлены 8 байт. Далее приходит BusReset. Цитата(aaarrr @ Oct 25 2015, 19:46)  Подозрительно уже начиная с п.5, какой промежуток времени проходит между пп.4-5? Да. Подозрительно. 1. OTG_FS_GINTSTS_USBRST /* USB device bus reset */ time = 559 2. OTG_FS_GINTSTS_ENUMDNE /* Enumeration done */ time = 569 3. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ time = 596 4. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ time = 596 5. OTG_FS_GINTSTS_USBRST /* USB device bus reset */ time = 6564 Время в миллисекундах от старта МК. Вопрос мой такой - я должен вычитывать OUT FIFO сразу при приходе OTG_FS_GINTSTS_RXFLVL? Моя программа при приходе этого прерывания просто считывает вершину OTG_FS_GRXSTSP. Ждет прерывание SETUP и там уже обрабатывает пакет. Но после обработки и отправки ответа начинается какая то каша... ПРи том что OTG_FS_GINTSTS_RXFLVL сыплется постоянно хотя я квитирую это прерывание.
--------------------
|
|
|
|
|
Oct 25 2015, 15:18
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(prottoss @ Oct 25 2015, 17:17)  Не может запрашивать меньше байт чем размер Device Descriptor. Может. Цитата(prottoss @ Oct 25 2015, 17:17)  4. OTG_FS_GINTSTS_RXFLVL /* Receive FIFO non-empty */ time = 596 5. OTG_FS_GINTSTS_USBRST /* USB device bus reset */ time = 6564 Тут хост явно чего-то безуспешно ждет. Странно только, что так долго. Цитата(prottoss @ Oct 25 2015, 17:17)  Вопрос мой такой - я должен вычитывать OUT FIFO сразу при приходе OTG_FS_GINTSTS_RXFLVL? Моя программа при приходе этого прерывания просто считывает вершину OTG_FS_GRXSTSP. Ждет прерывание SETUP и там уже обрабатывает пакет. Выше уже ответил.
|
|
|
|
|
Oct 25 2015, 15:44
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(aaarrr @ Oct 25 2015, 21:37)  Нет, нужно просто прочитать OTG_FS_GRXSTSP. хм... ну я так и делаю - толку нет. Происходит то что сказал выше. 1.Читаю GRXSTSP. 2. Жду STUP от OUT EP. 3.Разрешаю IN FIFIO empty. 4. по приходу п.3 отправляю данные.
--------------------
|
|
|
|
|
Oct 25 2015, 16:50
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(aaarrr @ Oct 25 2015, 22:26)  Не знаю, но факт в том, что точно можно обойтись без него. Интересно: Bits 20:17PKTSTS:Packet status Indicates the status of the received packet 0001: Global OUT NAK (triggers an interrupt) 0010: OUT data packet received 0011: OUT transfer completed (triggers an interrupt) 0100: SETUP transaction completed (triggers an interrupt) 0110: SETUP data packet received Others: Reserved А что тогда означает фраза "triggers an interrupt"?
--------------------
|
|
|
|
|
Oct 25 2015, 17:25
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(prottoss @ Oct 25 2015, 19:50)  А что тогда означает фраза "triggers an interrupt"? Загадка. Цитата 0100: SETUP transaction completed (triggers an interrupt) 0110: SETUP data packet received Оба статуса вызывают прерывание.
|
|
|
|
|
Nov 7 2015, 18:54
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(aaarrr @ Nov 8 2015, 00:48)  OTG_FS_DOEPCTL0.EPENA установлен? Прерывание по RXFLVL у меня построено сейчас вот так: Код static void ISRH_RxFifoNonEmpty(void) { UINT32 status = OTG_FS->GRXSTSP; /* Get the Status from the top of the FIFO */ UINT8 ep_num = ((status & OTG_FS_GRXSTSP_EPNUM_MSK) >> OTG_FS_GRXSTSP_EPNUM_POS); INT data_len = ((status & OTG_FS_GRXSTSP_BCNT_MSK) >> OTG_FS_GRXSTSP_BCNT_POS); g_EP_Desc[0].data_len = data_len; UINT8 packet_status = ((status & OTG_FS_GRXSTSP_PKTSTS_MSK) >> OTG_FS_GRXSTSP_PKTSTS_POS); switch(packet_status) { case 0x01: /* Global OUT NAK (triggers an interrupt) */ break; case 0x02: /* OUT data packet received */ if(0 == ep_num) { USBD_CTRL_STATE usbd_state = USBD_DataOut(); /* Process the setup request parse */ if(USBD_CTRL_STAGE_DATA_IN == usbd_state) /* DATA_IN stage */ OTG_FS->DIEPEMPMSK |= (UINT32)1; /* Enable TX FIFO empy intr. from EP0 */ } break; case 0x03: /* OUT transfer completed (triggers an interrupt) */ break; case 0x04: /* SETUP transaction completed (triggers an interrupt) */ break; case 0x06: /* SETUP data packet received */ if(0 == ep_num) { USBD_CTRL_STATE usbd_state = USBD_Setup(); /* Process the setup request parse */ if(USBD_CTRL_STAGE_DATA_IN == usbd_state) /* DATA_IN stage */ OTG_FS->DIEPEMPMSK |= (UINT32)1; /* Enable TX FIFO empy intr. from EP0 */ } break; default: break; } } Функции верхнего уровня: USBD_Setup() и USBD_DataOut() для чтения из RX буфера используют одну и ту же функцию чтения: Код USBD_RESULT IUSBD_EP0_Read(P_UINT8 data, INT data_len, P_INT xfer) { if(data_len > g_EP_Desc[0].data_len) data_len = g_EP_Desc[0].data_len; g_EP_Desc[0].data_len = 0; EP_OUT_FIFO_SW_Get((void *)IUSBD_FIFO_BASE, (void *)data, data_len); /* Read data from FIFO */ OTG_FS->DOEPTSIZ0 = /* Setup transfer size for ready to receive */ OTG_FS_DOEPTSIZ0_XFRSIZ(USBD_CFG_DEVICE_EP0_SIZE * IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT) | OTG_FS_DOEPTSIZ0_PKTCNT | OTG_FS_DOEPTSIZ0_STUPCNT(IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT); OTG_FS->DOEPCTL0 |= (OTG_FS_DOEPCTL0_CNAK | OTG_FS_DOEPCTL0_EPENA); *xfer = data_len; return USBD_RES_OK; /* OK */ } Т.е. NAK и EPENA программируются сразу после вычитывания буфера.
--------------------
|
|
|
|
|
Nov 7 2015, 19:08
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(aaarrr @ Nov 8 2015, 01:02)  Так выходит, что до получения первого пакета EPENA не установлен? Вот эта часть кода: Код OTG_FS->DOEPTSIZ0 = /* Setup transfer size for ready to receive */ OTG_FS_DOEPTSIZ0_XFRSIZ(USBD_CFG_DEVICE_EP0_SIZE * IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT) | OTG_FS_DOEPTSIZ0_PKTCNT | OTG_FS_DOEPTSIZ0_STUPCNT(IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT); OTG_FS->DOEPCTL0 |= (OTG_FS_DOEPCTL0_CNAK | OTG_FS_DOEPCTL0_EPENA); Так же исполняется по приходу прерывания USB Bus Reset. Так что точка всегда готова к приему пакетов. И, когда приходит прерывание о новом пакете, и это DATA OUT stage - количество данных в GRXSTSP верное - 7 байт. Только данные почему то не те, которые послал хост... В остальном все работает нормально. Данные по OUT BULK точке я еще принимать не пробовал. Пока хочу разобраться почему в буфере не то что передал хост.
--------------------
|
|
|
|
|
Nov 7 2015, 19:55
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(prottoss @ Nov 7 2015, 22:51)  Но я вроде так и делаю. В функции IUSBD_EP0_Read получаю SETUP: Вычитываю данные из RX FIFO и тут же взвожу EPENA и CNAK Перенесите обработку SETUP сюда: Код case 0x04: /* SETUP transaction completed (triggers an interrupt) */ Именно в этот момент EPENA и снимается.
|
|
|
|
|
Nov 7 2015, 20:16
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(aaarrr @ Nov 8 2015, 01:55)  Перенесите обработку SETUP сюда: Код case 0x04: /* SETUP transaction completed (triggers an interrupt) */ Именно в этот момент EPENA и снимается. Спасибо. Как всегда помогли быстро разобраться. Правда взвод точки я воткнул не в том месте кода, как Вы сказали, а в обработчике от OUT точки по флагу STUP (SETUP phase done) в регистре DOEPINT0. Перечитал даташит про EPENA в DOEPCTL0: Цитата Bit 31EPENA:Endpoint enable The application sets this bit to start transmitting data on endpoint 0. The core clears this bit before setting any ofthe following interrupts on this endpoint: – SETUP phase done – Endpoint disabled – Transfer completed
--------------------
|
|
|
|
|
Nov 7 2015, 20:37
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(prottoss @ Nov 8 2015, 02:16)  Правда взвод точки я воткнул Неа, не туда воткнул  В общем сделал как советовали. Теперь код прерывания по RXFLVL выглядит вот так: Код static void ISRH_RxFifoNonEmpty(void) { UINT32 status = OTG_FS->GRXSTSP; /* Get the Status from the top of the FIFO */ UINT8 ep_num = ((status & OTG_FS_GRXSTSP_EPNUM_MSK) >> OTG_FS_GRXSTSP_EPNUM_POS); INT data_len = ((status & OTG_FS_GRXSTSP_BCNT_MSK) >> OTG_FS_GRXSTSP_BCNT_POS); g_EP_Desc[0].data_len = data_len; UINT8 packet_status = ((status & OTG_FS_GRXSTSP_PKTSTS_MSK) >> OTG_FS_GRXSTSP_PKTSTS_POS); switch(packet_status) { case 0x01: /* Global OUT NAK (triggers an interrupt) */ break; case 0x02: /* OUT data packet received */ if(0 == ep_num) { USBD_CTRL_STATE usbd_state = USBD_DataOut(); /* Process the setup request parse */ if(USBD_CTRL_STAGE_DATA_IN == usbd_state) /* DATA_IN stage */ OTG_FS->DIEPEMPMSK |= (UINT32)1; /* Enable TX FIFO empy intr. from EP0 */ } break; case 0x03: /* OUT transfer completed (triggers an interrupt) */ break; case 0x04: /* SETUP transaction completed (triggers an interrupt) */ if(0 == ep_num) { OTG_FS->DOEPTSIZ0 = /* Setup transfer size for ready to receive */ OTG_FS_DOEPTSIZ0_XFRSIZ(USBD_CFG_DEVICE_EP0_SIZE * IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT) | OTG_FS_DOEPTSIZ0_PKTCNT | OTG_FS_DOEPTSIZ0_STUPCNT(IUSBD_CFG_EP0_DOEPTSIZ_STUPCNT); OTG_FS->DOEPCTL0 |= (OTG_FS_DOEPCTL0_CNAK | OTG_FS_DOEPCTL0_EPENA); } break; case 0x06: /* SETUP data packet received */ if(0 == ep_num) { USBD_CTRL_STATE usbd_state = USBD_Setup(); /* Process the setup request parse */ if(USBD_CTRL_STAGE_DATA_IN == usbd_state) /* DATA_IN stage */ OTG_FS->DIEPEMPMSK |= (UINT32)1; /* Enable TX FIFO empy intr. from EP0 */ } break; default: break; } } Из функции IUSBD_EP0_Read код разрешения точки вообще убрал Цитата(aaarrr @ Nov 8 2015, 02:28)  Пожалуйста  Правда, веселый контроллер USB у STM? Ага веселый, но изучать все равно нужно - тренд. Мне сейчас интересно посмотреть, какая будет производительность у это OTG_FS ядра. Вижу, что ни о каком двойном буферировании BULK точек в мануале речи не идет - надеюсь оно там есть на уровне ядра? Криво, конечно, что OUT буфер один общий и его нужно обязательно вычитывать сразу, но если прикрутить DMA, то, в принципе, сносно должно получится.
--------------------
|
|
|
|
|
Nov 20 2015, 12:26
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Поднял на собственном стеке HID с двумя INT точками. Сделал эхо. Все прекрасно работает. Производительность не измерял пока. Есть непонимание по одному вопросу: Есть регистры, задающие размерность FIFO для IN конечных точек. Это OTG_FS_DIEPTXF0 для контрольной точки и OTG_FS_DIEPTXFx для рабочих точек. С полем INEPTXFD все понятно. В мануале прямо про них написано: Цитата Bits 31:16INEPTXFD:IN endpoint TxFIFO depth This value is in terms of 32-bit words. Minimum value is 16 The power-on reset value of this register is specified as the largest IN endpoint FIFO number depth. С полем INEPTXSA, у меня, полного понимания нет. Описание в доке: Цитата INEPTXSA:IN endpoint FIFOx transmit RAM start address This field contains the memory start address for IN endpoint transmit FIFOx. The address must be aligned with a 32-bit memory location. Т.е. вроде как исчисление в этом поле в байтах, но число должно быть выровнено на 32 бита. Посмотрел примеры от ST. Там берется, к примеру, размер буфера в 32-бит словах (как и нужно), и это значение используется для вычисления адреса следующего буфера... Т.е. значение не делится на 4 для получения смещения в байтах... Посмотрел в отладчике состояние этих регистров по умолчанию после инициализации OTG - там, судя по дефолтным значениям полей, происходит то же самое. Правда, для последних регистров, в итоге, занчение адреса вылезает за пределы максимального размера памяти OTG... Хоть в байтах, хоть в 32-бит словах. Опять веселье (С)aaarrr Извините, может немного сумбурно объяснил вопрос.
--------------------
|
|
|
|
|
Nov 20 2015, 13:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(prottoss @ Nov 8 2015, 00:37)  Мне сейчас интересно посмотреть, какая будет производительность у это OTG_FS ядра. Вижу, что ни о каком двойном буферировании BULK точек в мануале речи не идет - надеюсь оно там есть на уровне ядра? Криво, конечно, что OUT буфер один общий и его нужно обязательно вычитывать сразу, но если прикрутить DMA, то, в принципе, сносно должно получится. Расскажите дилетанту для чего в USB нужен DMA пожалуйста. Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Или речь идет о коротких пакетах? Вероятно я не вижу подводных камней.
|
|
|
|
|
Nov 20 2015, 13:45
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(aaarrr @ Nov 20 2015, 19:09)  Нет, все в словах исчисляется. FIFO у них иной адресации и не имеет. Зачем тогда написано, что в поле адреса должно быть загружено значение, выровненное на 32 бита? Как можно не выровнять то, что уже выровнено? Цитата(Tarbal @ Nov 20 2015, 19:28)  Расскажите дилетанту для чего в USB нужен DMA пожалуйста. Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Или речь идет о коротких пакетах? Вероятно я не вижу подводных камней. Ну хотя бы для того чтобы переслать данные из памяти USB в порт, минуя копирование данных в память. Вроде как в stm32 otg это можно сделать, хотя, я еще не пробовал. За выходные вечера хочу попробовать. Организация FIFO, на мой взгляд, позволяет это сделать. При запуске трансфера настроить точку и канал, и по прерываниям по приему стартовать канал DMA.
--------------------
|
|
|
|
|
Nov 20 2015, 13:46
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Tarbal @ Nov 20 2015, 16:28)  Ведь если посылать полные пакеты по 64 байта, то уже вроде как железо заполнит само буфер и вызовет одно прерывание на принятых 64 байта. Именно что буфер FIFO заполнит, а не буфер в памяти процессора. Цитата(prottoss @ Nov 20 2015, 16:37)  Зачем тогда написано, что в поле адреса должно быть загружено значение, выровненное на 32 бита? Как можно не выровнять то, что уже выровнено? Загадка-с. Выразились неудачно, CCCV и тому подобное.
|
|
|
|
|
Nov 21 2015, 04:41
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Вернусь к вопросу использования DMA. Цитата(aaarrr @ Nov 20 2015, 19:48)  64 байта пакета - это всего 16 слов, возможность выигрыша в такой конфигурации представляется сомнительной. Для OUT передач это, возможно, и верно, т.к. для BULK и INT трансферов 64 байта - это максимум. Я проверил на HID и на CDC с штатным Windows драйвером usbser.sys. Для IN передач все намного радужнее. У IN точек есть персональный хардварный буфер, который может быть по размеру намного больше чем размер точки. Т.е. к примеру, если точка имеет размер 64 байта, я свободного могу сделать буфер размером, к примеру, в 512 байт и загрузить его полностью используя DMA. В данном случае будет явный прирост производительности. Жаль, конечно, что для OUT точек сделали какой то кастрированный общий буфер...
--------------------
|
|
|
|
|
Mar 19 2017, 21:09
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Подниму темку в связи со схожим вопросом... Цитата(prottoss @ Dec 18 2015, 14:19)  Построил USB MSD устройство. Столкнулся с вот такой проблемой:
Если ставлю IN FIFO для EP1 =512 или более - передача в хост затыкается на команде SCSI Read10 чтения 0 сектора. Состояние регистров EP1 IN становится вот такое: В регистре DIEPCTL1 бит EPENA установлен, что говорит о том, что точка занята (в режиме передачи). В регистре DIEPSIZ1 поле PKTCNT равно количеству 64 бит пакетов, т.е. 512/64 = 8. Поле XFRSIZ = 0; В регистре DTXFSTS1 поле INEPTFSAV = 0 - Буфер полный.
Хост, при этом, передачу не видит. CDC устройство (свое), данные ходят через BULK EP1. Работает все, кроме передачи данных от девайса к хосту (при этом через EP0 ответы проходят нормально, код пересылки данных на 99% общий). После записи в TX FIFO EP1 остается в таком виде: DIEPCTL1 = 0x80498040, т.е. EPENA установлен DIEPSIZ1 = 0x80000, поле PKTCNT=1, поле XFRSIZ = 0 (изначально отправлялся 1 пакет размером 5 байт, соответственно было 0x80005) DTXFSTS1 = 14, исходный размер был 16 слов, записал 5байт (=2 слова), т.е. все логично. Если писать данные дальше, то буфер заполняется и все. Ситуация почти 1:1 с Вашей, интересно что это может быть, и чем все закончилось у Вас? P.S. Да, камень STM32F746
Сообщение отредактировал Шаманъ - Mar 19 2017, 21:11
|
|
|
|
|
Mar 20 2017, 00:43
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Я эту ситуацию ловил как результат порчи FIFO из-за взаимного перекрытия областей разных ендпоинтов. Не совсем как в документации инициализирую GRXFSIZ - если точно по формуле, висим. Попробуйте увеличить, не забывая про размер FIFO (для FS - 1280 байт). У меня опытным путем получено addplaces = 3 to Шаманъ: а попробовать мой исходник затащить? На каждом углу же предлагаю взять... CODE static uint32_t usbd_makefifoparam(uint_fast16_t base, uint_fast16_t size) { return ((uint32_t) size << 16) | base; } // Преобразование размера в байтах размера данных в требования к fifo // Расчет аргумента функции HAL_PCDEx_SetRxFiFo, HAL_PCDEx_SetTxFiFo static uint_fast16_t size2buff4(uint_fast16_t size) { const uint_fast16_t size4 = (size + 3) / 4; // размер в 32-бит значениях return ulmax16(0x10, size4); } static void usbd_fifo_initialize(PCD_HandleTypeDef * hpcd, uint_fast16_t fullsize) { PCD_TypeDef * const instance = hpcd->Instance; // DocID028270 Rev 2 (RM0410): 41.11.3 FIFO RAM allocation // DocID028270 Rev 2 (RM0410): 41.16.6 Device programming model uint_fast16_t maxoutpacketsize4 = size2buff4(USB_OTG_MAX_EP0_SIZE); //uint_fast16_t base4; uint_fast8_t numcontrolendpoints = 1; uint_fast8_t numoutendpoints = 1; // при addplaces = 3 появился звук на передаче в трансивер (при 2-х компортах) // но если CDC и UAC включать поодиночке, обмен не нарушается и при 0. // todo: найти все-таки документ https://www.synopsys.com/ip_prototyping_kit...tgv2_drd_pc.pdf uint_fast8_t addplaces = 3; #if WITHUSBUAC numoutendpoints += 1; #if WITHRTS96 enum { nuacinpackets = 1, nuacoutpackets = 1 }; #elif WITHRTS192 enum { nuacinpackets = 1, nuacoutpackets = 1 }; #else /* WITHRTS96 || WITHRTS192 */ enum { nuacinpackets = 2, nuacoutpackets = 2 }; #endif /* WITHRTS96 || WITHRTS192 */ const uint_fast16_t uacinmaxpacket = uasbd_getuacinmaxpacket(); maxoutpacketsize4 = ulmax16(maxoutpacketsize4, nuacoutpackets * size2buff4(VIRTUAL_AUDIO_PORT_DATA_SIZE_OUT)); #endif /* WITHUSBUAC */ #if WITHUSBCDC numoutendpoints += 2; #if WITHUSBUAC #if WITHRTS96 || WITHRTS192 enum { ncdcindatapackets = 3, ncdcoutdatapackets = 4 }; #else /* WITHRTS96 || WITHRTS192 */ enum { ncdcindatapackets = 2, ncdcoutdatapackets = 2 }; #endif /* WITHRTS96 || WITHRTS192 */ #else /* WITHUSBUAC */ enum { ncdcindatapackets = 4, ncdcoutdatapackets = 4 }; #endif /* WITHUSBUAC */ maxoutpacketsize4 = ulmax16(maxoutpacketsize4, ncdcoutdatapackets * size2buff4(VIRTUAL_COM_PORT_DATA_SIZE)); #endif /* WITHUSBCDC */ #if WITHUSBCDCEEM numoutendpoints += 1; #if WITHUSBUAC #if WITHRTS96 || WITHRTS192 enum { ncdceemindatapackets = 3, ncdceemoutdatapackets = 4 }; #else /* WITHRTS96 || WITHRTS192 */ enum { ncdceemindatapackets = 2, ncdceemoutdatapackets = 2 }; #endif /* WITHRTS96 || WITHRTS192 */ #else /* WITHUSBUAC */ enum { ncdceemindatapackets = 4, ncdceemoutdatapackets = 4 }; #endif /* WITHUSBUAC */ maxoutpacketsize4 = ulmax16(maxoutpacketsize4, ncdceemoutdatapackets * size2buff4(USBD_CDCEEM_BUFSIZE)); #endif /* WITHUSBCDCEEM */ uint_fast16_t base4; uint_fast16_t size4; { /* Установить размер RX FIFO */ // (4 * number of control endpoints + 6) + // ((largest USB packet used / 4) + 1 for status information) + // (2 * number of OUT endpoints) + // 1 for Global NAK size4 = (4 * numcontrolendpoints + 6) + (maxoutpacketsize4 + 1) + (2 * numoutendpoints) + 1 + addplaces; instance->GRXFSIZ = size4; base4 = size4; /* Установить размер TX FIFO EP0 */ size4 = 2 * (size2buff4(USB_OTG_MAX_EP0_SIZE) + 0); instance->DIEPTXF0_HNPTXFSIZ = usbd_makefifoparam(base4, size4); base4 += size4; } #if WITHUSBUAC { /* endpoint передачи звука в компютер */ const uint_fast8_t pipe = USBD_EP_ISOC_IN & 0x7F; size4 = nuacinpackets * (size2buff4(uacinmaxpacket) + 0); instance->DIEPTXF [pipe - 1] = usbd_makefifoparam(base4, size4); base4 += size4; } #endif /* WITHUSBUAC */ #if WITHUSBCDC { /* полнофункциональное устройство */ const uint_fast8_t pipe = USBD_EP_CDC_IN & 0x7F; size4 = ncdcindatapackets * (size2buff4(VIRTUAL_COM_PORT_DATA_SIZE) + 0); instance->DIEPTXF [pipe - 1] = usbd_makefifoparam(base4, size4); base4 += size4; } /* Эти endpoints не используются для обмена */ size4 = 0x10; instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1] = usbd_makefifoparam(base4, size4); instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1] = usbd_makefifoparam(base4, size4); instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1] = usbd_makefifoparam(base4, size4); #endif /* WITHUSBCDC */ #if WITHUSBCDCEEM { /* полнофункциональное устройство */ const uint_fast8_t pipe = USBD_EP_CDCEEM_IN & 0x7F; size4 = ncdceemindatapackets * (size2buff4(USBD_CDCEEM_BUFSIZE) + 0); instance->DIEPTXF [pipe - 1] = usbd_makefifoparam(base4, size4); base4 += size4; } #endif /* WITHUSBCDCEEM */ USB_FlushRxFifo(instance); USB_FlushTxFifoAll(instance); if ((base4 * 4) > fullsize) { char b [32]; debug_printf_P(PSTR("usbd_fifo_initialize error: base4=%u, fullsize=%u\n"), (base4 * 4), fullsize); local_snprintf_P(b, sizeof b / sizeof b [0], PSTR("used=%u"), (base4 * 4)); display_setcolors(COLOR_RED, BGCOLOR); display_at(0, 0,  ; for (;;) ; } else { debug_printf_P(PSTR("usbd_fifo_initialize: base4=%u, fullsize=%u\n"), (base4 * 4), fullsize); #if 0 // Диагностическая выдача использованного объёма FIFO RAM char b [32]; local_snprintf_P(b, sizeof b / sizeof b [0], PSTR("used=%u"), (base4 * 4)); display_setcolors(COLOR_GREEN, BGCOLOR); display_at(0, 0,  ; local_delay_ms(2000); #endif } }
Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 00:50
|
|
|
|
|
Mar 20 2017, 06:05
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(Genadi Zawidowski @ Mar 20 2017, 03:43)  Я эту ситуацию ловил как результат порчи FIFO из-за взаимного перекрытия областей разных ендпоинтов. Геннадий приветствую! Спасибо за ответ. Я вчера обнаружил похожую тему https://community.st.com/thread/15083Вот оттуда про магическое число 3  : Цитата I have found this comment in the HAL_PCDEx_SetTxFiFo function code (Cube lib 1.6.0): "When DMA is used 3n * FIFO locations should be reserved for internal DMA registers" Но тут речь про TXFIFO и про DMA. У Вас же RXFIFO, а у меня DMA нет... Цитата Не совсем как в документации инициализирую GRXFSIZ - если точно по формуле, висим. Попробуйте увеличить, не забывая про размер FIFO (для FS - 1280 байт). У меня опытным путем получено addplaces = 3 Причем, что интересно EP0 работает нормально, а у нее FIFO как раз за RXFIFO - получается фигня какая-то... Цитата to Шаманъ: а попробовать мой исходник затащить? На каждом углу же предлагаю взять... Заглянул - у меня совсем другая концепция построения модуля (я не пытаюсь сваять еще одного сколь-либо универсального монстра - минимум кода, минимум памяти, максимум быстродействия). Библиотеки от STM я не использую - все свое. Но всеравно спасибо! Кстати про FIFO и доки. В доках написано несколько туманно, но по факту OTG_DIEPTXF0 и OTG_DIEPTXF1 адресуют один и тот же регистр. Кстати, а какие размеры fifo и их адреса вызывали проблемы, а какие были рабочими? Может удастся установить связь и найти корень зла
|
|
|
|
|
Mar 20 2017, 08:42
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Рабочие в проекте. Проблемы если по формуле (там где кодичество IN уendpoints итак далее учитываетмся). GRXFSIZ увеличивайте пока не заработает. DMA я не использовал (хотя и с ним работает). Или - попробуйте для TX FIFO выделять память от конца - а в GRXFSIZ все что останется... Или - срисуйте с моего проекта для Вашего конкретного случая распределение памяти FIFO под CDC - и проверьте, работает или нет, что виновато - остальной код или эта часть. Да хоть пополам разделите 1280. ps: в аттачменте - тестовый бинарник под плату STM32F746G-DISCO, на FS порту создает два компорта и аудио. Один из компортов - кенвудовский CAT.
Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 08:52
|
|
|
|
|
Mar 20 2017, 10:03
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(Genadi Zawidowski @ Mar 20 2017, 11:42)  Проблемы если по формуле (там где кодичество IN уendpoints итак далее учитываетмся). GRXFSIZ увеличивайте пока не заработает. У меня изначально под RXFIFO выделялось памяти намного больше, чем в формуле. Одну проблему нашел, исправил, проблема была очень глупой (описка). Получил первый пакет на компе (пока в сниффере). Потом затык с теми же симптомами. Вызывает подозрение этот фрагмент (стрелочками отметил, что это такое непонятно):
Цитата /* Эти endpoints не используются для обмена */ size4 = 0x10; instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1] = usbd_makefifoparam(base4, size4); instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1] = usbd_makefifoparam(base4, size4); instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1] = usbd_makefifoparam(base4, size4); И у Вас получается туда что-либо записать? У меня регистры у отключенных эндпоинтов совершенно мертвые (возвращают 0, запись игнорируют). Цитата(Genadi Zawidowski @ Mar 20 2017, 11:42)  ps: в аттачменте - тестовый бинарник под плату STM32F746G-DISCO, на FS порту создает два компорта и аудио. Один из компортов - кенвудовский CAT. Спасибо, но дискавери у меня нет
|
|
|
|
|
Mar 20 2017, 14:01
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 24-02-09
Пользователь №: 45 309

|
У меня был похожий случай недавно (на USB CDC), что данные от Хоста к устройству шли нормально, а от устройства к Хосту ни в какую. Дескрипторы устройства были классические (EP1 IN/OUT - данные BULK, EP2 IN - Interrupt), всё вроде должно работать.
А проблема была в том, что конечную точку EP2 я забыл проинициализировать в контроллере. Я через неё отправлять ничего не собирался и забыл про неё, но Хост, зная из дескрипторов что эта точка есть, периодически (но крайне редко) - делал к ней запрос. Я этот запрос в логах даже найти не мог, т.к. он был 1 раз на 255 кадров SOF. А поскольку EP2 не была инициализирована в железе, то она никак не отвечала на этот запрос: ни ACK, ни NACK ни как-то ещё. И Хост вообще прекращал делать запросы типа IN не только к EP2 IN но и к EP1 IN. В результате данные от устройства к Хосту не читались. Но передавались от Хоста к устройству исправно.
Когда я вспомнил-таки про EP2 и инициализировал её - данные от EP1 пошли нормально. У меня эта точка ничего не делает, просто отвечает NACK на запрос от Хоста, и всё.
|
|
|
|
|
Mar 20 2017, 15:03
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(Genadi Zawidowski @ Mar 20 2017, 15:56)  1) эти неиспользуемые ендпоинты инициализируются обычном способом, просто не выделяется память под буферы (а так как написано). Что значит обычным способом? Попробуте как-нибудь ради прикола что-то записать регистр конфигурации ФИФО неиспользуемой точки. Цитата 2) Ты помнишь, что в OTG_FS DMA отсутствует? Да, мне ДМА не нужен, соответственно не использую. Цитата 3) производительность, простота... Я начал тоже с написания с чистого листа (только заглядывая в кубокод). Это было после того как за месяц аналогичным способом поднял USB DEVICE на Renesas. Уткнувшись в стену через пару недель, решил сперва поднять как работает (и получил железно работающий интерфейс CDC+AUDIO). И за 33 дня (trial period USBLyzer-а) все закончил. Ну у меня пока с чистого листа это дело заняло три дня, из которых один потрачен на идиотскую ошибку с распределением ФИФО и эту последнюю нерешенную проблему - врод все не так уж и плохо. Цитата по логу: смотреть кто за кем... без этого могу предположить что в 13 строке инициировано чтение и в 14 удачно завершилось - десяток байт передан. А что в 15 строке не понял... Или не получилось начать передачу. Или это неудачно завершилась ранее инициированная операция. НЕ знаю как с этим логгером работать (варишарк?) Я тоже в этом логгере не силен, есть подозрение, что это вообще глюк логгера. Там вдруг посылается 10 байт через нулевую точку как будто это BULK точка. Перелопатил уже все, что можно, ну не посылаю я ничего такого, и само оно не может уйти - или глюк железки/ее инициализации, или логгер. Сейчас вообще весело - первый пакет уходит и я его вижу в логгере. Но из очереди (в STMме в смысле) он не убирается и за ним уже ничего в сторону хоста не ходит. Цитата(controller_m30 @ Mar 20 2017, 17:01)  А проблема была в том, что конечную точку EP2 я забыл проинициализировать в контроллере. Я через неё отправлять ничего не собирался и забыл про неё, но Хост, зная из дескрипторов что эта точка есть, периодически (но крайне редко) - делал к ней запрос. Я этот запрос в логах даже найти не мог, т.к. он был 1 раз на 255 кадров SOF. А вот это теплее. Дело в том, что я EP2 не использую, и в дескрипторе она не объявлена у меня. Она ведь исходя из стандарта опциональная, или нет? Наверное от безисходности щас переделаю дескрипторы 1:1 как у STM, и добавлю еще одну точку.
Сообщение отредактировал Шаманъ - Mar 20 2017, 15:06
|
|
|
|
|
Mar 20 2017, 17:38
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Дополнил инициализацию отладочной печатью: Код v1=00000000 v2=00000000 v3=00000000 v4=0010013D v5=0010013D v6=0010013D usbd_fifo_initialize: base4=1268, fullsize=1280 Код /* Эти endpoints не используются для обмена */ size4 = 0x10; debug_printf_P(PSTR("v1=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1]); debug_printf_P(PSTR("v2=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1]); debug_printf_P(PSTR("v3=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1]); instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1] = usbd_makefifoparam(base4, size4); instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1] = usbd_makefifoparam(base4, size4); instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1] = usbd_makefifoparam(base4, size4); debug_printf_P(PSTR("v4=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INT & 0x7F) - 1]); debug_printf_P(PSTR("v5=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INb & 0x7F) - 1]); debug_printf_P(PSTR("v6=%08lX\n"), instance->DIEPTXF [(USBD_EP_CDC_INTb & 0x7F) - 1]); Они не используются, но вполне себе инициализированные.
|
|
|
|
|
Mar 20 2017, 19:52
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(Genadi Zawidowski @ Mar 20 2017, 22:06)  В студию... У меня он оказался очень древним, все собирался скачать посвежее, но оно ж работает. В структуре забыли __IO в одном месте. Версия файла 0.9.5 (сейчас скачал свежий, он почти в два раза больше по объему и моложе на 1.5года  и версия значится 1.2.0). Регистры теперь меняются, как надо, но результат +- такой же:
Там где зеленым выделено это я отдал хосту 70байт (все прошло нормально). А вот с красного начались проблемы...видать что-то профтыкал я  , наверное надо еще раз сделать RTFM по стандарту и скупым докам от STM... Да, терминалом нормально порт открывается и данные от хоста к девайсу ходят. Цитата зы: с каким кварцем макет? - попробую по приколу тест сделать для твоей платы. 8MГц это все вокруг платки от WaveShare Core746I построено.
|
|
|
|
|
Mar 20 2017, 20:01
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Вот версия с внутренним генератором, теоретически должна поднять USB FS на любой макетке. Цитата Там где зеленым выделено это я отдал хосту 70байт (все прошло нормально). А вот с красного начались проблемы... Нда... ендпоинт ушел в себя... Кстати, для понимания - FIFO у них (STM32F746) не для байтов, а для пакетов. вычитывать только целиком.
Сообщение отредактировал Genadi Zawidowski - Mar 20 2017, 20:09
|
|
|
|
|
Mar 20 2017, 20:38
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Народ, я тут всех поставил на уши, а потом подключил девайс к машине на которой восьмерка (до этого смотрел на старой машине с ХР), и о чудо он отсылает данные обратно  Теперь проверить надо туда и назад... Цитата(Genadi Zawidowski @ Mar 20 2017, 23:01)  Нда... ендпоинт ушел в себя... Кстати, для понимания - FIFO у них (STM32F746) не для байтов, а для пакетов. вычитывать только целиком. Да я в курсе, там два пакета было - 64 байта и остаток.
|
|
|
|
|
Mar 20 2017, 21:04
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(Genadi Zawidowski @ Mar 20 2017, 23:40)  Попробуй мой тест на XP - у меня работало (терминалкой ;;; - в ответ ?;) А что оно еще делает на 400кБ? Убрал одну EP. Итог - в сторону хоста проходит только первая посылка и все. Ладно буду завтра пилить дальше, есть кое какие мысли почему так...
|
|
|
|
|
Mar 21 2017, 04:20
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(Genadi Zawidowski @ Mar 21 2017, 00:16)  Проверил бы... прошить минутное дело. Хоть сказал бы, опознается или нет. Дело не минутное - надо разобрать девайс, чтобы отключить TFT (поскольку без инициализации LTDC он будет в очень нехорошем состоянии, которое приводит к его медленной деградации). Разбирать довольно долго. Учитывая написанное выше и ниже не уверен, что эта операция что-либо решит. Цитата А что за проблема с interrupt endpoint? на 746 для аудио+компорты впритык хватает. То что XP без interrupt endpoint CDC не работает я где-то писал уже. Мне не хватает - без interrupt EP того, что есть у USB FS хватает впритык (еще бы парочка была кстати, но тут была проблема с распределением других интерфейсов/разводкой платы, в итоге USB HS вытянуть не получилось). Цитата(Alechek @ Mar 21 2017, 06:52)  "Cтарая" XP (SP2) и "новая" XP (SP3) - тоже 2 большие разницы. Драйвер CDC в SP3 сильно переработали. Точно что-то поменяли в случае, если размер передачи кратен размеру EP Спасибо! Теперь припоминаю, что там были проблемы с этим драйвером, из-за чего его особо и не использовал никто. Наверное пора обновиться  .
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|