數(shù)據(jù)帶寬=(總線頻率×數(shù)據(jù)位寬)÷8
B表示帶寬,F表示存儲(chǔ)器時(shí)鐘頻率,D表示存儲(chǔ)器數(shù)據(jù)總線位數(shù),則帶寬為:
B(峰值帶寬)=F(時(shí)鐘頻率MHz)×D(總線位數(shù)bit)/8
例如,PC-100的SDRAM帶寬計(jì)算如下:
100MHz×64bit/8=800MB/S
由于SPI(serial peripheral interface)總線占用的接口線(4根)少,通信效率高.eg:外接M25P64型號(hào)的SPIFLASH時(shí),SPI總線的最大傳輸速率為75MHz/8=9375KB/S,因?yàn)樵揝PIFLASH的頻率:75 MHz.普通IIC總線傳輸速率為10kbps--400kbps.并且SPI支持大部分處理器芯片,因而是一種理想的選擇.
SPI通信是串行發(fā)送或接收數(shù)據(jù)的,即一位一位的發(fā)送和接收(按位傳輸),且傳輸一般是高位MSB在前,低位LSB在后.
SPI模式可以允許同時(shí)同步發(fā)送和接收8位數(shù)據(jù),不同于IIC.IIC只有一條數(shù)據(jù)線,所以IIC每次只能發(fā)送數(shù)據(jù)或傳輸數(shù).SPI是利用4根信號(hào)線進(jìn)行通信的串行同步接口協(xié)議,包括主/從兩種模式.4個(gè)接口信號(hào)為:串行數(shù)據(jù)輸入(MISO,主設(shè)備輸入、從設(shè)備輸出)、串行數(shù)據(jù)輸出(MOSI,主設(shè)備輸出、從設(shè)備輸入)、移位時(shí)鐘(SCK)、低電平有效的從設(shè)備使能信號(hào)(CS).SPI最大的特點(diǎn)是由主設(shè)備時(shí)鐘信號(hào)的出現(xiàn)與否來確定主/從設(shè)備間的通信(不想傳數(shù)據(jù)時(shí)可采用停止時(shí)鐘的方式).一旦檢測到主設(shè)備的時(shí)鐘信號(hào),數(shù)據(jù)開始傳輸.
SPI在遠(yuǎn)距離傳輸中很少用到,主要因?yàn)槠淇垢蓴_能力差,可靠傳輸距離只有1—3m.SPI
采用的是單端非平衡的傳輸方式,即傳輸?shù)臄?shù)據(jù)位的電壓電平是以公共地作為參考的.在這種傳輸方式中,對(duì)于已進(jìn)入信號(hào)中的干擾是無法消除和減弱的.而信號(hào)在傳輸過程中總會(huì)受到干擾,而且距離越長干擾越嚴(yán)重,以致于信號(hào)傳輸產(chǎn)生錯(cuò)誤.在這種條件下,信號(hào)傳輸就變得毫無意義了.另外,由于單端非平衡傳輸方式以公共地作為參考點(diǎn),地線作為信號(hào)回流線,因此也存在信號(hào)電流.當(dāng)傳輸線兩端的系統(tǒng)之間存在交流電位差時(shí),這個(gè)電位差將直接竄到信號(hào)中,形成噪聲干擾.所以,為了解決抗干擾問題,通常采用平衡傳輸(balanced transmission)方式,這里采用比較常見的RS-422.
1. SPI器件的主從模式設(shè)置
SPI接口的器件,分為主設(shè)備(Master)和從設(shè)備(Slave).主設(shè)備產(chǎn)生時(shí)鐘信號(hào),從設(shè)備使用主設(shè)備的產(chǎn)生的時(shí)鐘.主設(shè)備能主動(dòng)發(fā)起數(shù)據(jù)傳輸.單片機(jī)的SPI控制寄存器SPCR中的MSTR位就是用來選擇單片機(jī)在傳輸中是作為主設(shè)備還是從設(shè)備的.MSTR設(shè)為1時(shí)為主設(shè)備,設(shè)為0的時(shí)候?yàn)閺脑O(shè)備.對(duì)單片機(jī)來講管腳SS的電平也會(huì)影響SPI的工作模式,在主設(shè)備模式下,如果SS是輸入且為低電平那么MSTR會(huì)被清零,設(shè)備進(jìn)入從模式.MISO信號(hào)由從機(jī)在主機(jī)的控制下產(chǎn)生.
下圖是由一個(gè)主機(jī)對(duì)接一個(gè)從機(jī)進(jìn)行全雙工通信的系統(tǒng)構(gòu)成的方式.在該系統(tǒng)中,由于主機(jī)和從機(jī)的角色是固定不變的,并且只有一個(gè)從機(jī),因此,可以將主機(jī)的SS端接高電平,將從機(jī)的SS端固定接地.
下圖是一個(gè)主機(jī)和多個(gè)從器件的通信系統(tǒng).各個(gè)從器件是單片機(jī)的外圍擴(kuò)展芯片,它們的片選端SS分別獨(dú)占單片機(jī)的一條通用I/O引腳,由單片機(jī)分時(shí)選通它們建立通信.這樣省去了單片機(jī)在通信線路上發(fā)送地址碼的麻煩,但是占用了單片機(jī)的引腳資源.當(dāng)外設(shè)器件只有一個(gè)時(shí),可以不必選通而直接將SS端接地即可.
采用由三個(gè)單片機(jī)互相連接構(gòu)成多主機(jī)通信系統(tǒng)連接方法如下:
2. SPI器件的時(shí)鐘極性和相位設(shè)置
所有的SPI設(shè)備都采用相同的接口方式,可以通過調(diào)整處理器內(nèi)部寄存器改變時(shí)鐘的極性和相位.由于SPI器件并不一定遵循同一標(biāo)準(zhǔn),比如EEPROM、DAC、ADC、實(shí)時(shí)時(shí)鐘及溫度傳感器等器件的SPI接口的時(shí)序都有所不同,為了能夠滿足不同的接口需要,采用時(shí)鐘的極性和相位可配就能夠調(diào)整SPI的通信時(shí)序.
SPI主機(jī)與之通信的從機(jī)的時(shí)鐘極性和相位應(yīng)該一致.可以先看看另一篇博文,專門講解了時(shí)鐘極性和相位:http://www.cnblogs.com/jason-lu/articles/3713319.html
SPI數(shù)據(jù)傳輸?shù)哪J礁鶕?jù)時(shí)鐘的極性和相位有四種組合,這就是四種不同的傳輸模式.分別稱為模式0,模式1,模式2,模式3.有的SPI接口的器件只支持幾種模式,比如SPI接口的EEPROMAT25128可以工作于模式0和模式3.在實(shí)際使用中需要設(shè)置為和外圍器件兼容的模式.
設(shè)置舉例:
M25P64數(shù)據(jù)手冊上給出的時(shí)鐘的極性和相位和數(shù)據(jù)讀寫的對(duì)應(yīng)的時(shí)序
如上圖所示:
時(shí)鐘極性和相位都是0時(shí),上升沿為前沿,數(shù)據(jù)穩(wěn)定被采樣(鎖存),下降沿為后沿,被寫入SPI總線.
時(shí)鐘極性和相位都是1時(shí),上升沿為后沿,數(shù)據(jù)穩(wěn)定被采樣(鎖存),下降沿為前沿,被寫入SPI總線.
和M25P64數(shù)據(jù)手冊上給出的時(shí)鐘的極性和相位和數(shù)據(jù)讀寫的對(duì)應(yīng)的時(shí)序匹配的omapl138數(shù)據(jù)手冊上給出的時(shí)序
注:
從機(jī)對(duì)時(shí)序的響應(yīng)和主機(jī)對(duì)時(shí)序的響應(yīng)相同但要比主機(jī)反應(yīng)遲鈍
圖30-9和圖30-10的區(qū)別:雖都表示時(shí)序上是下降沿寫上升沿讀,但30-10表示片選一拉低數(shù)據(jù)就被寫出,而30-9表示當(dāng)片選拉低后還要等時(shí)鐘的下降沿來臨數(shù)據(jù)才被寫出.
數(shù)據(jù)在上升沿被鎖存
所以對(duì)應(yīng)的程序:
//SPIFMT0寄存器 bit 8-15 是配置時(shí)鐘頻率,bit16是時(shí)鐘延時(shí),bit17是時(shí)鐘極性(在高電平觸發(fā)還是低電平觸發(fā))
SPI1->SPIFMT0 = 0x00020608;//startware配置 //SPI1->SPIFMT0 = 0x00010208;(ok logicpd配置)
3. SPI的傳輸原理
SPI設(shè)備傳輸數(shù)據(jù)過程中總是先發(fā)送或接收高字節(jié)數(shù)據(jù),每個(gè)時(shí)鐘周期接收器或收發(fā)器左移
1位數(shù)據(jù)(SPI總線是按位傳輸?shù)?.對(duì)于小于16位的數(shù)據(jù)在發(fā)送之前必須左對(duì)齊,如果接收的數(shù)據(jù)小于16位則采用軟件將無效的數(shù)據(jù)位屏蔽,如圖1所示.對(duì)應(yīng)的C代碼:
主機(jī)和從機(jī)都有一個(gè)串行移位寄存器,主機(jī)通過向它的SPI串行寄存器寫入一個(gè)字節(jié)來發(fā)起一次傳輸.主機(jī)的移位寄存器通過MOSI信號(hào)線將字節(jié)傳送給從機(jī)的移位寄存器,從機(jī)也將自己的移位寄存器中的內(nèi)容通過MISO信號(hào)線返回給主機(jī)的移位寄存器中(如下圖所示).這樣,兩個(gè)移位寄存器中的內(nèi)容就被交換.外設(shè)的寫操作和讀操作是同步完成的.
如果只進(jìn)行寫操作,主機(jī)只需忽略接收到的字節(jié);當(dāng)然,若主機(jī)要讀取從機(jī)的一個(gè)字節(jié),則應(yīng)該發(fā)送一個(gè)空字節(jié)來引發(fā)從機(jī)的傳輸.
SPI的傳輸實(shí)際上相當(dāng)于兩個(gè)八位移位寄存器首位相連.每個(gè)時(shí)鐘周期,數(shù)據(jù)從一個(gè)設(shè)備的移位寄存器移出,同時(shí)移入了另一個(gè)寄存器.八位數(shù)據(jù)全部移出時(shí),兩個(gè)寄存器就實(shí)現(xiàn)了一次數(shù)據(jù)交換.因此,SPI的發(fā)送和接收是同時(shí)進(jìn)行的,實(shí)際都是發(fā)送一個(gè)字節(jié)發(fā)起的,只不過需要接收的時(shí)候發(fā)送的是一個(gè)我們不關(guān)心的任意字節(jié).
4. SPI傳輸示例編程
當(dāng)主機(jī)發(fā)送一個(gè)連續(xù)的數(shù)據(jù)流時(shí),有些外設(shè)能夠進(jìn)行多字節(jié)傳輸.多數(shù)具有SPI接口的存儲(chǔ)芯片就以這種方式工作.在這種傳輸方式下,從機(jī)的片選端必須在整個(gè)傳輸過程中保持低電平.此時(shí),一次傳輸可能會(huì)涉及到成千上萬字節(jié)的信息,而不必在每個(gè)字節(jié)的數(shù)據(jù)發(fā)送的前后都去檢測其起始位和結(jié)束位(片選拉低開始,片選拉高結(jié)束),這正是同步傳輸方式優(yōu)于異步傳輸方式的原因所在.
針對(duì)外設(shè)是M25P64 外設(shè)的SPI的傳輸
方式:命令字(一個(gè)字節(jié))+FLASH的地址(三個(gè)字節(jié))+要發(fā)送或接收的數(shù)據(jù)(n個(gè)字節(jié))
/* Send read command to the flash (one byte) */
tx_data = 0x03; //SPI_FLASH_READ,這是單字節(jié)指令代碼 SpiTransfer(&tx_data, &rx_data, 1); /* Send the address to start reading from (3 bytes) ,共24位*/ addr[0] = (unsigned char)(flashAddr >> 16); addr[1] = (unsigned char)(flashAddr >> 8); addr[2] = (unsigned char)flashAddr; len = 0; while (len < sizeof(addr)) { SpiTransfer(&addr[len], &rx_data, 1); len++; } /* Read all the bytes */ len = 0; while(len < size) { SpiTransfer(&tx_data, destAddr, 1); destAddr++;//共20個(gè)字節(jié),一個(gè)字節(jié)一個(gè)字節(jié)放入 len++; } 命令字:
// numonyx spi flash commands. #define NUMONYX_CMD_WREN (0x06) #define NUMONYX_CMD_WRDI (0x04) #define NUMONYX_CMD_RDID (0x9F) #define NUMONYX_CMD_RDSR (0x05) #define NUMONYX_CMD_WRSR (0x01) #define NUMONYX_CMD_READ (0x03) #define NUMONYX_CMD_FAST_READ (0x0B) #define NUMONYX_CMD_PAGE_PROG (0x02) #define NUMONYX_CMD_SEC_ERASE (0xD8) #define NUMONYX_CMD_BULK_ERASE (0xC7) #define NUMONYX_CMD_RD_ELEC_SIG (0xAB)
評(píng)論
查看更多