在MCU的應(yīng)用中,經(jīng)常需要通過(guò)串口進(jìn)行不定長(zhǎng)數(shù)據(jù)包的傳輸。發(fā)送方很簡(jiǎn)單,不需特別的考慮,而接收方則需要能夠偵測(cè)到數(shù)據(jù)包的結(jié)束。接收方的簡(jiǎn)單做法是結(jié)合串口的IDLE中斷,或使用DMA并利用DMA的超時(shí)傳輸機(jī)制。
但有些MCU在設(shè)計(jì)時(shí)出于成本上的考慮,簡(jiǎn)化了串口接收的IDLE模式以及DMA超時(shí)傳輸機(jī)制。沒(méi)有串口IDLE中斷或者DMA超時(shí)傳輸?shù)臋C(jī)制,我們就不知道什么時(shí)候通信結(jié)束了。這種情況下,為了實(shí)現(xiàn)通過(guò)串口傳輸不定長(zhǎng)數(shù)據(jù)包的要求,需要使用軟件和其它片內(nèi)外設(shè)的配合,協(xié)同完成指定的功能。
LPC54101系列的UART模塊,支持FIFO的接收超時(shí),能夠方便地實(shí)現(xiàn)上述功能。除此之外,本文介紹一種基于LPC54101和SDK,通過(guò)使用引腳中斷和定時(shí)器配合,實(shí)現(xiàn)串口DMA接收超時(shí),實(shí)現(xiàn)串口DMA接收超時(shí)的機(jī)制。
先分析下UART傳輸?shù)臅r(shí)序,圖1是一個(gè)典型的8位數(shù)據(jù)位1位停止位的串口通信數(shù)據(jù)流。串口每次發(fā)送數(shù)據(jù)時(shí)會(huì)首先發(fā)送一個(gè)起始位,在TTL電平邏輯下,Start位首先是一個(gè)下降沿信號(hào)。
圖1. 串口接收數(shù)據(jù)時(shí)序圖
在串口DMA接收超時(shí)系統(tǒng)中,我們需要利用MCU的引腳中斷功能偵測(cè)這個(gè)下降沿信號(hào),引腳中斷觸發(fā)后告訴系統(tǒng)開(kāi)始計(jì)時(shí)。要特別注意的是,當(dāng)系統(tǒng)偵測(cè)到Start位的下降沿后最好關(guān)閉引腳中斷,不然后續(xù)數(shù)據(jù)流等信號(hào)的下降沿也會(huì)觸發(fā)引腳中斷使得整套方案失去了意義(還不如直接用串口接收完成中斷)。
LPC54101的引腳中斷可以在任意IO引腳上使能,所以可以直接把LPC54101的串口接收的引腳的中斷功能打開(kāi),并設(shè)置成下降沿觸發(fā)。
超時(shí)計(jì)數(shù)器最好是系統(tǒng)里的低功耗定時(shí)器,這個(gè)例程中我們用的是LPC54101的RIT定時(shí)器。超時(shí)的時(shí)間設(shè)置要考慮到當(dāng)前串口設(shè)置的波特率以及一次串口傳輸?shù)淖畲蟀L(zhǎng)。
超時(shí)定時(shí)器計(jì)數(shù)溢出產(chǎn)生中斷后,軟件首先要從DMA的狀態(tài)寄存器中獲取到當(dāng)前接收到數(shù)據(jù)的長(zhǎng)度(對(duì)于LPC54101來(lái)說(shuō),串口DMA接收數(shù)據(jù)的長(zhǎng)度在XFERCFGn寄存器中的XFERCOUNT位,如圖2所示),然后從串口DMA預(yù)設(shè)置的數(shù)據(jù)緩沖區(qū)獲取對(duì)應(yīng)的數(shù)據(jù)即可。
圖2. LPC54101 DMA傳輸數(shù)據(jù)長(zhǎng)度計(jì)數(shù)位
在初始化設(shè)置串口對(duì)應(yīng)的DMA通道時(shí),最好設(shè)置傳輸長(zhǎng)度為可能的最大長(zhǎng)度,在接收超時(shí)后也別忘記重新復(fù)位一下串口對(duì)應(yīng)DMA通道的狀態(tài),不然本次接收的數(shù)據(jù)和數(shù)據(jù)長(zhǎng)度還會(huì)帶入下次傳輸?shù)倪^(guò)程中。
圖3是例程的流程圖,分主程序,串口RX引腳中斷服務(wù)程序,超時(shí)定時(shí)器服務(wù)程序三個(gè)部分。
圖3. 程序流程圖
-
mcu
+關(guān)注
關(guān)注
146文章
17920瀏覽量
362903 -
串口
+關(guān)注
關(guān)注
15文章
1586瀏覽量
79622
原文標(biāo)題:在MCU中,如何實(shí)現(xiàn)串口的不定長(zhǎng)數(shù)據(jù)包接收?
文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
藍(lán)牙數(shù)據(jù)通道空口包(數(shù)據(jù)包)
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】使用RA4M2的串口實(shí)現(xiàn)任意任意類型任意長(zhǎng)度的數(shù)據(jù)接收,并將接收到的數(shù)據(jù)顯示在串口助手上
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】定時(shí)器輔助串口不定長(zhǎng)數(shù)據(jù)接收
為UART、MCXA142實(shí)現(xiàn)ISP通信的主機(jī)端,發(fā)送Ping數(shù)據(jù)包并收到預(yù)期的響應(yīng),發(fā)送和接收數(shù)據(jù)包的典型順序是什么?
如何使用DMA進(jìn)行USART不定長(zhǎng)度接收

評(píng)論