0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关键指南针-NXP USB CDC_VCOM虚拟串口例程

恩智浦MCU加油站 来源: 恩智浦MCU加油站 2024-07-25 09:17 次阅读

最近有小伙伴反应USB中的 usb_examples/usb_device_cdc_vcom 例程(USB虚拟串口VCOM)中的一些使用问题,今天集中来说说使用example的必知要点~

实验平台和软件版本说明

本篇文章的实验平台为:SDK_2_5_0_LPC54605J512oardslpcxpresso54608usb_examplesusb_device_cdc_vcom但实际上本篇文章适用于NXP大部分的硬件平台,因为usb_device_cdc_vcom(以下简称vcom)这部分例程代码和硬件关系并不大,属于USB Stack之上的应用部分,另外这部分代码在SDK的各个版本上变化也不是很大,所以如果您使用的新版本的SDK,本篇文章也同样适用。

40bba49a-4a20-11ef-b8af-92fbcf53809c.png

目标读者

关于vcom的一些基础环境搭建/编译下载等基础问题这篇文章不再赘述,具体可以参考example文件夹下的readme.pdf. 这里假设读者:

有一定的USB基础知识

已经成功跑过这个vcom例程,大概浏览过源代码,并且准备使用vcom的代码作为参考开发自己的项目产品

重要概念解释

首先一个最基本的概念:USB所有传输都是主机发起的,从机只是被动的响应主机发来的请求

USB OUT 传输: 即 USB Host(如PC)向USB Device(如MCU)下发数据, 对应vcom 例程中事件kUSB_DeviceCdcEventRecvResponse. 这个很好理解:对于vcom例子,就是虚拟串口上有数据发到了MCU(比如PC端有一个上位机软件,打开了虚拟串口,并且向虚拟串口写入数据)。每当MCU收到数据,都会进入kUSB_DeviceCdcEventRecvResponse.在kUSB_DeviceCdcEventRecvResponse事件中,需要MCU这边尽快的调用USB_DeviceCdcAcmRecv API将USB中的数据读取出来,然后USB Stack会和USB硬件一起准备好下次USB OUT事件接收工作。(类似串口的DMA接收机制)

从下图的CallStack可以看出,kUSB_DeviceCdcEventRecvResponse本质就是BulkOut中断回调上来的:

40d4e3c4-4a20-11ef-b8af-92fbcf53809c.png

USB IN传输:即USB Host(PC) 向USB Device(如MCU)索要数据, 比OUT传输稍微难理解一些:在vcom这个例程中,由于vcom属于buck传输。每当从机响应上一个IN token之后,就会进入kUSB_DeviceCdcEventSendResponse 事件,从下图的CallStack也可以看到, kUSB_DeviceCdcEventSendResponse事件本质就是 USB Buck In 中断回调上来的:

40df8c7a-4a20-11ef-b8af-92fbcf53809c.png

所以每当进入到kUSB_DeviceCdcEventSendResponse的时候,都说明USB IN传输已经完成(或取消)。那么从机如何向主机发送数据呢?调用USB_DeviceCdcAcmSend 这个API。但是调用这个API你需要注意,每次调用这个API,你都需要等待发送完成事件(kUSB_DeviceCdcEventSendResponse) 或超时(第一次除外)。在任何时候,你都不能在代码里连续调用USB_DeviceCdcAcmSend 多次。这个机制类似于串口DMA发送,即:每次调用串口DMA发送的时候,你都要确保上一次串口DMA发送已经完成。 总结如下:

40e5ce3c-4a20-11ef-b8af-92fbcf53809c.png



实际上,vcom例程实现的东西很简单,就是自发自收(echo),把虚拟串口接到的数据再原封不动的发回而已。所涉及的数据传输过程中的事件也只有:kUSB_DeviceCdcEventSendResponse 和kUSB_DeviceCdcEventRecvResponse. 其他的USB Class回调事件实际上多半是有关一些配置,控制 (波特率,打开,关闭虚拟串口)等,这部分内容暂不展开,需自学。

usb_device_cdc_vcom的问题 这个例程不太方便的地方就是代码里把发送和接收是耦合在一起的,对于新手且对USB不熟悉的用户,都不知道怎么解耦。实际应用中,串口的发送和接收应该是独立的,没有太大关系的,但是很可惜,这个example设计的时候硬生生的把发送和接收”粘”在一起,让新手不太容易剥离开。

这里给出一个简单的改造方案,把VCOM的发送和接收拆开:

1. 首先对于USB_IN: 注释掉之前的 USB_DeviceCDCAcmRecv部分,USB IN 传输和USB OUT之间没有必然关系。另外在kUSB_DeviceCdcEventSendResponse中,定义一个标志is_cdc_in_compelte (类比于串口的发送完成中断,或者DMA发送完成中断):

40f6a978-4a20-11ef-b8af-92fbcf53809c.png

2. 对于USB OUT: 将之前的代码替换为下图,在收到Host下发的数据后,第一时间调用USB_DeviceCDCAcmRecv,把数据接下来,然后通过一个消息队列(你可以用你自己实现的一个消息队列) 发送给应用层。不要在DeviceCdcEventSendResponse中做过多的应用层处理:

4128ef82-4a20-11ef-b8af-92fbcf53809c.png

3. 其他的有关原demo中的一些变量,比如s_recvSize, s_sendSize 之类的,删掉处理。在while(1)主循环中,处理USB中断回调发出来的消息队列:

412d9960-4a20-11ef-b8af-92fbcf53809c.png

通过解耦VCOM的Tx(发送)与Rx(接收),代码不仅变得清晰简洁,还提升了模块间的独立性和可维护性。这种设计促进了代码的复用性和可扩展性,为未来的功能升级或定制开发奠定了坚实基础。无论是对于初次接触的开发者还是资深工程师,都能从中受益,享受更流畅的编程体验。希望本期分享对大家有所帮助!

恩智浦致力于打造安全的连接和基础设施解决方案,为智慧生活保驾护航。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NXP
    NXP
    +关注

    关注

    60

    文章

    1243

    浏览量

    181043
  • usb
    usb
    +关注

    关注

    60

    文章

    7758

    浏览量

    262088
  • 虚拟串口
    +关注

    关注

    3

    文章

    60

    浏览量

    13835
  • VCOM
    +关注

    关注

    0

    文章

    14

    浏览量

    15444
  • 指南针
    +关注

    关注

    2

    文章

    17

    浏览量

    10831

原文标题:关键指南针-NXP USB CDC_VCOM虚拟串口例程

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    会说话的指南针电路

    会说话的罗盘(指南针电路)是由霍尔效应的方向传感器(MOD1)和模拟音频存储设备ISD1016制成的。
    发表于 01-04 10:21 4148次阅读
    会说话的<b class='flag-5'>指南针</b>电路

    电子指南针解决方案

    电子指南针解决方案指南针是一个重要的导航工具甚至在GPS 中也会用到电子指南针将替代旧的针式指南针或罗盘指南针因为电子
    发表于 07-20 17:40

    电子指南针

    各位大侠 你们好!我正在准备用51单片机做电子指南针的毕业设计,现在还没头绪,希望各位大侠多指点指点!谢谢!
    发表于 02-09 23:14

    电子指南针

    用电子指南针来控制三个电路的闭合能实现吗?120度一个电路。
    发表于 02-23 14:21

    指南针!!!

    stm32.i2c通信,怎么才能实现指南针???求指导,求代码参考
    发表于 04-12 01:16

    基于单片机电子指南针系统的设计资料分享

    资料下载地址-1020(百度网盘):点击下载摘 要早期的指南针采用了磁化指针和方位盘的组合方式,整个指南针从便携性、指示灵敏度上都有一定不足。本系统采用专用的磁场传感器结合高速微控制器(MCU
    发表于 11-11 08:23

    基于OpenHarmony的智能指南针

    电子指南针是现代的一种重要导航工具,大到飞机船舶的导航,小到个人手机导航,电子指南针可以说和咱们生活息息相关,密不可分。为什么电子指南针能指示方向?本 Demo 将为你呈现,其中蕴含了人类智慧
    发表于 07-08 11:04

    电子指南针

    电子指南针模组的资料,包括:使用说明书、电路原理图、演示实例代码
    发表于 01-01 12:14 114次下载

    电子指南针原理

    电子指南针原理:指南针是一个重要的导航工具甚至在GPS 中也会用到电子指南针将替代旧的针式指南针或罗盘指南针因为电子
    发表于 07-20 17:49 9529次阅读
    电子<b class='flag-5'>指南针</b>原理

    指南针巧作磁化检验器

    指南针巧作磁化检验器 把商店出售的微型指南针,用环氧树脂粘贴在塑料
    发表于 09-05 12:17 713次阅读
    用<b class='flag-5'>指南针</b>巧作磁化检验器

    labview与指南针芯片通讯

    labview与指南针芯片通讯 串口协议9600波特率
    发表于 02-23 11:30 31次下载

    iPhone自带的指南针的妙用

    大家在日常使用中应该用过iPhone的指南针功能吧,当你在野外或者是工作生活有需求时,指南针除了能够指示方向,其实还有其他的妙用,今天我们就要教大家如何解锁指南针的其他功能。
    的头像 发表于 05-22 08:56 7554次阅读

    电子指南针的C语言程序详细资料免费下载

    主要包括了以下这几个函数功能1.读取指南针传感器测量角度值 2.校准指南针传感器 3.关闭指南针的校准 4.恢复出厂设置 5.修改指南针磁偏角值
    发表于 09-04 16:44 35次下载

    DIY 寻星指南针,Satellite searcher

    DIY 寻星指南针,Satellite searcher 关键字:DIY 寻星指南针 DIY 寻星指南针     使
    的头像 发表于 09-20 19:17 816次阅读

    为什么电子指南针能指示方向

    电子指南针是现代的一种重要导航工具,大到飞机船舶的导航,小到个人手机导航,电子指南针可以说和咱们生活息息相关,密不可分。为什么电子指南针能指示方向?本 Demo 将为你呈现,其中蕴含了人类智慧及大自然的奥妙。
    的头像 发表于 07-25 14:06 1611次阅读