??? 摘 要:介紹了一種基于SPI總線技術的LPC2103對LED數(shù)碼管顯示實現(xiàn)控制的方法。采用8位74HC595串并轉換芯片驅(qū)動LED數(shù)碼管。結合74HC595芯片的特點給出了SPI控制的驅(qū)動電路,描述了基于SPI總線主模式的74HC595芯片的數(shù)據(jù)傳輸過程,給出了相關應用程序流程圖及軟件實現(xiàn)。
??? 關鍵詞: SPI總線;主模式;LPC2103;74HC595
?
??? SPI( Serial Peripheral Interface) 總線是Motorola公司提出的一個同步串行外設接口, 允許MCU與各種外圍器件以串行方式進行通信、數(shù)據(jù)交換。SPI可以同時發(fā)出和接收串行數(shù)據(jù), 它只需4條線就可以完成MCU與各種外圍器件的通信。一般使用的4條線為:串行時鐘線SCK、主機輸入/從機輸出數(shù)據(jù)線MISO、主機輸出/從機輸入數(shù)據(jù)線MOSI和低電平有效的從機選擇線SSEL。這些外圍器件可以是簡單的TTL移位寄存器、復雜的LCD顯示驅(qū)動器、Flash、RAM、A/D轉換器、網(wǎng)絡控制器及其他MCU等[1]。
??? 本文給出了一種基于SPI總線的LPC2103控制外圍LED顯示的設計方法。利用74HC595驅(qū)動靜態(tài)共陽LED數(shù)碼管,使用串轉并的方式實現(xiàn)I/O口的擴展。
1 LPC2103中的SPI功能特性
??? LPC2103是一個基于支持實時仿真的16/32位ARM7 TDMI-S CPU的微控制器,內(nèi)部具有2個完全獨立的SPI控制器,采用全雙工的數(shù)據(jù)通信方式,最大數(shù)據(jù)位速率為外設時鐘Fpclk的1/8。與SPI總線接口有關的專用寄存器有:(1)SPCR控制寄存器。該寄存器包含一些可編程位來控制SPI總線的功能,而且在數(shù)據(jù)傳輸之前進行設定,主要有時鐘相位控制、時鐘極性控制、主從模式選擇、字節(jié)傳輸移動方向及SPI中斷使能;(2)SPSR狀態(tài)寄存器(為只讀寄存器)。用于監(jiān)視SPI功能模塊的狀態(tài),包括一般性功能和異常情況。主要用途是檢測數(shù)據(jù)傳輸是否完成,通過判斷SPIF位來實現(xiàn),其他位用于指示異常情況;(3)SPDR數(shù)據(jù)寄存器。為SPI提供數(shù)據(jù)的發(fā)送和接收,處于主模式時,向該寄存器寫入數(shù)據(jù),將啟動SPI數(shù)據(jù)傳輸。串行數(shù)據(jù)的發(fā)送和接收通過內(nèi)部移位寄存器來實現(xiàn);(4)SPCCR時鐘計數(shù)器寄存器。用于設置SPI時鐘分頻值,SPI處于主模式時,該寄存器用于控制時鐘速率,即SPI總線速率,寄存器值為1位SCK時鐘所占用的PCLK周期數(shù),并且值為偶數(shù),必須不小于8;(5)SPINT中斷標志寄存器。包含了SPI的中斷標志位,由數(shù)據(jù)傳輸完成及發(fā)生模式錯誤來引發(fā)[2]。
1.1 SPI電氣連接
??? 利用SPI總線可在軟件的控制下構成各種系統(tǒng),如1個主MCU和幾個從MCU、幾個從MCU相互連接構成多主機系統(tǒng)(分布式系統(tǒng))、1個主MCU和1個或幾個從I/O設備所構成的各種系統(tǒng)等。在大多數(shù)應用場合, 可使用1個MCU 作為主機來控制數(shù)據(jù),并向1個或幾個從外圍器件傳送該數(shù)據(jù)。從器件只有在主機發(fā)命令時才能接收或發(fā)送數(shù)據(jù)。同一時刻只允許有1個主機操作總線。在數(shù)據(jù)傳輸過程中,總線上只能有1個主機和1個從機通信。在一次數(shù)據(jù)傳輸中,主機總是向從機發(fā)送1個字節(jié)數(shù)據(jù),而從機也總是向主機發(fā)送1個字節(jié)數(shù)據(jù)[3]。圖1為SPI在主模式下控制2個SPI從機的硬件連接圖。
?
?
1.2 SPI數(shù)據(jù)傳輸
??? 在SPI數(shù)據(jù)傳輸中,SPCR控制寄存器的CPHA和CPOL位作用非常關鍵。CPHA為時鐘相位控制,該位決定SPI傳輸時數(shù)據(jù)和時鐘的關系,并控制從機傳輸?shù)钠鹗己徒Y束,該位為1,時鐘前沿數(shù)據(jù)輸出,后沿數(shù)據(jù)采樣;為0,時鐘前沿數(shù)據(jù)采樣,后沿數(shù)據(jù)輸出。CPOL為時鐘極性控制,為1時,SCK為低電平有效;為0時,SCK為高電平有效[4]。
??? 圖2為SPI的4種不同數(shù)據(jù)傳輸格式時序,描述的是8位數(shù)據(jù)傳輸。該時序圖水平方向分成3部分:(1)描述SCK和SSEL信號;(2)描述CPHA為0時的MOSI和MISO信號;(3)描述CPHA為1時的MOSI和MISO信號。SSEL信號為低電平,說明SPI工作在從模式。其中,MOSI和MISO信號中的bit1~bit8表示傳輸?shù)牡趲孜粩?shù)據(jù)。
?
2 74HC595擴展I/O接口電路
??? SPI是一個串行輸入輸出的接口,使用串轉并的接口芯片可以實現(xiàn)擴展I/O口。74HC595芯片為一種常用的8位串轉并移位寄存器芯片,本系統(tǒng)利用74HC595來驅(qū)動靜態(tài)共陽LED數(shù)碼管。74HC595的主要優(yōu)點:具有數(shù)據(jù)存儲寄存器,在移位過程中,輸出端的數(shù)據(jù)可以保持不變。這在串行速度慢的場合很有用處,數(shù)碼管沒有閃爍感。LPC2103工作在SPI主模式下。
??? 圖3為74HC595邏輯圖。圖中,SI為串行數(shù)據(jù)輸入引腳,用來連接LPC2103的MOSI功能引腳;SCK為移位寄存器的時鐘輸入,連接LPC2103串行時鐘線SCK;為清移位寄存器引腳;RCK為鎖寄存器鎖存時鐘引腳;即輸出觸發(fā)端與SSEL連接;為輸出使能引腳;SQH為串行數(shù)據(jù)輸出引腳,連接MISO;QA~QH引腳為并行輸出。當為高電平、使能接低時,SCK產(chǎn)生一個上升沿,SI引腳當前電平值將在移位寄存器中左移1位,在下一個上升沿到來時移位寄存器中的所有位都會向左移1位,同時SQH引腳也會串行輸出移位寄存器中的高位的值。當RCK產(chǎn)生上升沿時,移位寄存器的值將會被鎖存到鎖存器里,并從QA~QH引腳輸出。
?
??? 圖4為SPI接口與74HC595的連接原理圖。其中QA~QH分別連接共陽LED數(shù)碼管的8個段。在SPI輸出1個字節(jié)的數(shù)據(jù)時,SSEL產(chǎn)生1個低電平,SPI主機串行地發(fā)該字節(jié)的各個位,各個位都依次被鎖存在74HC595的移位寄存器內(nèi),當1個字節(jié)的數(shù)據(jù)傳輸完成后,SSEL由低電平變?yōu)楦唠娖?,從而?4HC595的移位寄存器的值被鎖存到74HC595的鎖存器并從其QA~QH引腳輸出;在SPI輸出1個字節(jié)數(shù)據(jù)的同時,74HC595移位寄存器之前的值也通過MISO引腳被SPI主機讀回。
?
?
3? 軟件設計[5]
??? 軟件設計包括:進行I/O口初始化,設置SPI引腳連接,啟用LPC2103的SPI 0總線,設置GPIO的P0.4、P0.5、P0.6、P0.7為SPI 0總線的SCK0、MISO0、MOSI0、SSEL0特殊功能,置74HC595片選端的I/O口為輸出功能。其代碼如下:
??? PINSEL0=0x00005500;? //設置SPI引腳連接
??? PINSEL1=0x00000000;
??? IODIR=HC595_CS;? //設置片選端I/O口為輸出
3.1 SPI總線操作初始化
??? 圖5為SPI總線操作流程圖。使用LPC2103的SPI總線主模式下實現(xiàn)對74HC595的數(shù)據(jù)傳輸,用來驅(qū)動外圍LED數(shù)碼管。設置SPI時鐘,在SPI主模式下,SPCCR寄存器控制SCK的頻率,SPI速率為Fpclk / SPCCR。通過SPCR控制寄存器設置時鐘相位、時鐘極性、主模式控制、字節(jié)移動方向及SPI中斷使能等。代碼實現(xiàn)如下:
?
??? Void MSpiIni(void)
??? {? SPI_SPCCR = 0x52;??//設置SPI時鐘分頻
??? ?? SPI_SPCR? = (0<<3)|??//CPHA=0,數(shù)據(jù)再從SCK的第一時鐘沿采樣
?????????????? (1<<4)|???//CPOL=1,SCK為低有效
?????????????? (1<<5)|???//MSTR=1,SPI處于主模式
?????????????? (0<<6)|???//LSBF=0,SPI數(shù)據(jù)傳輸MSB(位7)在先
?????????????? (0<<7);???//SPIE=0,SPI中斷被禁止
??? }
3.2 SPI總線主模式下數(shù)據(jù)發(fā)送過程
??? 首先選擇從機,設置片選。選擇74HC595為從機,置片選端SSEL為低有效。將發(fā)送的數(shù)據(jù)寫入SPDR,發(fā)送出去。等待SPIF置位,即數(shù)據(jù)發(fā)送完畢。最后可從SPDR讀取收到的數(shù)據(jù)。以下為發(fā)送函數(shù):
??? uint8 MSendData(uint8 data)
??? {??? IOCLR=HC595_CS;?? //片選端,由LPC2103指定的I/O口置位
??? ???? SPI_SPDR=data;
??? ???? while(0==(SPI_SPSR&0x80));??? //等待SPIF置位,即等待數(shù)據(jù)發(fā)送完畢
??? ???? IOSET=HC595_CS;? //片選置高無效,結束發(fā)送
??? ???? return(SPI_SPDR);?? //返回接收到的數(shù)據(jù)
??? }
3.3 控制LED數(shù)碼管主函數(shù)
??? 主函數(shù)使用LPC2103的SPI接口輸出給74HC595,用來控制LED數(shù)碼管顯示。DISP_TAB[ ]為LED顯示0-F字模的16進制碼表。MSendData( )實現(xiàn)每一字節(jié)數(shù)據(jù)的發(fā)送。
??? #define?? HC595_CS??? 0x00000100???????? //P0.8口為74HC595的片選
??? uint8 const DISP_TAB[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
??? int main(void)
??? {?? uint8 rcv_data;
??? uint8 i;
??? PINSEL0=0x00005500;??? ?//設置SPI引腳連接
??? PINSEL1=0x00000000;
??? IODIR=HC595_CS;???????????? //設置LPC2103片選I/O口為輸出功能
??? MSpiIni( );???????????????????????? ?//初始化SPI接口
??? while(1)
??? { for (i=0;i<16;i++)
??? ???? {rcv_data=MSendData(DISP_TAB[i]);?? //發(fā)送顯示數(shù)據(jù)
?????? ?? DelayNS(50);??????????????????? ? //延時
???????}
??? }
?????? return(0);
}
??? 基于SPI總線的數(shù)據(jù)通信技術已經(jīng)廣泛應用在MCU與各種外圍設備的串行通信中。如存儲系統(tǒng)、A/D轉換系統(tǒng)、網(wǎng)絡控制器和多MCU構成的分布式系統(tǒng)。本文給出了74HC595芯片驅(qū)動LED數(shù)碼管顯示的電路,采用SPI總線技術實現(xiàn)對LED顯示的數(shù)據(jù)傳輸,方便快捷、準確性高、速度快,滿足了復雜微控制系統(tǒng)對外圍設備控制的要求。
參考文獻
[1]?廣州周立功單片機發(fā)展有限公司.EasyARM2103教材.2007:98-108.
[2]?華卓立,姚若河.一種通用SPI總線接口的FPGA設計與實現(xiàn)[J].微計算機信息,2008, 24(6): 212-213.
[3]?周立功.ARM嵌入式系統(tǒng)基礎教程.北京:北京航空航天大學出版社,2005: 350-354.
[4]?張經(jīng)愛,許凱華,劉玉華.基于MSP430的模擬SPI串口通信的實現(xiàn)[J].計算機工程與設計,2008, 29(5): 1169-1171.
[5]?蔡堯,崔峰,賀玉成,等.Liunx環(huán)境下基于MPC8250的SPI接口驅(qū)動程序開發(fā)[J].電子元器件應用,2007, 9(11): 12-15.