[AT32F403/403A] 雅特力AT32F403A例程之-USB之HID双向通信

[复制链接]
 楼主| HarmonySage 发表于 2025-7-11 19:13 | 显示全部楼层 |阅读模式
雅特力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

代码如下(示例):

  1. void  USB_Class_Init(void)
  2. {
  3.   /* select usb 48m clcok source */
  4.   usb_clock48m_select(USB_CLK_HEXT);

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

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

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

  11.   /* enable usb pull-up */
  12.   usbd_connect(&usb_core_dev);
  13. }
2.IN回调函数数据发送

代码如下(示例):

  1. static usb_sts_type class_in_handler(void *udev, uint8_t ept_num)
  2. {
  3.   usb_sts_type status = USB_OK;
  4.   
  5.   /* ...user code...
  6.     trans next packet data
  7.   */
  8.   usbd_hid_iap_in_complete(udev);
  9.   //printf("class_in_handler\r\n");
  10.    
  11.   return status;
  12. }
3.OUT回调函数数据接收

这个数据接收回传函数在官方BSP包中的HID例程有问题,无法进入回调函数。
代码如下(示例):

  1. static usb_sts_type class_out_handler(void *udev, uint8_t ept_num)
  2. {
  3.   usb_sts_type status = USB_OK;
  4.   usbd_core_type *pudev = (usbd_core_type *)udev;
  5.   iap_info_type *piap = (iap_info_type *)pudev->class_handler->pdata;
  6.   
  7.   /* get endpoint receive data length  */
  8.   uint32_t recv_len = usbd_get_recv_len(pudev, ept_num);
  9.   //printf("class_out_handle/rrecv_len=%x\r\n",recv_len);
  10.   /* hid iap process */
  11.   usbd_hid_iap_process(udev, piap->g_rxhid_buff, recv_len);
  12.   
  13.   USB_Receive_Flag =1;
  14.   /* start receive next packet */
  15.   usbd_ept_recv(pudev, USBD_HIDIAP_OUT_EPT, piap->g_rxhid_buff, USBD_HIDIAP_OUT_MAXPACKET_SIZE);
  16.   
  17.   return status;
  18. }
4.接收数据处理函数

接收数据处理函数在OUT回调函数中调用。
代码如下(示例):

  1. void usbd_hid_iap_process(void *udev, uint8_t *pdata, uint16_t len)
  2. {
  3.   uint8_t  i;
  4.   
  5.   for(i=0;i<64;i++)
  6.   {
  7.       USB_Receive_Buffer[i] = pdata[i];
  8.   }
  9. }
5.读写数据

USB_Receive_Flag 标志位在OUT数据接收回调函数中标志。
代码如下(示例):

  1. void  USB_TxRx(void)
  2. {
  3.     uint8_t  i;
  4.   
  5.     if(USB_Receive_Flag ==1)
  6.     {
  7.         USB_Receive_Flag =0;
  8.         for(i=0;i<64;i++)
  9.         {
  10.           printf(" %x",USB_Receive_Buffer[i]);
  11.           report_buf[i] = USB_Receive_Buffer[i];
  12.         }
  13.         printf(" aa\r\n");
  14.         usb_iap_class_send_report(&usb_core_dev, report_buf, USBD_HIDIAP_IN_MAXPACKET_SIZE);
  15.     }
  16. }

该处使用的url网络请求的数据。








您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

72

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部