[摘 要]:本文介紹一種基于SPI 接口的高速可靠的多微處理器擴(kuò)展和通信方法,包括該方法的實(shí)現(xiàn)原理、硬件連接和軟件實(shí)現(xiàn)等。
[關(guān)鍵詞]:SPI 接口,通信,擴(kuò)展
1 引言
現(xiàn)代測(cè)控領(lǐng)域中,工業(yè)電子產(chǎn)品往往不是孤立存在的,而是需要能夠數(shù)據(jù)共享,實(shí)現(xiàn)多機(jī)通信的功能,因而在大多數(shù)電子產(chǎn)品的設(shè)計(jì)中要考慮多機(jī)擴(kuò)展和通信問(wèn)題。比如在各種采用微處理器的控制系統(tǒng)中,就要求能實(shí)現(xiàn)多微處理器的柔性擴(kuò)展和它們之間的數(shù)據(jù)通信。本文以AVR 單片機(jī)組成的一主兩從系統(tǒng)為例,介紹一種基于 SPI 接口的高速可靠的多微處理器擴(kuò)展和通信方法,包括該方法的實(shí)現(xiàn)原理、硬件連接和軟件實(shí)現(xiàn)。
2 通信接口的選擇
通信接口的選擇關(guān)系到整個(gè)多機(jī)擴(kuò)展的構(gòu)成和通信方案的設(shè)計(jì)。微控制器的通信方式包括并行通信和串行通信,其中串行通信方式有 SPI 通信接口、UART 通信接口、I2C 通信接口等。在通信接口的選擇中,通信的可靠性要放在首位。由于并行通信方式通道間會(huì)有互相干擾,當(dāng)傳輸出錯(cuò)時(shí),要重新傳送數(shù)據(jù),而且要求數(shù)據(jù)同時(shí)到達(dá)接收端,但往往各通道由于布線(xiàn)長(zhǎng)度不一等原因難以保證真正的一致性。另外采用并行通信方式占用了較多的 I/O 資源,不適合于小型系統(tǒng),所以本文選擇了串行通信方式?;?SPI通信接口的速度較快,而且通信協(xié)議也較為簡(jiǎn)單,相對(duì)來(lái)說(shuō)也比較穩(wěn)定等優(yōu)點(diǎn),本設(shè)計(jì)就選用 SPI 接口來(lái)實(shí)現(xiàn)多機(jī)通信。
SPI 接口是全雙工同步串行外設(shè)接口,采用主從模式架構(gòu),支持單主多從模式應(yīng)用。時(shí)鐘由主機(jī)控制,在時(shí)鐘移位脈沖下,數(shù)據(jù)按位傳輸,輸入輸出為全雙工通信方式。SPI 數(shù)據(jù)通信時(shí)的主-從連接與數(shù)據(jù)傳送方式如圖 1 所示。
圖1 SPI 數(shù)據(jù)通信時(shí)的主-從機(jī)連接與數(shù)據(jù)傳送方式
由圖1可知,SPI 數(shù)據(jù)傳輸系統(tǒng)是由主機(jī)和從機(jī)兩部分組成;主要是由主、從雙方的兩個(gè)移位寄存器和主機(jī) SPI 時(shí)鐘發(fā)生器組成,主機(jī)為 SPI 數(shù)據(jù)傳輸?shù)目刂品健SS為從設(shè)備選擇管腳,對(duì)于主機(jī),無(wú)用,可配置為GPIO口用于選擇從機(jī);通知從機(jī)進(jìn)入傳輸狀態(tài),然后主機(jī)啟動(dòng)時(shí)鐘發(fā)生器產(chǎn)生同步時(shí)鐘信號(hào)SCK,預(yù)先存在兩個(gè)移位寄存器中的數(shù)據(jù)在 SCK 的驅(qū)動(dòng)下進(jìn)行循環(huán)移位操作,完成主-從機(jī)之間的數(shù)據(jù)交換,傳輸?shù)臄?shù)據(jù)為 8 位,按位傳輸。
SPI 通過(guò)一根時(shí)鐘引線(xiàn) SCK 將主機(jī)和從機(jī)同步,主機(jī)的數(shù)據(jù)由 MOSI 進(jìn)入從機(jī),而同時(shí)從機(jī)的數(shù)據(jù)由MISO 進(jìn)入主機(jī)。因此,它的串行數(shù)據(jù)交換不需要增加起始位、停止位等用于同步的格式位,直接將要傳送的數(shù)據(jù)寫(xiě)入到主機(jī)的 SPI 發(fā)送數(shù)據(jù)寄存器,這個(gè)寫(xiě)入過(guò)程自動(dòng)啟動(dòng)主機(jī)的發(fā)送過(guò)程。對(duì)于從機(jī),同樣在SCK 的節(jié)拍下將出現(xiàn)在引腳 MOSI 上的數(shù)據(jù)逐位移到從機(jī)的移位寄存器,當(dāng)接收完一個(gè)完整的數(shù)據(jù)塊后,設(shè)置中斷標(biāo)志,通知從機(jī)這個(gè)數(shù)據(jù)塊已接收完畢,同時(shí)將移位寄存器接收到的內(nèi)容復(fù)制到從機(jī)的SPI接收數(shù)據(jù)寄存器。可以看出,用戶(hù)編程只需在發(fā)送數(shù)據(jù)時(shí)寫(xiě)數(shù)據(jù)到SPI發(fā)送數(shù)據(jù)寄存器,在接收數(shù)據(jù)時(shí)讀SPI接收數(shù)據(jù)寄存器,其余的移位、同步、置位收發(fā)標(biāo)志等工作都由內(nèi)置的 SPI 模塊自動(dòng)完成。
3 多機(jī)擴(kuò)展和通信的實(shí)現(xiàn)原理
以一主兩從的系統(tǒng)結(jié)構(gòu)、主從都以 Atmega128 單片機(jī)為例,介紹多機(jī)擴(kuò)展和通信方案。系統(tǒng)框圖如圖2 所示,主機(jī)分別同兩個(gè)從機(jī)的 SPI 接口相連,另外主從機(jī)間還增加了地址分配使能線(xiàn) AD。在理論上這種擴(kuò)展方法可以實(shí)現(xiàn)無(wú)數(shù)個(gè)從機(jī)的擴(kuò)展和通信。
圖2 系統(tǒng)框圖
3.1 地址分配
在多機(jī)通信系統(tǒng)中,主機(jī)通過(guò)從機(jī)地址對(duì)各個(gè)從機(jī)進(jìn)行訪(fǎng)問(wèn),因此,要求每個(gè)從機(jī)都有唯一的地址。為確保地址的唯一性和可靠性,就必須對(duì)從機(jī)進(jìn)行統(tǒng)一編址。
常用編址方式是將撥碼開(kāi)關(guān)連接在從機(jī)的 I/O上,用人工撥碼來(lái)實(shí)現(xiàn)編址。撥碼開(kāi)關(guān)打開(kāi)和關(guān)閉分別代表著 0 和 1,這也就代表著一定的數(shù)據(jù),這個(gè)數(shù)據(jù)就是該從機(jī)的地址。這種硬編址方式簡(jiǎn)單且容易操作,但是占用從機(jī)的 I/O 資源。當(dāng)從機(jī)數(shù)量增加時(shí),用于撥碼開(kāi)關(guān)的 I/O 口也要相應(yīng)地增加,而且編址需要人工操作來(lái)實(shí)現(xiàn),在實(shí)際應(yīng)用中很不方便。
本文設(shè)計(jì)了一種軟件編址方式,采用主機(jī)自動(dòng)給從機(jī)分配地址的方法。在硬件上,只需在 SPI 通信接口的基礎(chǔ)上增加一根地址分配使能線(xiàn)就能實(shí)現(xiàn),如圖2 所示。其實(shí)現(xiàn)原理是:主機(jī)通過(guò)AD線(xiàn)向從機(jī)1發(fā)出處理地址分配使能信號(hào),與此同時(shí),從機(jī) 1 通過(guò) AD 線(xiàn)禁止從機(jī) 2 地址分配使能,保證在地址分配期間某一時(shí)刻只有一個(gè)從機(jī)進(jìn)行地址信息處理。主機(jī)通過(guò) SPI 接口向各從機(jī)發(fā)出地址分配信息,從機(jī)都接收到主機(jī)傳來(lái)的地址信息,但此時(shí)只有從機(jī) 1 的地址分配是使能的,所以只有從機(jī)1 對(duì)地址分配信息進(jìn)行處理,通過(guò)以下時(shí)序?qū)臋C(jī) 1 進(jìn)行地址分配:
① 主機(jī)向從機(jī)發(fā)送地址分配起始標(biāo)識(shí)符‘(’,告訴從機(jī)此時(shí)進(jìn)行地址分配操作,從機(jī) 1 向主機(jī)反饋確認(rèn)信息;
② 主機(jī)向從機(jī)發(fā)送地址,從機(jī) 1 進(jìn)行地址存儲(chǔ)并向主機(jī)反饋確認(rèn)信息;
③ 主機(jī)向從機(jī)發(fā)送地址分配結(jié)束標(biāo)識(shí)符‘)’,告訴從機(jī)已完成地址分配。
主機(jī)成功對(duì)從機(jī) 1 進(jìn)行地址分配后,主機(jī)關(guān)閉從機(jī) 1 的地址分配使能,從機(jī) 1 開(kāi)啟從機(jī) 2 的地址分配使能,同理,依照以上時(shí)序,主機(jī)完成對(duì)所有從機(jī)的地址分配。
3.2 數(shù)據(jù)查詢(xún)
主機(jī)對(duì)所有的從機(jī)進(jìn)行了統(tǒng)一編址后,每個(gè)從機(jī)都擁有了唯一的地址,這樣主機(jī)和從機(jī)之間就可以進(jìn)行數(shù)據(jù)查詢(xún)和發(fā)送操作了。數(shù)據(jù)查詢(xún)操作時(shí),首先主機(jī)向所有從機(jī)發(fā)出其要查詢(xún)從機(jī)的地址,所有從機(jī)接到主機(jī)發(fā)來(lái)的地址后和自己的地址信息進(jìn)行比較,地址匹配的從機(jī)就響應(yīng)主機(jī)并將數(shù)據(jù)傳給主機(jī),這樣就完成了主機(jī)對(duì)一個(gè)從機(jī)的數(shù)據(jù)查詢(xún)。數(shù)據(jù)查詢(xún)操作的時(shí)序?yàn)椋?/p>
① 主機(jī)向從機(jī)發(fā)送數(shù)據(jù)查詢(xún)起始標(biāo)識(shí)符‘[’,從機(jī)以此識(shí)別為數(shù)據(jù)查詢(xún)操作;
② 主機(jī)向從機(jī)發(fā)送數(shù)據(jù)查詢(xún)的地址值,從機(jī)接收地址信息并和自己的地址比較,相同者才進(jìn)行下面的操作,不同者就不做任何操作;
③ 對(duì)應(yīng)地址的從機(jī)向主機(jī)發(fā)回?cái)?shù)據(jù),主機(jī)進(jìn)行數(shù)據(jù)接收;
④ 從機(jī)向主機(jī)發(fā)送數(shù)據(jù)結(jié)束標(biāo)識(shí)符‘]’,告訴主機(jī)數(shù)據(jù)傳送結(jié)束。
依照時(shí)序,主機(jī)就可以對(duì)全部從機(jī)或者某個(gè)從機(jī)進(jìn)行數(shù)據(jù)查詢(xún)。
3.3 數(shù)據(jù)發(fā)送
數(shù)據(jù)發(fā)送操作時(shí),首先主機(jī)向所有需要向其發(fā)送數(shù)據(jù)的從機(jī)發(fā)出地址信息,所有從機(jī)接到主機(jī)發(fā)來(lái)的地址后和自己的地址信息進(jìn)行比較,地址匹配的從機(jī)就響應(yīng)主機(jī)并做好接受數(shù)據(jù)的準(zhǔn)備,這樣就完成了主機(jī)向一個(gè)從機(jī)發(fā)送數(shù)據(jù)的過(guò)程。數(shù)發(fā)送的時(shí)序?yàn)椋?/p>
① 主機(jī)向從機(jī)發(fā)送數(shù)據(jù)及起始標(biāo)識(shí)符‘<’,從機(jī)以此識(shí)別為數(shù)據(jù)發(fā)送操作;
② 主機(jī)根據(jù)從機(jī)地址發(fā)送數(shù)據(jù),從機(jī)接收地址信息并和自己的地址比較,相同者才進(jìn)行下面的操作,不同者就不做任何操作;
③ 主機(jī)向從機(jī)發(fā)送數(shù)據(jù);
④ 結(jié)束后主機(jī)向從機(jī)發(fā)送數(shù)據(jù)結(jié)束標(biāo)識(shí)符‘>’,告訴從機(jī)數(shù)據(jù)傳送結(jié)束。
依照時(shí)序,主機(jī)就可以根據(jù)需要向全部或者某個(gè)從機(jī)進(jìn)行數(shù)據(jù)發(fā)送。
4 結(jié)束語(yǔ)
本文介紹了一種多機(jī)擴(kuò)展和通信的實(shí)現(xiàn)方法,該方法在標(biāo)準(zhǔn) SPI 接口的基礎(chǔ)上加上一根普通 I/O 線(xiàn)并采用軟件編址的方式來(lái)實(shí)現(xiàn)了對(duì)從機(jī)的地址分配,與硬件編址方式比較更節(jié)省 I/O 資源且簡(jiǎn)單并容易實(shí)現(xiàn),基于 SPI 接口,數(shù)據(jù)查詢(xún)發(fā)送的通信速率更快,本文所提出的多機(jī)擴(kuò)展和通信方法簡(jiǎn)單可行、安全可靠,值得推廣。
參考文獻(xiàn):
[1] 胡漢才. 單片機(jī)原理及其接口技術(shù)[M].北京:清華大學(xué)出版社,2004.
[2] 趙凱,黃珊. TLl6C550在TMS320VC5402與PC機(jī)串行通信中的應(yīng)用[J].國(guó)外電子元器,2007,(9):17-20.
[3] 徐明,堵國(guó)梁. 雙向透明串口擴(kuò)展技術(shù)在嵌入式系統(tǒng)中的實(shí)現(xiàn)[J].信息化縱橫,2009,(14):31-34.
[4] 馬忠梅.單片機(jī)的C語(yǔ)言應(yīng)用程序設(shè)計(jì)[M]. 北京:北京航天航空大學(xué)出版社,2007.