0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)鍵指南針-NXP USB CDC_VCOM虛擬串口例程

恩智浦MCU加油站 ? 來(lái)源: 恩智浦MCU加油站 ? 2024-07-25 09:17 ? 次閱讀

最近有小伙伴反應(yīng)USB中的 usb_examples/usb_device_cdc_vcom 例程(USB虛擬串口VCOM)中的一些使用問題,今天集中來(lái)說(shuō)說(shuō)使用example的必知要點(diǎn)~

實(shí)驗(yàn)平臺(tái)和軟件版本說(shuō)明

本篇文章的實(shí)驗(yàn)平臺(tái)為:SDK_2_5_0_LPC54605J512oardslpcxpresso54608usb_examplesusb_device_cdc_vcom但實(shí)際上本篇文章適用于NXP大部分的硬件平臺(tái),因?yàn)閡sb_device_cdc_vcom(以下簡(jiǎn)稱vcom)這部分例程代碼和硬件關(guān)系并不大,屬于USB Stack之上的應(yīng)用部分,另外這部分代碼在SDK的各個(gè)版本上變化也不是很大,所以如果您使用的新版本的SDK,本篇文章也同樣適用。

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

目標(biāo)讀者

關(guān)于vcom的一些基礎(chǔ)環(huán)境搭建/編譯下載等基礎(chǔ)問題這篇文章不再贅述,具體可以參考example文件夾下的readme.pdf. 這里假設(shè)讀者:

有一定的USB基礎(chǔ)知識(shí)

已經(jīng)成功跑過(guò)這個(gè)vcom例程,大概瀏覽過(guò)源代碼,并且準(zhǔn)備使用vcom的代碼作為參考開發(fā)自己的項(xiàng)目產(chǎn)品

重要概念解釋

首先一個(gè)最基本的概念:USB所有傳輸都是主機(jī)發(fā)起的,從機(jī)只是被動(dòng)的響應(yīng)主機(jī)發(fā)來(lái)的請(qǐng)求

USB OUT 傳輸: 即 USB Host(如PC)向USB Device(如MCU)下發(fā)數(shù)據(jù), 對(duì)應(yīng)vcom 例程中事件kUSB_DeviceCdcEventRecvResponse. 這個(gè)很好理解:對(duì)于vcom例子,就是虛擬串口上有數(shù)據(jù)發(fā)到了MCU(比如PC端有一個(gè)上位機(jī)軟件,打開了虛擬串口,并且向虛擬串口寫入數(shù)據(jù))。每當(dāng)MCU收到數(shù)據(jù),都會(huì)進(jìn)入kUSB_DeviceCdcEventRecvResponse.在kUSB_DeviceCdcEventRecvResponse事件中,需要MCU這邊盡快的調(diào)用USB_DeviceCdcAcmRecv API將USB中的數(shù)據(jù)讀取出來(lái),然后USB Stack會(huì)和USB硬件一起準(zhǔn)備好下次USB OUT事件接收工作。(類似串口的DMA接收機(jī)制)

從下圖的CallStack可以看出,kUSB_DeviceCdcEventRecvResponse本質(zhì)就是BulkOut中斷回調(diào)上來(lái)的:

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

USB IN傳輸:即USB Host(PC) 向USB Device(如MCU)索要數(shù)據(jù), 比OUT傳輸稍微難理解一些:在vcom這個(gè)例程中,由于vcom屬于buck傳輸。每當(dāng)從機(jī)響應(yīng)上一個(gè)IN token之后,就會(huì)進(jìn)入kUSB_DeviceCdcEventSendResponse 事件,從下圖的CallStack也可以看到, kUSB_DeviceCdcEventSendResponse事件本質(zhì)就是 USB Buck In 中斷回調(diào)上來(lái)的:

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

所以每當(dāng)進(jìn)入到kUSB_DeviceCdcEventSendResponse的時(shí)候,都說(shuō)明USB IN傳輸已經(jīng)完成(或取消)。那么從機(jī)如何向主機(jī)發(fā)送數(shù)據(jù)呢?調(diào)用USB_DeviceCdcAcmSend 這個(gè)API。但是調(diào)用這個(gè)API你需要注意,每次調(diào)用這個(gè)API,你都需要等待發(fā)送完成事件(kUSB_DeviceCdcEventSendResponse) 或超時(shí)(第一次除外)。在任何時(shí)候,你都不能在代碼里連續(xù)調(diào)用USB_DeviceCdcAcmSend 多次。這個(gè)機(jī)制類似于串口DMA發(fā)送,即:每次調(diào)用串口DMA發(fā)送的時(shí)候,你都要確保上一次串口DMA發(fā)送已經(jīng)完成。 總結(jié)如下:

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



實(shí)際上,vcom例程實(shí)現(xiàn)的東西很簡(jiǎn)單,就是自發(fā)自收(echo),把虛擬串口接到的數(shù)據(jù)再原封不動(dòng)的發(fā)回而已。所涉及的數(shù)據(jù)傳輸過(guò)程中的事件也只有:kUSB_DeviceCdcEventSendResponse 和kUSB_DeviceCdcEventRecvResponse. 其他的USB Class回調(diào)事件實(shí)際上多半是有關(guān)一些配置,控制 (波特率,打開,關(guān)閉虛擬串口)等,這部分內(nèi)容暫不展開,需自學(xué)。

usb_device_cdc_vcom的問題 這個(gè)例程不太方便的地方就是代碼里把發(fā)送和接收是耦合在一起的,對(duì)于新手且對(duì)USB不熟悉的用戶,都不知道怎么解耦。實(shí)際應(yīng)用中,串口的發(fā)送和接收應(yīng)該是獨(dú)立的,沒有太大關(guān)系的,但是很可惜,這個(gè)example設(shè)計(jì)的時(shí)候硬生生的把發(fā)送和接收”粘”在一起,讓新手不太容易剝離開。

這里給出一個(gè)簡(jiǎn)單的改造方案,把VCOM的發(fā)送和接收拆開:

1. 首先對(duì)于USB_IN: 注釋掉之前的 USB_DeviceCDCAcmRecv部分,USB IN 傳輸和USB OUT之間沒有必然關(guān)系。另外在kUSB_DeviceCdcEventSendResponse中,定義一個(gè)標(biāo)志is_cdc_in_compelte (類比于串口的發(fā)送完成中斷,或者DMA發(fā)送完成中斷):

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

2. 對(duì)于USB OUT: 將之前的代碼替換為下圖,在收到Host下發(fā)的數(shù)據(jù)后,第一時(shí)間調(diào)用USB_DeviceCDCAcmRecv,把數(shù)據(jù)接下來(lái),然后通過(guò)一個(gè)消息隊(duì)列(你可以用你自己實(shí)現(xiàn)的一個(gè)消息隊(duì)列) 發(fā)送給應(yīng)用層。不要在DeviceCdcEventSendResponse中做過(guò)多的應(yīng)用層處理:

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

3. 其他的有關(guān)原demo中的一些變量,比如s_recvSize, s_sendSize 之類的,刪掉處理。在while(1)主循環(huán)中,處理USB中斷回調(diào)發(fā)出來(lái)的消息隊(duì)列:

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

通過(guò)解耦VCOM的Tx(發(fā)送)與Rx(接收),代碼不僅變得清晰簡(jiǎn)潔,還提升了模塊間的獨(dú)立性和可維護(hù)性。這種設(shè)計(jì)促進(jìn)了代碼的復(fù)用性和可擴(kuò)展性,為未來(lái)的功能升級(jí)或定制開發(fā)奠定了堅(jiān)實(shí)基礎(chǔ)。無(wú)論是對(duì)于初次接觸的開發(fā)者還是資深工程師,都能從中受益,享受更流暢的編程體驗(yàn)。希望本期分享對(duì)大家有所幫助!

恩智浦致力于打造安全的連接和基礎(chǔ)設(shè)施解決方案,為智慧生活保駕護(hù)航。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NXP
    NXP
    +關(guān)注

    關(guān)注

    60

    文章

    1243

    瀏覽量

    181459
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7771

    瀏覽量

    262351
  • 虛擬串口
    +關(guān)注

    關(guān)注

    3

    文章

    60

    瀏覽量

    13839
  • VCOM
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    15449
  • 指南針
    +關(guān)注

    關(guān)注

    2

    文章

    17

    瀏覽量

    10836

原文標(biāo)題:關(guān)鍵指南針-NXP USB CDC_VCOM虛擬串口例程

文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    會(huì)說(shuō)話的指南針電路

    會(huì)說(shuō)話的羅盤(指南針電路)是由霍爾效應(yīng)的方向傳感器(MOD1)和模擬音頻存儲(chǔ)設(shè)備ISD1016制成的。
    發(fā)表于 01-04 10:21 ?4157次閱讀
    會(huì)說(shuō)話的<b class='flag-5'>指南針</b>電路

    電子指南針解決方案

    電子指南針解決方案指南針是一個(gè)重要的導(dǎo)航工具甚至在GPS 中也會(huì)用到電子指南針將替代舊的針式指南針或羅盤指南針因?yàn)殡娮?/div>
    發(fā)表于 07-20 17:40

    電子指南針

    各位大俠 你們好!我正在準(zhǔn)備用51單片機(jī)做電子指南針的畢業(yè)設(shè)計(jì),現(xiàn)在還沒頭緒,希望各位大俠多指點(diǎn)指點(diǎn)!謝謝!
    發(fā)表于 02-09 23:14

    電子指南針

    用電子指南針來(lái)控制三個(gè)電路的閉合能實(shí)現(xiàn)嗎?120度一個(gè)電路。
    發(fā)表于 02-23 14:21

    指南針!??!

    stm32.i2c通信,怎么才能實(shí)現(xiàn)指南針???求指導(dǎo),求代碼參考
    發(fā)表于 04-12 01:16

    基于單片機(jī)電子指南針系統(tǒng)的設(shè)計(jì)資料分享

    資料下載地址-1020(百度網(wǎng)盤):點(diǎn)擊下載摘 要早期的指南針采用了磁化指針和方位盤的組合方式,整個(gè)指南針從便攜性、指示靈敏度上都有一定不足。本系統(tǒng)采用專用的磁場(chǎng)傳感器結(jié)合高速微控制器(MCU
    發(fā)表于 11-11 08:23

    基于OpenHarmony的智能指南針

    電子指南針是現(xiàn)代的一種重要導(dǎo)航工具,大到飛機(jī)船舶的導(dǎo)航,小到個(gè)人手機(jī)導(dǎo)航,電子指南針可以說(shuō)和咱們生活息息相關(guān),密不可分。為什么電子指南針能指示方向?本 Demo 將為你呈現(xiàn),其中蘊(yùn)含了人類智慧
    發(fā)表于 07-08 11:04

    電子指南針

    電子指南針模組的資料,包括:使用說(shuō)明書、電路原理圖、演示實(shí)例代碼
    發(fā)表于 01-01 12:14 ?114次下載

    電子指南針原理

    電子指南針原理:指南針是一個(gè)重要的導(dǎo)航工具甚至在GPS 中也會(huì)用到電子指南針將替代舊的針式指南針或羅盤指南針因?yàn)殡娮?/div>
    發(fā)表于 07-20 17:49 ?9550次閱讀
    電子<b class='flag-5'>指南針</b>原理

    指南針巧作磁化檢驗(yàn)器

    指南針巧作磁化檢驗(yàn)器 把商店出售的微型指南針,用環(huán)氧樹脂粘貼在塑料
    發(fā)表于 09-05 12:17 ?713次閱讀
    用<b class='flag-5'>指南針</b>巧作磁化檢驗(yàn)器

    labview與指南針芯片通訊

    labview與指南針芯片通訊 串口協(xié)議9600波特率
    發(fā)表于 02-23 11:30 ?31次下載

    iPhone自帶的指南針的妙用

    大家在日常使用中應(yīng)該用過(guò)iPhone的指南針功能吧,當(dāng)你在野外或者是工作生活有需求時(shí),指南針除了能夠指示方向,其實(shí)還有其他的妙用,今天我們就要教大家如何解鎖指南針的其他功能。
    的頭像 發(fā)表于 05-22 08:56 ?7579次閱讀

    電子指南針的C語(yǔ)言程序詳細(xì)資料免費(fèi)下載

    主要包括了以下這幾個(gè)函數(shù)功能1.讀取指南針傳感器測(cè)量角度值 2.校準(zhǔn)指南針傳感器 3.關(guān)閉指南針的校準(zhǔn) 4.恢復(fù)出廠設(shè)置 5.修改指南針磁偏角值
    發(fā)表于 09-04 16:44 ?35次下載

    DIY 尋星指南針,Satellite searcher

    DIY 尋星指南針,Satellite searcher 關(guān)鍵字:DIY 尋星指南針 DIY 尋星指南針 ??? 使
    的頭像 發(fā)表于 09-20 19:17 ?825次閱讀

    為什么電子指南針能指示方向

    電子指南針是現(xiàn)代的一種重要導(dǎo)航工具,大到飛機(jī)船舶的導(dǎo)航,小到個(gè)人手機(jī)導(dǎo)航,電子指南針可以說(shuō)和咱們生活息息相關(guān),密不可分。為什么電子指南針能指示方向?本 Demo 將為你呈現(xiàn),其中蘊(yùn)含了人類智慧及大自然的奧妙。
    的頭像 發(fā)表于 07-25 14:06 ?1644次閱讀