STM32
直播中

bigbangboom

8年用户 1214经验值
擅长:电源/新能源
私信 关注
[问答]

STM32F407使用USB HID实现双向通信,从电脑下发数据时,一直没有响应的原因?

MCU芯片: STM32F407
工程:使用 USB HID 实现双向通信

      采用 CubeMX 生成的 USB HID 工程,并且更新了报告描述符,已实现了向电脑一次发送64个字节的功能。但是从电脑下发数据时,一直没有响应,在接收中断函数里面,设了收到数据,指示灯就会闪一下,但是没看到有闪。
      哪位大侠指点一下,非常感谢!
      我看了 CubeMX 生成的代码中,main() 函数里,没有看到有打开USB接收中断的程序,是不是没有打开? 要怎么打开??

/** Usb HID report descriptor. */
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */
    0x06, 0x00, 0xff,              // USAGE_PAGE (Vendor Defined Page 1)
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0xA1, 0x01,                    // COLLECTION (Application)               
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0x15, 0x00,                    // LOGICAL_MINIMUM (0)
    0x26, 0xFF, 0x00,              // LOGICAL_MAXIMUM (255)
    0x95, 0x40,                    // REPORT_COUNT (64)
    0x75, 0x08,                    // REPORT_SIZE (8)
    0x81, 0x02,                    // INPUT (Data,Var,Abs)
               
    0x09, 0x01,                    // USAGE (Vendor Usage 1)
    0x15, 0x00,                    // LOGICAL_MINIMUM (0)
    0x26, 0xFF, 0x00,              // LOGICAL_MAXIMUM (255)
    0x95, 0x40,                    // REPORT_COUNT (64)
    0x75, 0x08,                    // REPORT_SIZE (8)
    0x91, 0x02,                    // OUTPUT (Data,Var,Abs)

  0xC0    /*     END_COLLECTION                     */
};



int main(void)
{
uint8_t i;

  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_IWDG_Init();
  MX_USART3_UART_Init();
  MX_ADC1_Init();
  MX_USB_DEVICE_Init();

HAL_TIM_Base_Start_IT( htim2);        
__HAL_UART_ENABLE_IT( huart3, UART_IT_RXNE);
        
for(i=0;i<64;i++)        
                USB_Tx_Buf[i] = i;

  while (1)
  {
                        HAL_IWDG_Refresh( hiwdg);
                        UART3_Rx_Fun();
               
                        if(HB_Clock >= 1)
                        {
                                        HB_Clock = 0;
                                        USBD_CUSTOM_HID_SendReport( hUsbDeviceFS,USB_Tx_Buf,64);                // 可以成功向电脑发送数据
                        }        
  }
}










回帖(1)

莫联雪

4 天前
STM32F407 使用 USB HID 实现双向通信时,从电脑下发数据没有响应的原因可能有以下几点:

1. USB 配置问题:确保你的 USB 配置正确,包括设备描述符、设备请求处理等。使用 CubeMX 生成的代码应该已经包含了这些配置,但仍然需要检查是否正确。

2. 报告描述符问题:你提到已经更新了报告描述符,确保报告描述符正确定义了输入和输出报告。检查报告描述符是否正确映射了数据缓冲区。

3. 中断配置问题:确保你已经正确配置了 USB 接收中断。在 CubeMX 生成的代码中,通常会有一些初始化函数,如 HAL_PCD_Init() 和 HAL_PCD_Start(),这些函数会配置 USB 相关中断。检查这些函数是否被正确调用。

4. 中断服务例程(ISR)问题:确保你已经正确实现了 USB 接收中断服务例程(如 PCD_IRQHandler()),并且在该例程中正确处理了接收到的数据。

5. 数据处理问题:检查你的接收中断函数是否正确处理了接收到的数据,并且正确触发了指示灯闪烁。

6. 电脑端驱动问题:确保电脑已经正确安装了 USB HID 设备的驱动程序。如果驱动程序有问题,可能会导致数据传输失败。

7. 电脑端测试工具问题:确保你使用的电脑端测试工具(如 HID Test 或其他 HID 测试软件)能够正确识别和通信你的设备。

8. 硬件问题:检查你的 STM32F407 开发板和 USB 连接线是否有硬件问题,如接触不良、损坏等。

为了解决这个问题,你可以尝试以下步骤:

1. 仔细检查 CubeMX 生成的代码,确保 USB 配置、报告描述符、中断配置等都正确无误。

2. 在 main() 函数中,确保已经调用了初始化和启动 USB 的相关函数,如 HAL_PCD_Init() 和 HAL_PCD_Start()。

3. 检查 USB 接收中断服务例程(如 PCD_IRQHandler()),确保它能够正确处理接收到的数据,并触发指示灯闪烁。

4. 使用电脑端的 HID 测试工具,检查设备是否被正确识别,并且尝试发送数据。

5. 如果以上步骤都无法解决问题,尝试在 STM32F407 上使用一个简单的 LED 闪烁程序,以排除硬件问题。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分