[讨论] 【RTT&英飞凌PSoC6评估板】USB CDC串口测试

bigbat   2023-6-26 09:58 楼主

测试英飞凌的单片机不测试USB设备有点可惜,当年Cypress可是USB设备行业的领导者,从51内核的USB MCU到今天的USB 3.0设备,其协议栈和规范都很不错,下面的测试就是使用MCU模拟一个USB CDC设备(虚拟串口) ,首先是创建项目,启动项目创建工具

image.png  选择emUSB Device CDC echo模板,这次还是使用keil软件,创建完成后,打开配置工具Device-configurator。

image.png  使用工具,工具板子情况修改时钟和SWD项目,将SWO的相关项目去掉,

image.png  修改时钟设置,去掉WCO项目,修改CLK-LF源

image.png  设置好以后就可以了,将UART引脚和CYBSP_USER_LED1, CYBSP_USER_LED,也相应修改

image.png  记得存盘,save生成驱动代码。打开keil项目

image.png  可以看到核心的代码非常的简洁,也符合单片机的程序习惯。

for (;;)
    {

        /* Wait for configuration */
        while ( (USBD_GetState() & USB_STAT_CONFIGURED) != USB_STAT_CONFIGURED)
        {
            cyhal_system_delay_ms(USB_CONFIG_DELAY);
        }

        num_bytes_received = USBD_CDC_Receive(usb_cdcHandle, read_buffer, sizeof(read_buffer), 0);

        memcpy(write_buffer + num_bytes_to_write, read_buffer, num_bytes_received);

        num_bytes_to_write +=  num_bytes_received;


        if ( ( num_bytes_to_write > 0 ) && ( read_buffer[num_bytes_received - 1] == '\n' ) )
        {

            /* Sending one packet to host */
            USBD_CDC_Write(usb_cdcHandle, write_buffer, num_bytes_to_write, 0);

            /* Waits for specified number of bytes to be written to host */
            USBD_CDC_WaitForTX(usb_cdcHandle, 0);

            /* If the last sent packet is exactly the maximum packet
            *  size, it is followed by a zero-length packet to assure
            *  that the end of the segment is properly identified by
            *  the terminal.
            */

            if(num_bytes_to_write == sizeof(write_buffer))
            {
                /* Sending zero-length packet to host */
                USBD_CDC_Write(usb_cdcHandle, NULL, 0, 0);

                /* Waits for specified number of bytes to be written to host */
                USBD_CDC_WaitForTX(usb_cdcHandle, 0);
            }

            num_bytes_to_write = 0;

        }

        cyhal_syspm_sleep();

    }

程序的功能就是使用USBD_CDC_Receive()函数就收数据,该函数为非阻塞运行,当接收到数据后函数报告接受的数据数量,使用if语句判断数据中是否包含'\n',然后将就收的数据回传到USB中。

image.png  启动程序,出现USB新设备

image.png  出现了一个新的串口设备,而且windows 10系统不需要驱动程序就可以工作,

image.png  利用串口助手输入hello\n可以发现MCU反回了字符串,这注意波特率随意,多少都可以。

image.png  我测试过多种波特率都没有问题。

总结:

可以发现程序使用USB接收和发送都很方便,其它厂家的软件通常都是使用状态机,做一个case检测,发现对应的通道有接收了,在从revice缓冲中读取数据,发送也很麻烦,先把需要发送的数据传入write缓冲,在修改发送状态请求通过0通道发送出去,等待设备发送状态标记。但是英飞凌的HDL封装的比较好,没有这么麻烦。这种通过状态机的方法,曾经让我很困惑需要知道USB通道的状态,不能像UART一样。

回复评论 (5)

USB接口测试用的软件是哪一个?串口助手能测试USB?

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2023-6-26 10:25
引用: 秦天qintian0303 发表于 2023-6-26 10:25 USB接口测试用的软件是哪一个?串口助手能测试USB?

就是普通的串口软件。不过这个软件是我写的,我放在论坛网站上了,需要可以下载。计划有时间了准备在用C++重写一版,想加入Modbus和终端功能。

点赞  2023-6-26 10:29
引用: bigbat 发表于 2023-6-26 10:29 就是普通的串口软件。不过这个软件是我写的,我放在论坛网站上了,需要可以下载。计划有时间了准备在用C+ ...

相当强,测试软件都是自己写的  

在爱好的道路上不断前进,在生活的迷雾中播撒光引
点赞  2023-6-26 10:33

但是英飞凌的HDL封装的比较好,没有这么麻烦。我感觉英飞凌的IDE学起来有点费劲。

点赞  2023-7-3 08:50
引用: lugl4313820 发表于 2023-7-3 08:50 但是英飞凌的HDL封装的比较好,没有这么麻烦。我感觉英飞凌的IDE学起来有点费劲。

你可以不用它的IDE,使用project-creator就可以了

点赞  2023-7-3 09:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复