SPI的英文全稱是:“Serial Peripheral Interface”,翻譯成中文的意思是串口通信外圍設(shè)備接口技術(shù)。也就是把數(shù)據(jù)用串口傳輸方式進(jìn)行交換。它有一個(gè)主控制器,一般我們采用微處理器,比如常用的單片機(jī),以及一些其它的外圍設(shè)置,比如數(shù)碼管,液晶顯示頻,SD卡等外圍設(shè)備。
它一般是由5根線組成的:分別是MOSI,MISO,SCK, SS以及地線,電源線。
MOSI:是由主機(jī)向設(shè)備發(fā)出數(shù)據(jù)的。
MISO:是由設(shè)備向主機(jī)發(fā)送數(shù)據(jù)的。
SCK:是起到一個(gè)控制數(shù)據(jù)傳輸?shù)男?zhǔn),根據(jù)arduino官方的說(shuō)法,好像還具備有對(duì)數(shù)據(jù)全能的控制作用。
SS線是用于一根使能線,特別是接多個(gè)外圍設(shè)備的時(shí)候,可以通過(guò)控制SS線,對(duì)不同的外圍設(shè)備進(jìn)行通信。
寫(xiě)一個(gè)程序關(guān)于SPI必須注意的問(wèn)題有:
1. 字節(jié)的傳輸是從最高位(MSB)傳輸,還是從最低位(LSB)傳輸呢?這是由SPI.setBitOrder()函數(shù)進(jìn)行設(shè)置的。
2. 當(dāng)數(shù)據(jù)不傳輸時(shí),時(shí)鐘線是高還是低?
3. 觸發(fā)方式是上升沿觸發(fā)還是下降沿觸發(fā)呢?這個(gè)由SPI.setDataMode()函數(shù)進(jìn)行設(shè)置。
4. SPI運(yùn)行的速度是多快呢?這個(gè)由SPI.setClockDivider()函數(shù)進(jìn)行設(shè)置。
在arduino2009板上,10腳是SS,11腳是MOSI, 12腳是MISO,13腳是時(shí)鐘引腳。當(dāng)然在同時(shí)用這幾根引腳控制多個(gè)外圍設(shè)備的時(shí)候,SS引腳可以是其它引腳,比如arduinoEhthernet模塊,利用第4個(gè)引腳去控制SD卡的SS端。第10引腳控制Enthernet模塊的SS端,下面是三種不同的硬件接法示意圖:
這是第三種方法,主機(jī)控制多個(gè)外圍設(shè)備的接法。上文提到的控制網(wǎng)絡(luò)模塊與SD卡兩個(gè)外圍設(shè)備用的電路http://www.zg4o1577.cn/mcu/2014.html 就是這種電路。
這是另外一種接法,也是同時(shí)控制多個(gè)外圍設(shè)備,但是這種占用到主機(jī)的引腳相對(duì)于第二種來(lái)說(shuō)會(huì)少一點(diǎn)。
下面再補(bǔ)充幾個(gè)上文沒(méi)有說(shuō)到的關(guān)于SPI的函數(shù):
SPI.begin()
作用是初始化SPI總線。設(shè)備SCK, MOSI,和SS為輸出。把SCK和MOSI拉低,把SS線進(jìn)行拉高。
SPI.end()
作用是結(jié)束SPI傳輸,或者準(zhǔn)確地說(shuō)是禁止SPI總線工作。
SPI.transfer(val)
作用是傳輸一個(gè)字節(jié),這里要指出來(lái)的是val只能是字節(jié)。