劉玉江LIU Yu-jiang
(遼寧對外經貿學院 信息技術系,大連 116052)
數據通信交換技術是指網絡中各臺計算機之間或者是計算機與計算機網絡設備之間進行數據通信時的信息交換技術。簡單的數據通信就是兩臺計算機之間或者計算機與計算機網絡設備(如打印機等)之間鏈路上的通信,數據通信交換技術的基本原理是通過某種交換方法,從源站點發出的信息經過多個節點或者網絡設備后到達目標站點。目前存在兩種數據傳輸方式,一種是并行傳輸,一種是串行傳輸。并行方式雖然使用了較多的線路和連接,但是傳輸速度更快。串行方式通信最少只需三根連接線,但是傳輸速度要比并行方式慢的多。因此在短距離數據通信方面以往主要采用并行方式。而在長距離通信時,基于連接線路復雜和成本高的考慮,主要采用串行方式。但是目前這種區別已經越來越不適用。由于系統小型化的要求越來越高,其內部部件也越來越小,串行通信由于其簡潔的通信方式越來越受到人們的重視。隨著技術的提高,串行傳輸的速率也得到了明顯的提高。
PIC16F877A內部是由MSSP模塊構成的SPI接口,可同步發送和接收8位數據, 通信只需3個或4個引腳。它支持SPI的所有四種方式。由于用SPI方式通信的兩臺設備在同一個時鐘下工作,因此,SPI至少需要發送(SDO)、接收(SDI)和時鐘(SCK)3根引腳線。為了加強主從機之間通信的靈活性,增加了從動方式選擇(SS)作為控制信號線。
SPI(Serial Peripheral Interface,串行外圍接口)是由MOTOROLA公司在20世紀70年代末至80年代初最先推出的一種同步串行傳輸規范,也是一種單片機外設芯片串行擴展接口。本文所采用的微芯公司的 PIC單片機的SPI接口就是在充分吸收了這兩種規范優點的基礎上開發出來。在PIC16F877A中配置了主控同步串行接口MSSP (Master Synchronous Serial Port ) 模塊[1,2],它兼容SPI和I2C兩種串行通信模式。在PIC16F877A中配置了主控同步串行接口MSSP(Master Synchronous Serial Port)模塊,兼容SPI和I2C 兩種串行通信模式[3]。
通信的雙方總有一方處于主動位置,負責通信過程的建立、結束,發送同步時鐘; 另一方則接受主控方的相應命令或時鐘,被動地發送或接收信號。主控方通過送出時鐘信號來啟動數據傳輸,在雙方約定好的時鐘邊沿(主從方時鐘邊沿一致) 下,數據從主、從方的移位寄存器中同步傳輸,并在下一個邊沿上被鎖定。每個時鐘周期完成一位數據交換,8個時鐘周期以后主從移位寄存器中的內容交換一次,并分別裝載到相應的緩沖器中與此同時緩沖器滿標志位和中斷標志位置位[4]。在SPI通信中這個過程可精簡為圖1的過程。


圖1 SPI數據收發示意圖
SSPEN是同步串端口使能位,置1則啟動串行端口并配置SCK,SDO,SDI,SS為串行端口引腳。CKP為時鐘極性選擇位,置1則時鐘空閑狀態為高電平。SSPM3到SSPM0四位為同步串行端口模式選擇位,在主控模式下用來設置時鐘,從動模式下用控制是否啟用SS\引腳控制。WCOL、SS-POV分別為寫沖突檢測位和接收溢出標志位。

SMP為采樣位,主控模式下置1表示在數據輸出結束時采樣輸入信號,0表示在數據輸出中段采樣輸入信號;從動模式下該位必須清零。CKE是SPI時鐘極性選擇位,1表示數據傳輸發生在時鐘信號由活動狀態轉向空閑狀態時,為0正好相反。BF是緩沖器滿狀態位(僅在接收模式下),1表示接收完成,SSPBUF滿。
在使用PIC16F877A的SPI口之前必須先對 MS S P進行初始化設置。與此相關的寄存器主要是同步串口控制寄存器(SSPCON1)和同步串口狀態寄存器(SSPSTAT )要設置的項目包括以下七點:
1)主控方式( Master Mode,SCK為時鐘輸出引腳 )
2)從動方式( Slave Mode,SCK為時鐘輸入引腳 )
3)時鐘極性( Polarity ,空閑時SCK的電平高低設置)
4)數據輸入采樣點(中間點或結束點)
5)時鐘沿選擇(數據是在時鐘SCK的上升沿還是下降沿輸出)
6)主控方式下的時鐘頻率(僅用于主控方式下)
7)從動方式下的從動選擇設置
首先將PIC單片機的SPI控制寄存器SSPCON的使能位SSPEN置1,這樣就可以使用SPI串行端口了,此時引腳SDI、SDO、SCK、SS為SPI接口的專用引腳。除了按照上述要求設置SSPCON和SSPSTAT寄存器以外,還需要對以上四個引腳進行方向控制位的設置。
在雙機通信中,分主控方( Master )和從控方(Slave)兩個模塊。主控方控制SCK信號。雙方嚴格按照“SPI串口通信協議” 發送和接收數據。其工作過程為:主控方發起傳送過程, 數據一旦寫入主控方緩沖器SSPBUF就開始讀取或發送數據,數據高位在前,低位在后。并自動在SCK端產生8個SCK時鐘周期給從控方。但是從控方,只有在SS\端被拉低時,才接收主控方SCK時鐘信號,并與 SCK同步發送或接收數據。主從控雙方,都在同一個SCK信號的一個跳變沿進行數據移位,在數據穩定后的另一跳變沿進行采樣。
正常接收或發送的相關標志位: 當接受完一個字節后,中斷標志位SSPIF和緩存器滿標志位BF相應置1。當接受數據的最后一位被鎖定,或發送數據的最后一位被移出后,中斷標志位SSPIF置1。
圖2為系統硬件連接示意圖。

圖2 雙機通信電路連接示意圖
圖3和圖4是簡化后的數據收發流程圖。
在以上通信過程中用到了握手信號,這主要是考慮到主從控雙方除了相互通信以外還可能執行其他功能,這樣做提高了程序的通用性。另外程序用匯編語言編寫, 這樣提高了代碼的執行效率。

圖3 主控方程序流程 圖4 從控方程序流程
/*主控端SPI初始化程序*/
…
bcf status, rpl
bsf status, rp0
movlw B`10000000`;設置C端口,SDO和SCK為輸出
movwf trisc
…
movlw B`01000000`;設置SMP=0, CKE=1
movwf sspstat
movlw B`00000110`
movwf adcon1
bcf status, rp0
movlw B`00110001`
movwf sspcon; 時鐘空閑為高,主控頻率為fosc/16,
…
/*主控端發送數據程序*/
…
movlw B`01010101`; 發送命令字B`01010101`
movwf sspbuf
call ready; 等待握手信號
nop
nop
movlw B`00101010;發送數據給從控端
movwf sspbuf
call ready
…
/*從控端主程序*/
…
bcf portb,1
bsf portb,1
call chaxun
movf sspbuf ,0 ;接受數據1
movwf data1
bcf portb,1
…
bsf portb,1
…
/*握手信號子程序*/
Ready
a btfss porta , 1; 等待數據可發送,可以添加握手信號來檢測
goto a
return
/*查詢是否接收到數據的子程序*/
Chaxun
bcf status, rp1
bsf status, rp0 STATUS,RP0
b btfss sspstat, bf
goto b
bcf status, rp0 BCF STATUS,RP0
return
通過試驗證明這種雙機通信方式是切實可行的,在高達5MHz的通信速率下沒有發生傳輸錯誤。盡管本文是雙機通信的模式,但主機可以通過增加從動器選擇線來控制從機的SS引腳的方式,擴展為一主多從的通信模式。另外本文中SS引腳的控制也可以放開。因此本文的設計方法具有較強的通用性和擴展性。
當然這種模式依然不可避免的存在諸如不能很好的適應多主控器情況、不能尋址、不夠靈活等局限性。但是正是由于它的簡單實用,在很多對通信要求不太高的場合,仍有它的實用價值。
[1] Korb,J,A Standard for the Transmission of IP Datagram over Public Data Network. RFC877,Purdue University,September,1993.
[2] 羅翼,張宏偉.PIC單片機應用系統開發典型實例[M].北京:中國電力出版社,2005.
[3] Tim wilmshurst,等.PIC嵌入式系統開發[M].北京:人民郵電出版社,2008.
[4] 金惠文,陳建亞,等.現代交換原理[M].北京:電子工業出版社,2005.