前言

1.雅特力AT32F403A例程之-USB之HID双向通信,实现了USB的HID双向通信。

一、官方提供BSP存在的问题

说明:官方提供HID功能只实现了IN也就是发送数据到PC上,OUT也就是接收无法实现。经过多次测试,结果发现只有下面的例程可以实现。

1
2
3


AT32F403A\BSP\AT32F403A_407_Firmware_Library_V2.0.7\utilities、at32f403a_407_usb_iap_demo

二、USB之HID双向通信实现

1.初始化USB

代码如下(示例):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51


void  USB_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回调函数数据发送

代码如下(示例):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36


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例程有问题,无法进入回调函数。

代码如下(示例):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54


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回调函数中调用。

代码如下(示例):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27


void usbd_hid_iap_process(void *udev, uint8_t *pdata, uint16_t len)


{


  uint8_t  i;


  


  for(i=0;i<64;i++)


  {


      USB_Receive_Buffer[i] = pdata[i];


  }


}

5.读写数据

USB_Receive_Flag 标志位在OUT数据接收回调函数中标志。

代码如下(示例):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48


void  USB_TxRx(void)


{


    uint8_t  i;


  


    if(USB_Receive_Flag ==1)


    {


        USB_Receive_Flag =0;


        for(i=0;i<64;i++)


        {


          printf(" %x",USB_Receive_Buffer[i]);


          report_buf[i] = USB_Receive_Buffer[i];


        }


        printf(" aa\r\n");


        usb_iap_class_send_report(&usb_core_dev, report_buf, USBD_HIDIAP_IN_MAXPACKET_SIZE);


    }


}

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

软件下载

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

https://download.csdn.net/download/suqingxiao/85812981