Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F302 и HID USB 32 байта
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Tronix286
Приветствую,

Пытаюсь реализовать "эхо" обмена контроллер-комп по 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
Есть подозрение на косяки в HAL, в частности регистр BTABLE = 0, соответственно приемный и передающий массивы лежат по адресу 0x4000 6000. Есть подозрение что один накладывается на другой. То есть при инициализации нифига не инициализируется. Буду сегодня детально смотреть регистры sad.gif
ViKo
BTABLE указывает на начало таблицы, в которой расположены адреса и размеры буферов для конечных точек. То, что он равен 0 означает, что эта таблица расположена в начале USB-памяти.
Tronix286
Вот и я говорю. А вместо таблицы, у меня в начале памяти приемо-передающие буфера (то есть я там вижу данные свои которые шлю в контроллер). Вот те и 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);


Так что да, "читайте доки - они рулез". Всем спасибо за участие, отбой тревоги.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.