引言
Cortex-M3是ARM公司推出的32位處理器,,使用了最新一代的ARMv7架構(gòu),,具有高性能、低功耗和低成本的優(yōu)點(diǎn),。對那些對功耗與成本敏感,、但又要求較高性能的嵌入式應(yīng)用來說,,Correx-M3無疑是最佳解決方案;而對成本要求苛刻,、運(yùn)算能力要求不高的設(shè)備來說,,嵌入成熟穩(wěn)定的8051處理器,已經(jīng)成為了業(yè)內(nèi)的流行做法,。目前,,越來越多的嵌入式系統(tǒng)同時使用了上述兩種MCU,因此如何使Cortex-M3與8051之間可以高效地進(jìn)行信息交互,,是實(shí)現(xiàn)設(shè)計(jì)目標(biāo)的關(guān)鍵,。
1 方案設(shè)計(jì)
要進(jìn)行信息交互,離不開物理接口,。在嵌入式應(yīng)用中,,目前常用的接口有UART、SPI和I2C等串行接口,。UART接口只需兩根數(shù)據(jù)線就可以工作,,時序控制簡單,大部分設(shè)備都整合了這種接口,。而且,,經(jīng)過電平轉(zhuǎn)換后UART的TTL電平可以轉(zhuǎn)換成RS232電平,RS232接口是計(jì)算機(jī)標(biāo)準(zhǔn)配置的通信接口,,可以通過超級終端查看串口的數(shù)據(jù),,便于使用PC機(jī)對線路進(jìn)行檢測分析。因此,,本設(shè)計(jì)采用UART接口作為Cortex-M3與C51之間的通信接口,。
考慮到各種需求,本文設(shè)計(jì)了一種基于UART接口的,,用于Cortex-M3和C51之間的通信協(xié)議,,使Cortex-M3與C51之間可以高效地進(jìn)行信息交互。當(dāng)兩個MCU之間需要進(jìn)行通信的時候,,發(fā)送方把原始數(shù)據(jù)下放給通信協(xié)議,,通信協(xié)議按照特定格式把數(shù)據(jù)打包,通過UART接口發(fā)送給對方,。接收方收到數(shù)據(jù)時,MCU運(yùn)行相應(yīng)的通信協(xié)議,,把數(shù)據(jù)解包,,就可以得到發(fā)送方的原始數(shù)據(jù),將其交付給上層程序,。體系結(jié)構(gòu)如圖1所示,。
如果使用其他串行接口,,原理大體相同,只需對硬件作相應(yīng)改動,,即對接口控制模塊稍作修改即可投入使用,。
下面以實(shí)際工程中某種多媒體系統(tǒng)為例詳細(xì)說明。該系統(tǒng)采用了以Cortex-M3為內(nèi)核的STM32處理器和嵌入了C51核的MST776視頻處理芯片,,使用UART接口進(jìn)行通信,。
2 具體實(shí)現(xiàn)
2.1 硬件設(shè)置
具體的器件不同,UART的工作方式也有所區(qū)別,,主要表現(xiàn)在波特率,、停止位、數(shù)據(jù)字長度等參數(shù)上,。當(dāng)兩個器件用UART連接時,,所有參數(shù)必須完全一致,否則通信很容易出錯,。在此,,要特別注意波特率的設(shè)置:當(dāng)線路質(zhì)量好的時候,波特率可以設(shè)置得高點(diǎn),,以獲得較高的傳輸速率,;線路質(zhì)量差的時候,就要減小波特率,,以降低誤碼率,。
本設(shè)計(jì)中,STM32與MST776都整合了UART接口,,只需配置少量電阻,;同時,線纜長度不超過20 cm,,使用環(huán)境的電磁干擾小,,波特率可以設(shè)置為38 400bps,甚至更高,。另外,,考慮到C51的處理速度較低,因此波特率不應(yīng)設(shè)置得太高,,避免造成C51側(cè)數(shù)據(jù)溢出,,進(jìn)而造成死機(jī)。
本設(shè)計(jì)只需使用兩根數(shù)據(jù)線來實(shí)現(xiàn)兩個MCU之間的互連,,把STM32上選定的UART接口的TX與對端的UART接口的RX相連,,把RX與對端的UART接口的TX相連。
2.2 軟件設(shè)計(jì)
2.2.1數(shù)據(jù)幀解析
Cortex-M3側(cè)和C51側(cè)采用同樣的數(shù)據(jù)幀格式,,以簡化編程的難度,,增強(qiáng)程序的可移植性,。數(shù)據(jù)幀由起始標(biāo)識符、數(shù)據(jù)長度,、類型ID,、通信內(nèi)容、循環(huán)冗余校驗(yàn)碼構(gòu)成,,如圖2所示,。
(1)起始標(biāo)識符
起始標(biāo)識符的作用主要是用于定界,把不同的數(shù)據(jù)幀在一連串的數(shù)據(jù)中分離開來,。起始標(biāo)識符內(nèi)的數(shù)據(jù)不能與數(shù)據(jù)幀中可能出現(xiàn)的任何數(shù)據(jù)相同,,否則會引起歧義,導(dǎo)致定界失敗,,造成數(shù)據(jù)錯誤,。在本例中,為2個字節(jié),,選用0xFF+0xAA,,因?yàn)樵摻M合與其他數(shù)據(jù)具有排他性,不會引起歧義,。
(2)數(shù)據(jù)長度
數(shù)據(jù)長度的計(jì)算方法為,,從該位開始,到最后一個數(shù)據(jù)位結(jié)束,,也就是CRC校驗(yàn)位之前的一個字節(jié),。雖然使用Length位可以表示很長的數(shù)據(jù)幀,但在應(yīng)用中應(yīng)盡量采用短幀,,以避免各種干擾因素造成少數(shù)數(shù)據(jù)位出錯,,導(dǎo)致大量數(shù)據(jù)無效,影響通信效率,。同時,,應(yīng)該設(shè)置一個最大發(fā)送長度,以便設(shè)置超時重傳計(jì)時器的值,。本例采用1個字節(jié),,最大幀長為260個字節(jié)。
(3)類型ID
根據(jù)實(shí)際需要,,類型ID可以采用1個或多個字節(jié),,用于表示該數(shù)據(jù)幀的作用類型。本例中,,采用1個字節(jié),,可以表示256種作用類型,例如設(shè)備參數(shù)幀(如音量),、線路探測幀或應(yīng)答幀,。
(4)通信內(nèi)容
通信內(nèi)容與類型ID結(jié)合,表達(dá)特定意義,。相同的Data,,但I(xiàn)D不同的話,表達(dá)的信息不一樣,。根據(jù)不同的ID,,Data的長度可能會有所不同。
(5)循環(huán)冗余校驗(yàn)碼
循環(huán)冗余校驗(yàn)碼用于校驗(yàn)接收到的數(shù)據(jù)是否在傳輸過程中出錯,。本例中采用CRC-16算法,,占2個字節(jié),對從起始標(biāo)識符開始到最后一個通信內(nèi)容位的所有數(shù)據(jù)進(jìn)行運(yùn)算,,把得到的結(jié)果附在最后,。
2.2.2 收發(fā)流程
發(fā)送流程:將要發(fā)送的數(shù)據(jù)添加起始標(biāo)識符和長度后,計(jì)算CRC-16校驗(yàn)碼,,附在最后,,形成一個完整的數(shù)據(jù)幀,然后通過UART發(fā)送出去,。發(fā)送完畢后啟動超時重傳計(jì)時器,。
接收流程:當(dāng)接收到一個字節(jié)的數(shù)據(jù)時,根據(jù)系統(tǒng)狀態(tài)采取不同的操作,。當(dāng)數(shù)據(jù)上交后,,上層程序根據(jù)類型ID和通信內(nèi)容來作出相應(yīng)的響應(yīng)。具體流程如圖3所示,。
2.2.3 線路檢測機(jī)制
雖然本例中的UART接口是一種有線通信,,而且線纜長度不超過20 cm,但仍有可能出現(xiàn)插口松脫,、線纜銅芯斷裂等情況,,造成線路中斷。對于轉(zhuǎn)換成RS232電平的應(yīng)用,,雖然RS232的最大傳輸距離不超過15 m,,但如果在惡劣的環(huán)境中使用,仍無法完全避免線路發(fā)生中斷,。因
此,,有效的線路檢測機(jī)制是必需的。
本設(shè)計(jì)中,,當(dāng)本端系統(tǒng)狀態(tài)為Null時,,每間隔1 s就發(fā)送一個線路探測幀,類型ID=0x00,通信內(nèi)容=0x55,。同時,,如果本端在5 s內(nèi)收不到任何新數(shù)據(jù)或者線路探測幀,則表明線路中斷,,向上層程序發(fā)送線路中斷報(bào)告,。對于需要交互秒時間信息的應(yīng)用,線路探測幀可以省略,,只檢測秒時間信息就可以達(dá)到線路探測的目的,。
2.2.4 校正機(jī)制
因?yàn)榇型ㄐ牌毡榇嬖谡`碼的問題,因此簡單有效的校正機(jī)制是必須的,。由于采用的是點(diǎn)到點(diǎn)的串行接口,,數(shù)據(jù)幀都是按照發(fā)送的先后順序到達(dá)接收端,不會出現(xiàn)后一幀比前一幀早到的情況,,只需要采用CRC-16和簡單的ARQ機(jī)制,,再加上超時重傳機(jī)制,就可以提供高可靠的數(shù)據(jù)傳輸,。
接收方收到一個完整的數(shù)據(jù)幀之后,,必須給發(fā)送方返回一個ACK幀,該幀的類型ID=0xFF,。通信內(nèi)容根據(jù)校驗(yàn)的結(jié)果有所不同:校驗(yàn)正確的,,Data=1;校驗(yàn)失敗的,,Data=0,。
發(fā)送方發(fā)送完一個完整的數(shù)據(jù)幀之后,啟動超時重傳計(jì)時器,。如果在計(jì)時器超時之前沒有收到ACK幀,,或者收到的ACK幀的Data為0,就重發(fā)上一個數(shù)據(jù)幀,;當(dāng)收到ACK幀之后,,計(jì)時器歸零。發(fā)送方只有在收到Data為1的ACK幀后,,才能發(fā)送下一個數(shù)據(jù)幀,。當(dāng)連續(xù)超時5次時,表明線路中斷,,向上層程序發(fā)送線路中斷報(bào)告,。
ACK幀和線路檢測幀無須應(yīng)答。發(fā)送這兩種幀之后,,無須設(shè)置超時重傳計(jì)時器,。
2.2.5 接口控制
接口控制主要管理UART接口的收發(fā),,在此采用中斷的方式來實(shí)現(xiàn)。若有數(shù)據(jù)需要發(fā)送,,則必須等發(fā)送緩存為空時,,才能把數(shù)據(jù)寫入到發(fā)送緩存,否則會把舊的數(shù)據(jù)覆蓋掉,,造成數(shù)據(jù)丟失,。當(dāng)數(shù)據(jù)寫入結(jié)束后,產(chǎn)生一個發(fā)送中斷,,通知MCU把數(shù)據(jù)通過UART接口發(fā)送出去。當(dāng)收到一個數(shù)據(jù)時,,UART產(chǎn)生一個中斷信號,,通知MCU把數(shù)據(jù)放入接收緩存,保存完成后清除中斷信號,,等待接收下一個數(shù)據(jù),。只需修改接口控制部
分,就可以適用于不同的硬件接口,。
3 實(shí)驗(yàn)結(jié)果以及分析
為了驗(yàn)證本串行通信協(xié)議的有效性,,連接STM32和MST776的UART接口,在這兩個MCU上運(yùn)行本通信協(xié)議,,并在線纜上引出兩個探測點(diǎn),,使用MAX232芯片進(jìn)行電平轉(zhuǎn)換,然后接到PC機(jī)的RS232接口上,,進(jìn)行數(shù)據(jù)檢測,。通過Windows的超級終端,可以在PC機(jī)上看到UART接口收發(fā)數(shù)據(jù)的狀況,。同時,,通過JTAG接口可以看到通信協(xié)議向上層程序交付的數(shù)據(jù)。
實(shí)驗(yàn)結(jié)果表明,,本通信協(xié)議工作正常,,收發(fā)數(shù)據(jù)正確,校正機(jī)制和線路檢測機(jī)制都工作良好,。運(yùn)行本通信協(xié)議后,,兩個MCU都沒有出現(xiàn)數(shù)據(jù)溢出、死機(jī)等情況,。這表明本文設(shè)計(jì)的串口通信協(xié)議能夠?qū)崿F(xiàn)預(yù)期的功能,,令Cortex-M3與C51之間可以有效地進(jìn)行信息交互。
結(jié)語
本文基于Cortex-M3與C51之間的通信需求,,設(shè)計(jì)了一種基于數(shù)據(jù)幀的通信協(xié)議,,使得兩個MCU間可以進(jìn)行有效的信息交互。本設(shè)計(jì)已經(jīng)在某型多媒體系統(tǒng)上得到應(yīng)用,使用效果很好,,表現(xiàn)非常穩(wěn)定,。本設(shè)計(jì)具有良好的可移植性和通用性,在另一個嵌入式項(xiàng)目中,,經(jīng)過對程序的少量修改,,也在SPI接口上得到了應(yīng)用。