MementoMori 4 20 ноября, 2012 Опубликовано 20 ноября, 2012 (изменено) · Жалоба Господа, осваиваю USB. Пытаюсь подружить STM32F и ПК. Взял пример от STM - для устройства и пример USB HID из JVCL. ПРимер от STM хитромудреный, но чтобы получить хоть что-то мне проще поковырять его, чем писать с нуля. Собственно, проблема в чем - один байт я пересылать научился, а вот 2 никак не получается. ПРограмма на компьютере думает, что CurrentDevice.Caps.OutputReportByteLength равен единице и не передает больше одного байта, несмотря на то что я в форму вбиваю 2. ПРичем программа хитрая, если я в дескрипторе HID устройства пишу REPORT_COUNT =2, то в программе после подключения к устройству появляется два поля для репортов. ВОт дескриптор: const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = { 0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 0x09, 0x01, /* USAGE (Demo Kit) */ 0xa1, 0x01, /* COLLECTION (Application) */ /* 6 */ /* Led 1 */ 0x85, 0x01, /* REPORT_ID (1) */ 0x09, 0x01, /* USAGE (LED 1) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ 0x75, 0x08, /* REPORT_SIZE (8) */ 0x95, 0x01, /* REPORT_COUNT (1) */ 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ 0x85, 0x01, /* REPORT_ID (1) */ 0x09, 0x01, /* USAGE (LED 1) */ 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ /* 26 */ /* Led 2 */ 0x85, 0x02, /* REPORT_ID 2 */ 0x09, 0x02, /* USAGE (LED 2) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ 0x75, 0x08, /* REPORT_SIZE (8) */ 0x95, 0x01, /* REPORT_COUNT (1) */ 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ 0x85, 0x02, /* REPORT_ID (2) */ 0x09, 0x02, /* USAGE (LED 2) */ 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ /* 46 */ /* Led 3 */ 0x85, 0x03, /* REPORT_ID (3) */ 0x09, 0x03, /* USAGE (LED 3) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ 0x75, 0x08, /* REPORT_SIZE (8) */ 0x95, 0x01, /* REPORT_COUNT (1) */ 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ 0x85, 0x03, /* REPORT_ID (3) */ 0x09, 0x03, /* USAGE (LED 3) */ 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ /* 66 */ /* Led 4 */ 0x85, 0x08, /* REPORT_ID 4) */ 0x09, 0x08, /* USAGE (LED 4) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ 0x75, 0x08, /* REPORT_SIZE (8) */ 0x95, 0x01, /* REPORT_COUNT (1) */ 0xB1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ 0x85, 0x08, /* REPORT_ID (4) */ 0x09, 0x09, /* USAGE (LED 4) */ 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ /* 86 */ /* key Push Button */ 0x85, 0x05, /* REPORT_ID (5) */ 0x09, 0x05, /* USAGE (Push Button) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ 0x75, 0x01, /* REPORT_SIZE (1) */ 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ 0x09, 0x05, /* USAGE (Push Button) */ 0x75, 0x01, /* REPORT_SIZE (1) */ 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ 0x75, 0x07, /* REPORT_SIZE (7) */ 0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */ 0x85, 0x05, /* REPORT_ID (2) */ 0x75, 0x07, /* REPORT_SIZE (7) */ 0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */ /* 114 */ /* Tamper Push Button */ 0x85, 0x06, /* REPORT_ID (6) */ 0x09, 0x06, /* USAGE (Tamper Push Button) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ 0x75, 0x01, /* REPORT_SIZE (1) */ 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ 0x09, 0x06, /* USAGE (Tamper Push Button) */ 0x75, 0x01, /* REPORT_SIZE (1) */ 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ 0x75, 0x07, /* REPORT_SIZE (7) */ 0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol) */ 0x85, 0x06, /* REPORT_ID (6) */ 0x75, 0x07, /* REPORT_SIZE (7) */ 0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol) */ /* 142 */ /* ADC IN */ 0x85, 0x07, /* REPORT_ID (7) */ 0x09, 0x07, /* USAGE (ADC IN) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM (255) */ 0x75, 0x08, /* REPORT_SIZE (8) */ 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ 0x85, 0x07, /* REPORT_ID (7) */ 0x09, 0x07, /* USAGE (ADC in) */ 0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol) */ /* 161 */ 0xc0 /* END_COLLECTION */ }; /* CustomHID_ReportDescriptor */ В этом дескрипторе я использую ReportID 1. Как передать репорт в 2 байта? Изменено 20 ноября, 2012 пользователем Memento Mori Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 20 ноября, 2012 Опубликовано 20 ноября, 2012 · Жалоба Как передать репорт в 2 байта?Обратите внимание на строку с REPORT_SIZE (8) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Сергей, задавая вопросы я параллельно курю Агурова. Книжка ядреная, раскуривается с трудом. Я уже понял, что репортсайз это размер в битах, а репорткаунт это количество байт. Когда я ставлю количество байт 8, в удивительной программе хосте появляется 8 полей для ввьда байт. Но при отправке 8 байт программа хост уходит в себя. Что еще нужно менять в прошивке контроллера при изменении дескриптора? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Я не смотрел этот пример. Могу предположить, что надо где-то указать сколько памяти зарезервировать под этот репорт и сколько байтов программа должна из стека принять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Сергей, выкладываю проекты. ДЛя компа проект на Дельфи, но к нему вопросов нет, вещь универсальная, анализирует дескриптор и сама выстраивает логику общения с HID устройством. Гляньте, если вам не трудно, 4-й день бьюсь и бестолку. Ура! Нашел! В самой библиотеке в инициализации ендпоинтов подправил count - заработало. Custom_HID.rar ReadWriteDemo.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба С записью разобрался. Помогите вкурить про чтение. ИЗначально пример был настроен на отправку данных от хоста и получение от устройства показаний АЦП, по прерыванию. По факту жмешь кнопку "Write", хост отправляет данные и принимает в ответ показания АЦП. Вот код, мной покоцанный. ПРосто сейчас чищу этот пример, удаляя все лишнее, насколько это возможно. /******************************************************************************* * Function Name : DMA1_Channel1_IRQHandler * Description : This function handles DMA1 Channel 1 interrupt request. * Input : None * Output : None * Return : None *******************************************************************************/ void DMA1_Channel1_IRQHandler(void) { Send_Buffer[0] = 0x01; if((ADC_ConvertedValueX >>4) - (ADC_ConvertedValueX_1 >>4) > 4) { Send_Buffer[1] = (uint8_t)(ADC_ConvertedValueX >>4); USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 8); SetEPTxValid(ENDP1); ADC_ConvertedValueX_1 = ADC_ConvertedValueX; } DMA_ClearFlag(DMA1_FLAG_TC1); } /******************************************************************************* * Function Name : EXTI9_5_IRQHandler * Description : This function handles External lines 9 to 5 interrupt request. * Input : None * Output : None * Return : None *******************************************************************************/ void EXTI9_5_IRQHandler(void) { Send_Buffer[0]=0xCC; Send_Buffer[1]=0xCC; Send_Buffer[2]=0xCC; USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 8); SetEPTxValid(ENDP1); EXTI_ClearITPendingBit(KEY_BUTTON_EXTI_LINE); } /******************************************************************************* * Function Name : EXTI15_10_IRQHandler * Description : This function handles External lines 15 to 10 interrupt request. * Input : None * Output : None * Return : None *******************************************************************************/ void EXTI15_10_IRQHandler(void) { Send_Buffer[0]=0xCC; Send_Buffer[1]=0xCC; Send_Buffer[2]=0xCC; USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 8); SetEPTxValid(ENDP1); EXTI_ClearITPendingBit(TAMPER_BUTTON_EXTI_LINE); } А я хочу, чтобы HID устройство помещало в Endpoint данные ПОСЛЕ получения данных от хоста, то есть чтобы было что-то вроде Хост: "Привет"; HID: "И тебе привет" Вот что я сделал: void EP2_IN_Callback(void) { WriteString(0,150,"DDDDDDDDDDDDd",0x001F); Transi_Buffer[0]=0x01; Transi_Buffer[1]=0xCC; Transi_Buffer[2]=0xCC; USB_SIL_Write(EP1_IN, (uint8_t*) Transi_Buffer, 8); SetEPTxValid(ENDP1); } В результате этого HID начинает бесконечно посылать в ответ пакеты. А мне и АЦП отключить бы (а низзя, без кода в обработчиках прерываний не работает). Ткните носом куда-нибудь кроме учебника, который я сейчас читаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 22 ноября, 2012 Опубликовано 22 ноября, 2012 · Жалоба Ткните носом куда-нибудь кроме учебника, который я сейчас читаю.Я все это дело изучал с год назад разбираясь с исходниками v-usb (ногодрыгательный usb-device на AVR). Изучал читая описание USB, описание HID с сайта usb.org, книгу "USB complete", автор Jan Axelson и расставляя в интересующих меня местах исходника printf с выводом нужных переменных в UART. Сделал тот проект и, увы, уже многое забыл. Пусть вам поможет кто-то другой, кто более плотно этим занимается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 22 ноября, 2012 Опубликовано 22 ноября, 2012 · Жалоба ау люди помогите! Мне один шаг всего остался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 29 января, 2013 Опубликовано 29 января, 2013 · Жалоба ау люди помогите! Мне один шаг всего остался. Тоже STM32F103. У кейла на форуме нашел ответ на Ваш вопрос. Корректировкой 3-4 строк передаю/принимаю по 64 байта в пакете. Вопрос еще актуален? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться