Перейти к содержанию
    

STM32F302 и HID USB 32 байта

Приветствую,

 

Пытаюсь реализовать "эхо" обмена контроллер-комп по 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

 

f1e05be8380d496aae95be91f7b06082.png

 

Дескриптор репорта:

 

{
//.................................
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 номером в массиве. Почему их разносит друг от друга в разные стороны при отправке, и откуда они там вообще берутся?

Помогите нубу, плиз

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть подозрение на косяки в HAL, в частности регистр BTABLE = 0, соответственно приемный и передающий массивы лежат по адресу 0x4000 6000. Есть подозрение что один накладывается на другой. То есть при инициализации нифига не инициализируется. Буду сегодня детально смотреть регистры :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

BTABLE указывает на начало таблицы, в которой расположены адреса и размеры буферов для конечных точек. То, что он равен 0 означает, что эта таблица расположена в начале USB-памяти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот и я говорю. А вместо таблицы, у меня в начале памяти приемо-передающие буфера (то есть я там вижу данные свои которые шлю в контроллер). Вот те и 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);

 

Так что да, "читайте доки - они рулез". Всем спасибо за участие, отбой тревоги.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...