bigbat 发表于 2023-6-26 09:58

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

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

<p> &nbsp;选择emUSB Device CDC echo模板,这次还是使用keil软件,创建完成后,打开配置工具Device-configurator。</p>

<p>&nbsp;使用工具,工具板子情况修改时钟和SWD项目,将SWO的相关项目去掉,</p>

<p>&nbsp;修改时钟设置,去掉WCO项目,修改CLK-LF源</p>

<p>&nbsp;设置好以后就可以了,将UART引脚和CYBSP_USER_LED1, CYBSP_USER_LED,也相应修改</p>

<p>&nbsp;记得存盘,save生成驱动代码。打开keil项目</p>

<p>&nbsp;可以看到核心的代码非常的简洁,也符合单片机的程序习惯。</p>

<pre>
<code class="language-cpp">for (;;)
    {

      /* Wait for configuration */
      while ( (USBD_GetState() &amp; 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 &gt; 0 ) &amp;&amp; ( read_buffer == '\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();

    }</code></pre>

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

<p>&nbsp;启动程序,出现USB新设备</p>

<p>&nbsp;出现了一个新的串口设备,而且windows 10系统不需要驱动程序就可以工作,</p>

<p>&nbsp;利用串口助手输入hello\n可以发现MCU反回了字符串,这注意波特率随意,多少都可以。</p>

<p>&nbsp;我测试过多种波特率都没有问题。</p>

<p>总结:</p>

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

秦天qintian0303 发表于 2023-6-26 10:25

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

bigbat 发表于 2023-6-26 10:29

秦天qintian0303 发表于 2023-6-26 10:25
USB接口测试用的软件是哪一个?串口助手能测试USB?

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

秦天qintian0303 发表于 2023-6-26 10:33

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

<p>相当强,测试软件都是自己写的&nbsp;&nbsp;</p>

lugl4313820 发表于 2023-7-3 08:50

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

bigbat 发表于 2023-7-3 09:01

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

<p>你可以不用它的IDE,使用project-creator就可以了</p>
页: [1]
查看完整版本: 【RTT&英飞凌PSoC6评估板】USB CDC串口测试