本帖最后由 qjp1988113 于 2022-7-6 17:23 编辑
今天有空,测试了下F425的USB CDC,这个功能还是很有用的。我就喜欢用,能节省一个串口电路,而且速度几乎能达到低速USB的12M。
USB各种相关协议对于初学者或者不深入了解的人来说,还是挺复杂的。但是各大厂家几乎推出的例子都涵盖USB的各种应用例子。
雅特力的也不例外。我们只要在例子上,找到收发函数,再上面修改一下,即可应用。第一,设备描述符。我们可以更改成自己想要的名字,而不必每次都是官方的名称。
第二,USB发送接收函数:
官方的例子,是在主函数循环里面,一直接收,但接收到数据后,直接把之前接收的发送回去。
我测试了下,这个例子确实很流畅。稍微修改就能作为一个应答机构,可以用在项目上。
最早我用沁恒的CH375,就是采用读取中断标志,然后接收数据,然后判断标志,然后执行动作。
这里也一样:
- while(1)
- {
- /* get usb vcp receive data */
- data_len = usb_vcp_get_rxdata(&otg_core_struct.dev, usb_buffer);
- if(data_len > 0 || send_zero_packet == 1)
- {
- /* bulk transfer is complete when the endpoint does one of the following
- 1 has transferred exactly the amount of data expected
- 2 transfers a packet with a payload size less than wMaxPacketSize or transfers a zero-length packet
- */
- if(data_len > 0)
- send_zero_packet = 1;
- if(data_len == 0)
- send_zero_packet = 0;
- // timeout = 5000000;
- // do
- // {
- // /* send data to host */
- // if(usb_vcp_send_data(&otg_core_struct.dev, usb_buffer, data_len) == SUCCESS)
- // {
- // break;
- // }
- // }while(timeout --);
- switch(usb_buffer[0])
- {
- case '1':
- {
- at32_led_on(LED2);
- usb_vcp_send_data(&otg_core_struct.dev,(uint8_t*) "LED2 is on!\r\n", strlen("LED2 is on!\r\n"));
- }
- break;
- case '2':
- {
- at32_led_off(LED2);
- usb_vcp_send_data(&otg_core_struct.dev,(uint8_t*) "LED2 is off!\r\n", strlen("LED2 is off!\r\n"));
- }break;
- default:break;
- }
- }
- }
编译后,下载,在串口助手里面发送‘1’或者‘2’,来开启关闭LED2。
串口输出正常,板子LED2也熄灭正常。
这片文章,只是简单的测试一下AF32F425的USB CDC 功能,并未去详细的查看USB内部协议的具体实现。
总体,感觉还是很不错!
|