【RTT&英飞凌PSoC6评估板】USB CDC串口测试
<p>测试英飞凌的单片机不测试USB设备有点可惜,当年Cypress可是USB设备行业的领导者,从51内核的USB MCU到今天的USB 3.0设备,其协议栈和规范都很不错,下面的测试就是使用MCU模拟一个USB CDC设备(虚拟串口) ,首先是创建项目,启动项目创建工具</p><p> 选择emUSB Device CDC echo模板,这次还是使用keil软件,创建完成后,打开配置工具Device-configurator。</p>
<p> 使用工具,工具板子情况修改时钟和SWD项目,将SWO的相关项目去掉,</p>
<p> 修改时钟设置,去掉WCO项目,修改CLK-LF源</p>
<p> 设置好以后就可以了,将UART引脚和CYBSP_USER_LED1, CYBSP_USER_LED,也相应修改</p>
<p> 记得存盘,save生成驱动代码。打开keil项目</p>
<p> 可以看到核心的代码非常的简洁,也符合单片机的程序习惯。</p>
<pre>
<code class="language-cpp">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 == '\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语句判断数据中是否包含'\n',然后将就收的数据回传到USB中。</p>
<p> 启动程序,出现USB新设备</p>
<p> 出现了一个新的串口设备,而且windows 10系统不需要驱动程序就可以工作,</p>
<p> 利用串口助手输入hello\n可以发现MCU反回了字符串,这注意波特率随意,多少都可以。</p>
<p> 我测试过多种波特率都没有问题。</p>
<p>总结:</p>
<p>可以发现程序使用USB接收和发送都很方便,其它厂家的软件通常都是使用状态机,做一个case检测,发现对应的通道有接收了,在从revice缓冲中读取数据,发送也很麻烦,先把需要发送的数据传入write缓冲,在修改发送状态请求通过0通道发送出去,等待设备发送状态标记。但是英飞凌的HDL封装的比较好,没有这么麻烦。这种通过状态机的方法,曾经让我很困惑需要知道USB通道的状态,不能像UART一样。</p>
<p>USB接口测试用的软件是哪一个?串口助手能测试USB?</p>
秦天qintian0303 发表于 2023-6-26 10:25
USB接口测试用的软件是哪一个?串口助手能测试USB?
<p>就是普通的串口软件。不过这个软件是我写的,我放在论坛网站上了,需要可以下载。计划有时间了准备在用C++重写一版,想加入Modbus和终端功能。</p>
bigbat 发表于 2023-6-26 10:29
就是普通的串口软件。不过这个软件是我写的,我放在论坛网站上了,需要可以下载。计划有时间了准备在用C+ ...
<p>相当强,测试软件都是自己写的 </p>
<p>但是英飞凌的HDL封装的比较好,没有这么麻烦。我感觉英飞凌的IDE学起来有点费劲。</p>
lugl4313820 发表于 2023-7-3 08:50
但是英飞凌的HDL封装的比较好,没有这么麻烦。我感觉英飞凌的IDE学起来有点费劲。
<p>你可以不用它的IDE,使用project-creator就可以了</p>
页:
[1]