Пытаюсь реализовать "эхо" обмена контроллер-комп по 32-байта. Сначала я заполняю массив числами от 0 до 31 и шлю его раз в пять секунд.
Код
while (1)
{
HAL_Delay(5000);
USBD_HID_SendReport(&hUsbDeviceFS, OutBuffer, HID_EPIN_SIZE);
}
{
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;
}
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
//.................................
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 номером в массиве. Почему их разносит друг от друга в разные стороны при отправке, и откуда они там вообще берутся?
Помогите нубу, плиз