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