HarmonySage 发表于 2025-7-11 19:13

雅特力AT32F403A例程之-USB之HID双向通信

雅特力AT32F403A例程之-USB之HID双向通信,实现了USB的HID双向通信。
一、官方提供BSP存在的问题
说明:官方提供HID功能只实现了IN也就是发送数据到PC上,OUT也就是接收无法实现。经过多次测试,结果发现只有下面的例程可以实现。AT32F403A\BSP\AT32F403A_407_Firmware_Library_V2.0.7\utilities、at32f403a_407_usb_iap_demo
二、USB之HID双向通信实现1.初始化USB代码如下(示例):voidUSB_Class_Init(void)
{
/* select usb 48m clcok source */
usb_clock48m_select(USB_CLK_HEXT);

/* enable usb clock */
crm_periph_clock_enable(CRM_USB_PERIPH_CLOCK, TRUE);

/* enable usb interrupt */
nvic_irq_enable(USBFS_L_CAN1_RX0_IRQn, 0, 0);

/* usb core init */
usbd_core_init(&usb_core_dev, USB, &hid_iap_class_handler, &hid_iap_desc_handler, 0);

/* enable usb pull-up */
usbd_connect(&usb_core_dev);
}
2.IN回调函数数据发送代码如下(示例):static usb_sts_type class_in_handler(void *udev, uint8_t ept_num)
{
usb_sts_type status = USB_OK;

/* ...user code...
    trans next packet data
*/
usbd_hid_iap_in_complete(udev);
//printf("class_in_handler\r\n");
   
return status;
}
3.OUT回调函数数据接收这个数据接收回传函数在官方BSP包中的HID例程有问题,无法进入回调函数。
代码如下(示例):static usb_sts_type class_out_handler(void *udev, uint8_t ept_num)
{
usb_sts_type status = USB_OK;
usbd_core_type *pudev = (usbd_core_type *)udev;
iap_info_type *piap = (iap_info_type *)pudev->class_handler->pdata;

/* get endpoint receive data length*/
uint32_t recv_len = usbd_get_recv_len(pudev, ept_num);
//printf("class_out_handle/rrecv_len=%x\r\n",recv_len);
/* hid iap process */
usbd_hid_iap_process(udev, piap->g_rxhid_buff, recv_len);

USB_Receive_Flag =1;
/* start receive next packet */
usbd_ept_recv(pudev, USBD_HIDIAP_OUT_EPT, piap->g_rxhid_buff, USBD_HIDIAP_OUT_MAXPACKET_SIZE);

return status;
}
4.接收数据处理函数接收数据处理函数在OUT回调函数中调用。
代码如下(示例):void usbd_hid_iap_process(void *udev, uint8_t *pdata, uint16_t len)
{
uint8_ti;

for(i=0;i<64;i++)
{
      USB_Receive_Buffer = pdata;
}
}
5.读写数据USB_Receive_Flag 标志位在OUT数据接收回调函数中标志。
代码如下(示例):voidUSB_TxRx(void)
{
    uint8_ti;

    if(USB_Receive_Flag ==1)
    {
      USB_Receive_Flag =0;
      for(i=0;i<64;i++)
      {
          printf(" %x",USB_Receive_Buffer);
          report_buf = USB_Receive_Buffer;
      }
      printf(" aa\r\n");
      usb_iap_class_send_report(&usb_core_dev, report_buf, USBD_HIDIAP_IN_MAXPACKET_SIZE);
    }
}
该处使用的url网络请求的数据。






页: [1]
查看完整版本: 雅特力AT32F403A例程之-USB之HID双向通信