SPI總線系統(tǒng)是一種同步串行外設接口;是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時為PCB的布局上節(jié)省空間,提供方便,正是出于這種簡單易用的特性,現(xiàn)在越來越多的芯片集成了這種通信協(xié)議。 許多的芯片都用這種協(xié)議通信:EEPROM、Flash、實時時鐘、AD轉換器、數(shù)字信號處理器等:MSP430的USART模塊不僅能夠實現(xiàn)異步模式(見:MSP430程序庫《二》UART異步串口),而且支持同步串行通信(即SPI模式);其SPI支持3線、4線操作,支持主機模式和從機模式,字符長度可以7位或8位等。由于要用AD7708芯片完成AD采樣,AD7708是通過SPI與其它設備通信的;本程序比較簡化,只完成了主機模式的初始化。
硬件介紹:
SPI:SPI是Motorola首先在其MC68HCXX系列處理器上定義的,它是一種同步的高速串行通信協(xié)議,有關SPI協(xié)議的詳細內容,參考:SPI_互動百科。
MSP430對SPI的支持:當msp430USART模塊控制器UxCTL的位SYNC置位時,USART模塊工作于同步模式,對于149即工作于SPI模式,若是169,USART0可以支持I2C,可以通過另一控制位I2C控制,I2C位0則工作于SPI。在SPI模式下,允許單片機以確定的速率發(fā)送和接收7位或8位數(shù)據(jù)。
同步通信與異步通信類似;同步通信和異步通信寄存器資源一致,具體寄存器的不同位之間的功能存在差異;具體寄存器內容參見TI提供的用戶指南。
USART模塊的SPI操作可以是3線和4線,其信號如下:
SIMO:從進主出,主機模式下,數(shù)據(jù)輸出;從機模式下,數(shù)據(jù)輸入。
SOMI:從出主進,主機模式下,數(shù)據(jù)輸入;從機模式下,數(shù)據(jù)輸出。
UCLK:USART SPI模式時鐘,信號有主機輸出,從機輸入。
STE:從機模式發(fā)送接收允許控制腳,用于4線模式,控制多主從系統(tǒng)中多個從機,避免發(fā)生沖突。具體方式如下(圖截自 用戶指南):
四線主機模式:STE為高電平,SIMO和UCLK操作正常;STE為低電平,SIMO和UCLK被置為輸入方向,主機控制權讓出。
四線從機模式:STE為高電平,從機的發(fā)送和接收無效,且把SOMI置為輸入方向;STE為低電平,發(fā)送接收正常,SOMI也為正常輸出。
USART模塊串行時鐘極性和相位設置:
USART的時鐘UCLK的極性和相位由位于UxTCTL寄存器的CKPH和CKPL位控制,具體如下圖:在程序中,我分別稱之為,時鐘模式0、時鐘模式1、時鐘模式2、時鐘模式3。
USART的波特率產(chǎn)生,SPI不同于異步通信:異步通信由UxBR1\UxBR0\UxMCTL三個寄存器控制,以產(chǎn)生標準頻率;而同步模式,主從設備用同一個時鐘,不再需要產(chǎn)生標準時鐘,故而不再用UxMCTL寄存器,設其值為0.
其他的,與異步通信基本一致,這里不再細說。具體參考用戶指南。
程序實現(xiàn):
程序和異步通信方式類似:首先是初始化函數(shù),然后是讀取數(shù)據(jù)、寫入數(shù)據(jù)函數(shù)。此程序采用和我之前的UART程序庫類似的結構,寫入數(shù)據(jù)后進入低功耗等待中斷,判斷標志位進行寫入數(shù)據(jù)和讀取數(shù)據(jù)。
這里函數(shù)只實現(xiàn)430的主機模式,如需從機模式可以仿照我的程序,進行簡化實現(xiàn)。
由于,我即將使用的SPI設備(AD7708)不是字符型設備,這里不再實現(xiàn)寫入字符串函數(shù),也不再移植printf和scanf函數(shù),如若需要可以自己添加,printf和scanf的移植參考:MSP430程序庫《四》printf和scanf函數(shù)移植
初始化函數(shù):SpiMasterInit,實現(xiàn)主機模式的初始化工作,函數(shù)內容如下:
程序注釋已經(jīng)比較詳細,這里不再細說;如果要改為從機模式,把時鐘設置和波特率設置去掉應該就可以了。
發(fā)送函數(shù)和接收函數(shù):
發(fā)送和接收函數(shù)和異步通信里面的幾乎一樣,如果標志位為0,則等待改變?yōu)?,然后寫入或讀出;標志位在中斷函數(shù)里被更改;中斷函數(shù)如下:
中斷里面僅僅置標志位后,就退出低功耗;退出后即寫入或者讀取數(shù)據(jù)。
讀取或寫入函數(shù)調用的SpiLpm函數(shù):
根據(jù)不同情況進入低功耗,如果單片機其他地方不允許進入低功耗,可以更改這個函數(shù)。
程序部分就這么多了。需要的函數(shù)在頭文件里面聲明,方便使用。
使用示例:
程序使用方式和之前的程序庫相同,加入c文件,包含h文件,調用初始化函數(shù)后即可掉用程序庫中的函數(shù)。
這里只是一個簡單的使用示例,詳細的使用,將會在下一篇給出,下一篇:MSP430程序庫《六》通過SPI操作AD7708;將會使用今天的程序庫,完成SPI的通信部分。
注意事項:
SPI是全雙工通信,每次寫入(發(fā)送)8位/7位數(shù)據(jù)的同時,430的SPI主模塊都會在發(fā)送后半個時鐘周期讀取采樣的0/1信號,存入接收緩沖寄存器,所以,每次的寫入,均有數(shù)據(jù)讀取,但不一定是從設備發(fā)送回來的,這個地方在使用430主機模式的時候必須注意,很容易出錯(我也是在調試AD7708的時候才注意到這個地方的);SPI的函數(shù)已經(jīng)添加SpiWriteData函數(shù),這個函數(shù)會在發(fā)送的同時返回發(fā)送完成半個時鐘周期后的接收到的數(shù)據(jù),方便使用;不建議使用前面的發(fā)送和讀取函數(shù),很容易出錯;建議使用剛添加的這個函數(shù),程序庫已經(jīng)更新,可以重新下載。函數(shù)SpiWriteData:
發(fā)送后讀取即可,程序比較簡單。
新的示例程序:
評論
查看更多