SPI是英語Serial Peripheral interface的縮寫,顧名思義就是串行外圍設(shè)備接口,是Motorola首先在其MC68HCXX系列處理器上定義的。SPI接口主要應(yīng)用在 EEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字信號(hào)解碼器之間。SPI是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節(jié)約了芯片的管腳,同時(shí)為PCB的布局上節(jié)省空間,提供方便。 SPI的通信原理很簡單,它以主從方式工作,這種模式通常有一個(gè)主設(shè)備和一個(gè)或多個(gè)從設(shè)備,需要4根線,事實(shí)上3根也可以。也是所有基于SPI的設(shè)備共有的,它們是SDI(數(shù)據(jù)輸入),SDO(數(shù)據(jù)輸出),SCLK(時(shí)鐘),CS(片選)。 MOSI(SDO):主器件數(shù)據(jù)輸出,從器件數(shù)據(jù)輸入。 MISO(SDI):主器件數(shù)據(jù)輸入,從器件數(shù)據(jù)輸出。 SCLK :時(shí)鐘信號(hào),由主器件產(chǎn)生。 CS:從器件使能信號(hào),由主器件控制。 其中CS是控制芯片是否被選中的,也就是說只有片選信號(hào)為預(yù)先規(guī)定的使能信號(hào)時(shí)(高電位或低電位),對(duì)此芯片的操作才有效,這就允許在同一總線上連接多個(gè)SPI設(shè)備成為可能。需要注意的是,在具體的應(yīng)用中,當(dāng)一條SPI總線上連接有多個(gè)設(shè)備時(shí),SPI本身的CS有可能被其他的GPIO腳代替,即每個(gè)設(shè)備的CS腳被連接到處理器端不同的GPIO,通過操作不同的GPIO口來控制具體的需要操作的SPI設(shè)備,減少各個(gè)SPI設(shè)備間的干擾。 SPI是串行通訊協(xié)議,也就是說數(shù)據(jù)是一位一位從MSB或者LSB開始傳輸?shù)?,這就是SCK時(shí)鐘線存在的原因,由SCK提供時(shí)鐘脈沖,MISO、MOSI則基于此脈沖完成數(shù)據(jù)傳輸。 SPI支持4-32bits的串行數(shù)據(jù)傳輸,支持MSB和LSB,每次數(shù)據(jù)傳輸時(shí)當(dāng)從設(shè)備的大小端發(fā)生變化時(shí)需要重新設(shè)置SPI Master的大小端。 SPI interface SPI接口介紹 SPI是一個(gè)環(huán)形總線結(jié)構(gòu),由ss(cs)、sck、sdi、sdo構(gòu)成,其時(shí)序其實(shí)很簡單,主要是在sck的控制下,兩個(gè)雙向移位寄存器進(jìn)行數(shù)據(jù)交換。
假設(shè)下面的8位寄存器裝的是待發(fā)送的數(shù)據(jù)10101010,上升沿發(fā)送、下降沿接收、高位先發(fā)送。 那么第一個(gè)上升沿來的時(shí)候 數(shù)據(jù)將會(huì)是sdo=1;寄存器=0101010x。下降沿到來的時(shí)候,sdi上的電平將所存到寄存器中去,那么這時(shí)寄存器=0101010sdi,這樣在 8個(gè)時(shí)鐘脈沖以后,兩個(gè)寄存器的內(nèi)容互相交換一次。這樣就完成里一個(gè)spi時(shí)序。 例子: 假設(shè)主機(jī)和從機(jī)初始化就緒:并且主機(jī)的sbuff=0xaa,從機(jī)的sbuff=0x55,下面將分步對(duì)spi的8個(gè)時(shí)鐘周期的數(shù)據(jù)情況演示一遍:假設(shè)上升沿發(fā)送數(shù)據(jù)
這 樣就完成了兩個(gè)寄存器8位的交換,上面的上表示上升沿、下表示下降沿,sdi、sdo相對(duì)于主機(jī)而言的。其中ss引腳作為主機(jī)的時(shí)候,從機(jī)可以把它拉底被 動(dòng)選為從機(jī),作為從機(jī)的是時(shí)候,可以作為片選腳用。根據(jù)以上分析,一個(gè)完整的傳送周期是16位,即兩個(gè)字節(jié),因?yàn)?,首先主機(jī)要發(fā)送命令過去,然后從機(jī)根據(jù) 主機(jī)的名準(zhǔn)備數(shù)據(jù),主機(jī)在下一個(gè)8位時(shí)鐘周期才把數(shù)據(jù)讀回來 SPI 總線是Motorola公司推出的三線同步接口,同步串行3線方式進(jìn)行通信:一條時(shí)鐘線SCK,一條數(shù)據(jù)輸入線MOSI,一條數(shù)據(jù)輸出線MISO;用于 CPU與各種外圍器件進(jìn)行全雙工、同步串行通訊。SPI主要特點(diǎn)有:可以同時(shí)發(fā)出和接收串行數(shù)據(jù);可以當(dāng)作主機(jī)或從機(jī)工作;提供頻率可編程時(shí)鐘;發(fā)送結(jié)束 中斷標(biāo)志;寫沖突保護(hù);總線競爭保護(hù)等。圖3示出SPI總線工作的四種方式,其中使用的最為廣泛的是SPI0和SPI3方式(實(shí)線表示): 圖2 SPI總線四種工作方式
根據(jù)功能定義及SPI的工作原理,將整個(gè)IP Core分為8個(gè)子模塊:uC接口模塊、時(shí)鐘分頻模塊、發(fā)送數(shù)據(jù)FIFO模塊、接收數(shù)據(jù)FIFO模塊、狀態(tài)機(jī)模塊、發(fā)送數(shù)據(jù)邏輯模塊、接收數(shù)據(jù)邏輯模塊以及中斷形式模塊。 深入分析SPI的四種傳輸協(xié)議可以發(fā)現(xiàn),根據(jù)一種協(xié)議,只要對(duì)串行同步時(shí)鐘進(jìn)行轉(zhuǎn)換,就能得到其余的三種協(xié)議。為了簡化設(shè)計(jì)規(guī)定,如果要連續(xù)傳輸多個(gè)數(shù)據(jù),在兩個(gè)數(shù)據(jù)傳輸之間插入一個(gè)串行時(shí)鐘的空閑等待,這樣狀態(tài)機(jī)只需兩種狀態(tài)(空閑和工作)就能正確工作。 首先看一下mcu spi的工作過程:在空閑時(shí)SCLK 無信號(hào)。當(dāng)MCU發(fā)送數(shù)據(jù)時(shí)SCLK才會(huì)產(chǎn)生一個(gè)8位的sclk信號(hào)將數(shù)據(jù)發(fā)送出去。同理,如果MCU一直無動(dòng)作是不會(huì)有sclk信號(hào)的,如果想要讀取從機(jī)的值只能先往從機(jī)發(fā)送一個(gè)無意義的十六進(jìn)制數(shù)。這時(shí)才會(huì)在SCLK上出現(xiàn)時(shí)鐘信號(hào),而此時(shí)AD才會(huì)將數(shù)據(jù)通過dout發(fā)送出去。也就是說由于SPI通信要由主機(jī)產(chǎn)生sck時(shí)鐘信號(hào),只有存在時(shí)鐘才從機(jī)才能把寄存器內(nèi)數(shù)據(jù)發(fā)送出去,所以要保證發(fā)送的數(shù)據(jù)使得從機(jī)不會(huì)產(chǎn)生動(dòng)作(無效數(shù)據(jù)),SPI不能只接收不發(fā)送,在接收的時(shí)候必然也在發(fā)送數(shù)據(jù) |
|