新聞中心

        EEPW首頁 > 手機與無線通信 > 設計應用 > 兩種MCU間的串行通信協議設計

        兩種MCU間的串行通信協議設計

        作者: 時間:2011-04-12 來源:網絡 收藏

        2.2.2 收發流程
        發送流程:將要發送的數據添加起始標識符和長度后,計算CRC-16校驗碼,附在最后,形成一個完整的數據幀,然后通過UART發送出去。發送完畢后啟動超時重傳計時器。
        接收流程:當接收到一個字節的數據時,根據系統狀態采取不同的操作。當數據上交后,上層程序根據類型ID和內容來作出相應的響應。具體流程如圖3所示。

        本文引用地址:http://www.104case.com/article/156421.htm

        c.jpg


        2.2.3 線路檢測機制
        雖然本例中的UART接口是一種有線,而且線纜長度不超過20 cm,但仍有可能出現插口松脫、線纜銅芯斷裂等情況,造成線路中斷。對于轉換成RS232電平的應用,雖然RS232的最大傳輸距離不超過15 m,但如果在惡劣的環境中使用,仍無法完全避免線路發生中斷。因
        此,有效的線路檢測機制是必需的。
        中,當本端系統狀態為Null時,每間隔1 s就發送一個線路探測幀,類型ID=0x00,內容=0x55。同時,如果本端在5 s內收不到任何新數據或者線路探測幀,則表明線路中斷,向上層程序發送線路中斷報告。對于需要交互秒時間信息的應用,線路探測幀可以省略,只檢測秒時間信息就可以達到線路探測的目的。
        2.2.4 校正機制
        因為通信普遍存在誤碼的問題,因此簡單有效的校正機制是必須的。由于采用的是點到點的接口,數據幀都是按照發送的先后順序到達接收端,不會出現后一幀比前一幀早到的情況,只需要采用CRC-16和簡單的ARQ機制,再加上超時重傳機制,就可以提供高可靠的數據傳輸。
        接收方收到一個完整的數據幀之后,必須給發送方返回一個ACK幀,該幀的類型ID=0xFF。通信內容根據校驗的結果有所不同:校驗正確的,Data=1;校驗失敗的,Data=0。
        發送方發送完一個完整的數據幀之后,啟動超時重傳計時器。如果在計時器超時之前沒有收到ACK幀,或者收到的ACK幀的Data為0,就重發上一個數據幀;當收到ACK幀之后,計時器歸零。發送方只有在收到Data為1的ACK幀后,才能發送下一個數據幀。當連續超時5次時,表明線路中斷,向上層程序發送線路中斷報告。
        ACK幀和線路檢測幀無須應答。發送這幀之后,無須設置超時重傳計時器。
        2.2.5 接口控制
        接口控制主要管理UART接口的收發,在此采用中斷的方式來實現。若有數據需要發送,則必須等發送緩存為空時,才能把數據寫入到發送緩存,否則會把舊的數據覆蓋掉,造成數據丟失。當數據寫入結束后,產生一個發送中斷,通知把數據通過UART接口發送出去。當收到一個數據時,UART產生一個中斷信號,通知把數據放入接收緩存,保存完成后清除中斷信號,等待接收下一個數據。只需修改接口控制部
        分,就可以適用于不同的硬件接口。

        3 實驗結果以及分析
        為了驗證本通信的有效性,連接STM32和MST776的UART接口,在這兩個上運行本通信,并在線纜上引出兩個探測點,使用MAX232芯片進行電平轉換,然后接到PC機的RS232接口上,進行數據檢測。通過Windows的超級終端,可以在PC機上看到UART接口收發數據的狀況。同時,通過JTAG接口可以看到通信向上層程序交付的數據。
        實驗結果表明,本通信協議工作正常,收發數據正確,校正機制和線路檢測機制都工作良好。運行本通信協議后,兩個MCU都沒有出現數據溢出、死機等情況。這表明本文的串口通信協議能夠實現預期的功能,令Cortex-M3與C51之間可以有效地進行信息交互。

        結語
        本文基于Cortex-M3與C51之間的通信需求,了一種基于數據幀的通信協議,使得兩個MCU間可以進行有效的信息交互。本設計已經在某型多媒體系統上得到應用,使用效果很好,表現非常穩定。本設計具有良好的可移植性和通用性,在另一個嵌入式項目中,經過對程序的少量修改,也在SPI接口上得到了應用。


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 乐安县| 鄢陵县| 杨浦区| 罗定市| 右玉县| 平邑县| 景东| 林口县| 扎鲁特旗| 永丰县| 浙江省| 赤城县| 康平县| 疏勒县| 罗江县| 三门县| 西城区| 威海市| 克什克腾旗| 彰武县| 建始县| 皮山县| 上虞市| 蓬安县| 灯塔市| 宁津县| 罗江县| 平安县| 临猗县| 古田县| 通城县| 普格县| 天峻县| 门源| 花莲县| 和顺县| 景泰县| 桓仁| 康定县| 高安市| 库伦旗|