tronix286 0 2 февраля, 2016 Опубликовано 2 февраля, 2016 · Жалоба Приветствую, Пытаюсь реализовать "эхо" обмена контроллер-комп по 32-байта. Сначала я заполняю массив числами от 0 до 31 и шлю его раз в пять секунд. while (1) { HAL_Delay(5000); USBD_HID_SendReport(&hUsbDeviceFS, OutBuffer, HID_EPIN_SIZE); } Принимаю на компе нормально. Затем я передаю контроллеру массив из всех нулей. В программе приемный массив должен скопироваться в тот, что я отсылаю и по-идее я должен увидеть в обратку массив нулей. static uint8_t USBD_HID_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) { if (epnum != (HID_EPOUT_ADDR & 0x0F)) return USBD_FAIL; int8_t i = 0; while (i < HID_EPOUT_SIZE) { OutBuffer[i] = usb_rx_buffer[i]; i++; } USBD_LL_PrepareReceive(pdev, HID_EPOUT_ADDR, usb_rx_buffer, HID_EPOUT_SIZE); return USBD_OK; } Но у меня появляются откуда-то числа 0x20 и 0x40 Дескриптор репорта: { //................................. 0x06, 0xFF, 0xFF, // 04|2 , Usage Page (vendor defined?) 0x09, 0x01, // 08|1 , Usage (vendor defined 0xA1, 0x01, // A0|1 , Collection (Application) //.................................. // IN report 0x09, 0x02, // 08|1 , Usage (vendor defined) 0x09, 0x03, // 08|1 , Usage (vendor defined) 0x15, 0x00, // 14|1 , Logical Minimum(0 for signed byte?) 0x26, 0xFF, 0x00, // 24|1 , Logical Maximum(255 for signed byte?) 0x75, 0x08, // 74|1 , Report Size(8) = field size in bits = 1 byte // 94|1 , ReportCount(size) = repeat count of previous item 0x95,HID_EPIN_SIZE, 0x81, 0x02, // 80|1 , IN report (Data,Variable, Absolute) //.................................... // OUT report 0x09, 0x04, // 08|1 , Usage (vendor defined) 0x09, 0x05, // 08|1 , Usage (vendor defined) 0x15, 0x00, // 14|1 , Logical Minimum(0 for signed byte?) 0x26, 0xFF, 0x00, // 24|1 , Logical Maximum(255 for signed byte?) 0x75, 0x08, // 74|1 , Report Size(8) = field size in bits = 1 byte // 94|1 , ReportCount(size) = repeat count of previous item 0x95, HID_EPOUT_SIZE, 0x91, 0x02, // 90|1 , OUT report (Data,Variable, Absolute) // Feature report 0x09, 0x06, // 08|1 , Usage (vendor defined) 0x09, 0x07, // 08|1 , Usage (vendor defined) 0x15, 0x00, // 14|1 , LogicalMinimum(0 for signed byte) 0x26, 0xFF, 0x00, // 24|1 , Logical Maximum(255 for signed byte) 0x75, 0x08, // 74|1 , Report Size(8) =field size in bits = 1 byte 0x95, HID_EPOUT_SIZE, // 94|x , ReportCount in byte 0xB1, 0x02, // B0|1 , Feature report 0xC0 // C0|0 , End Collection Ставил бряк на функцию USBD_HID_DataOut. Странное дело, но тогда в массиве usb_rx_buffer то же есть эти числа 0x20 и 0x40, но они идут подряд под 22 и 23 номером в массиве. Почему их разносит друг от друга в разные стороны при отправке, и откуда они там вообще берутся? Помогите нубу, плиз Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tronix286 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Есть подозрение на косяки в HAL, в частности регистр BTABLE = 0, соответственно приемный и передающий массивы лежат по адресу 0x4000 6000. Есть подозрение что один накладывается на другой. То есть при инициализации нифига не инициализируется. Буду сегодня детально смотреть регистры :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба BTABLE указывает на начало таблицы, в которой расположены адреса и размеры буферов для конечных точек. То, что он равен 0 означает, что эта таблица расположена в начале USB-памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tronix286 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Вот и я говорю. А вместо таблицы, у меня в начале памяти приемо-передающие буфера (то есть я там вижу данные свои которые шлю в контроллер). Вот те и CubeMX на пару с HAL. Короче замес был в том, что изначально в Cube я создал HID Class, а не Custom HID Class. Код сгенерился для одной ендпоинт входяшей. В частности, в функции USBD_LL_Init нужно правильно настраивать буфера. Было: HAL_PCDEx_PMAConfig(pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig(pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); HAL_PCDEx_PMAConfig(pdev->pData , 0x81 , PCD_SNG_BUF, 0x100); Стало: HAL_PCDEx_PMAConfig(pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); HAL_PCDEx_PMAConfig(pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); //HAL_PCDEx_PMAConfig(pdev->pData , 0x81 , PCD_SNG_BUF, 0x100); HAL_PCDEx_PMAConfig(pdev->pData , HID_EPIN_ADDR , PCD_SNG_BUF, 0x98); HAL_PCDEx_PMAConfig(pdev->pData , HID_EPOUT_ADDR , PCD_SNG_BUF, 0xD8); Так что да, "читайте доки - они рулез". Всем спасибо за участие, отбой тревоги. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться