在MCU的應(yīng)用中,經(jīng)常需要通過串口進行不定長數(shù)據(jù)包的傳輸。發(fā)送方很簡單,不需特別的考慮,而接收方則需要能夠偵測到數(shù)據(jù)包的結(jié)束。接收方的簡單做法是結(jié)合串口的IDLE中斷,或使用DMA并利用DMA的超時傳輸機制。
但有些MCU在設(shè)計時出于成本上的考慮,簡化了串口接收的IDLE模式以及DMA超時傳輸機制。沒有串口IDLE中斷或者DMA超時傳輸?shù)臋C制,我們就不知道什么時候通信結(jié)束了。這種情況下,為了實現(xiàn)通過串口傳輸不定長數(shù)據(jù)包的要求,需要使用軟件和其它片內(nèi)外設(shè)的配合,協(xié)同完成指定的功能。
LPC54101系列的UART模塊,支持FIFO的接收超時,能夠方便地實現(xiàn)上述功能。除此之外,本文介紹一種基于LPC54101和SDK,通過使用引腳中斷和定時器配合,實現(xiàn)串口DMA接收超時,實現(xiàn)串口DMA接收超時的機制。
先分析下UART傳輸?shù)臅r序,圖1是一個典型的8位數(shù)據(jù)位1位停止位的串口通信數(shù)據(jù)流。串口每次發(fā)送數(shù)據(jù)時會首先發(fā)送一個起始位,在TTL電平邏輯下,Start位首先是一個下降沿信號。
圖1. 串口接收數(shù)據(jù)時序圖
在串口DMA接收超時系統(tǒng)中,我們需要利用MCU的引腳中斷功能偵測這個下降沿信號,引腳中斷觸發(fā)后告訴系統(tǒng)開始計時。要特別注意的是,當(dāng)系統(tǒng)偵測到Start位的下降沿后最好關(guān)閉引腳中斷,不然后續(xù)數(shù)據(jù)流等信號的下降沿也會觸發(fā)引腳中斷使得整套方案失去了意義(還不如直接用串口接收完成中斷)。
LPC54101的引腳中斷可以在任意IO引腳上使能,所以可以直接把LPC54101的串口接收的引腳的中斷功能打開,并設(shè)置成下降沿觸發(fā)。
超時計數(shù)器最好是系統(tǒng)里的低功耗定時器,這個例程中我們用的是LPC54101的RIT定時器。超時的時間設(shè)置要考慮到當(dāng)前串口設(shè)置的波特率以及一次串口傳輸?shù)淖畲蟀L。
超時定時器計數(shù)溢出產(chǎn)生中斷后,軟件首先要從DMA的狀態(tài)寄存器中獲取到當(dāng)前接收到數(shù)據(jù)的長度(對于LPC54101來說,串口DMA接收數(shù)據(jù)的長度在XFERCFGn寄存器中的XFERCOUNT位,如圖2所示),然后從串口DMA預(yù)設(shè)置的數(shù)據(jù)緩沖區(qū)獲取對應(yīng)的數(shù)據(jù)即可。
圖2. LPC54101 DMA傳輸數(shù)據(jù)長度計數(shù)位
在初始化設(shè)置串口對應(yīng)的DMA通道時,最好設(shè)置傳輸長度為可能的最大長度,在接收超時后也別忘記重新復(fù)位一下串口對應(yīng)DMA通道的狀態(tài),不然本次接收的數(shù)據(jù)和數(shù)據(jù)長度還會帶入下次傳輸?shù)倪^程中。
圖3是例程的流程圖,分主程序,串口RX引腳中斷服務(wù)程序,超時定時器服務(wù)程序三個部分。
圖3. 程序流程圖
-
mcu
+關(guān)注
關(guān)注
146文章
17365瀏覽量
352871 -
串口
+關(guān)注
關(guān)注
14文章
1560瀏覽量
77170
原文標(biāo)題:在MCU中,如何實現(xiàn)串口的不定長數(shù)據(jù)包接收?
文章出處:【微信號:mcuworld,微信公眾號:嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
【AG32開發(fā)板免費試用】+串口不定長收超時設(shè)置閾值多少合適?
在Iphone4上運行UDP接收器,數(shù)據(jù)包丟失怎么解決?
能否在ESP結(jié)束之前通過串行端口停止傳入的UDP數(shù)據(jù)包的傳輸以解析下一個UDP數(shù)據(jù)包?
udp數(shù)據(jù)丟包的原因?
在AN65974中短數(shù)據(jù)包和零長數(shù)據(jù)包是什么意思?
如何在AIROC GUI上獲取良好數(shù)據(jù)包和總數(shù)據(jù)包?
求助,關(guān)于串口數(shù)據(jù)解析疑問求解
stm32f103通過UART_RX空閑中斷服務(wù)函數(shù)接收不定長數(shù)據(jù),運行一段時間后會進入HardFault_Handler的原因?
STM32F030串口用IDLE中斷接收不定長度數(shù)據(jù)包,中斷異常的原因?
STM32 DMA雙緩沖發(fā)送不定長數(shù)據(jù)怎么解決?
用STM32F030F4串口空閑中斷接收不定長數(shù)據(jù),發(fā)生中斷后不知道如何計算接收到的字節(jié)數(shù)?
stm32f103如何實現(xiàn)spi從機接收不定長數(shù)據(jù)?
STM32H7接收數(shù)據(jù)包異常,一包接收的數(shù)據(jù)出現(xiàn)兩包發(fā)送的內(nèi)容怎么解決?
DPDK在AI驅(qū)動的高效數(shù)據(jù)包處理應(yīng)用
![DPDK<b class='flag-5'>在</b>AI驅(qū)動的高效<b class='flag-5'>數(shù)據(jù)包</b>處理應(yīng)用](https://file1.elecfans.com/web2/M00/C0/E6/wKgZomXatDqAZd9FAAAzzFjjAK8970.png)
評論