W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
串行外設(shè)接口(SPI)總線是用于串行通信的系統(tǒng),最多可使用四個(gè)導(dǎo)體,通常為三個(gè)。一個(gè)導(dǎo)體用于數(shù)據(jù)接收,一個(gè)導(dǎo)體用于數(shù)據(jù)發(fā)送,一個(gè)導(dǎo)體用于同步,另一個(gè)導(dǎo)體用于選擇與之通信的設(shè)備。它是一個(gè)全雙工連接,這意味著數(shù)據(jù)是同時(shí)發(fā)送和接收的。最大波特率高于I2C通信系統(tǒng)中的波特率。
SPI使用以下四條線:
SCK - 這是由主機(jī)驅(qū)動(dòng)的串行時(shí)鐘。
MOSI - 這是由主機(jī)驅(qū)動(dòng)的主輸出/從輸入。
MISO - 這是由主機(jī)驅(qū)動(dòng)的主輸入/從輸出。
SS - 這是從機(jī)選擇線。
使用以下函數(shù),必須包括SPI.h.
SPI.begin() - 通過將SCK,MOSI和SS設(shè)置為輸出來初始化SPI總線,將SCK和MOSI拉低,將SS拉高。
SPI.setClockDivider(分頻器) - 相對(duì)于系統(tǒng)時(shí)鐘設(shè)置SPI時(shí)鐘分頻器。在基于AVR的板上,可用的分頻器為2,4,8,16,32,64或128。默認(rèn)設(shè)置為SPI_CLOCK_DIV4,它將SPI時(shí)鐘設(shè)置為系統(tǒng)時(shí)鐘的四分之一(對(duì)于20 MHz的電路板為5 Mhz)。
Divider - 它可以是(SPI_CLOCK_DIV2,SPI_CLOCK_DIV4,SPI_CLOCK_DIV8,SPI_CLOCK_DIV16,SPI_CLOCK_DIV32,SPI_CLOCK_DIV64,SPI_CLOCK_DIV128)。
SPI.transfer(val) - SPI傳輸基于同時(shí)發(fā)送和接收:接收的數(shù)據(jù)在receivedVal中返回。
SPI.beginTransaction(SPISettings(speedMaximum,dataOrder,dataMode)) - speedMaximum是時(shí)鐘,dataOrder(MSBFIRST或LSBFIRST),dataMode(SPI_MODE0,SPI_MODE1,SPI_MODE2或SPI_MODE3)。
SPI中有四種操作模式,如下所示:
模式0(默認(rèn)值) - 時(shí)鐘通常為低電平(CPOL = 0),數(shù)據(jù)在從低電平到高電平(前沿)(CPHA = 0)的轉(zhuǎn)換時(shí)采樣。
模式1 - 時(shí)鐘通常為低電平(CPOL = 0),數(shù)據(jù)在從高電平到低電平(后沿)(CPHA = 1)的轉(zhuǎn)換時(shí)采樣。
模式2 - 時(shí)鐘通常為高電平(CPOL = 1),數(shù)據(jù)在從高電平到低電平(前沿)(CPHA = 0)的轉(zhuǎn)換時(shí)采樣。
模式3 - 時(shí)鐘通常為高電平(CPOL = 1),數(shù)據(jù)在從低電平到高電平(后沿)(CPHA = 1)的轉(zhuǎn)換時(shí)采樣。
SPI.attachInterrupt(handler) - 當(dāng)從設(shè)備從主設(shè)備接收數(shù)據(jù)時(shí)調(diào)用的函數(shù)。
現(xiàn)在,我們將兩個(gè)Arduino UNO板連接在一起;一個(gè)作為主機(jī),另一個(gè)作為從機(jī)。
接地是常見的。以下是兩個(gè)電路板之間的連接的圖示:
讓我們看看SPI作為主機(jī)和SPI作為從機(jī)的例子。
#include <SPI.h> void setup (void) { Serial.begin(115200); //set baud rate to 115200 for usart digitalWrite(SS, HIGH); // disable Slave Select SPI.begin (); SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8 } void loop (void) { char c; digitalWrite(SS, LOW); // enable Slave Select // send test string for (const char * p = "Hello, world!\r" ; c = *p; p++) { SPI.transfer (c); Serial.print(c); } digitalWrite(SS, HIGH); // disable Slave Select delay(2000); }
#include <SPI.h> char buff [50]; volatile byte indx; volatile boolean process; void setup (void) { Serial.begin (115200); pinMode(MISO, OUTPUT); // have to send on master in so it set as output SPCR |= _BV(SPE); // turn on SPI in slave mode indx = 0; // buffer empty process = false; SPI.attachInterrupt(); // turn on interrupt } ISR (SPI_STC_vect) // SPI interrupt routine { byte c = SPDR; // read byte from SPI Data Register if (indx < sizeof buff) { buff [indx++] = c; // save data in the next index in the array buff if (c == '\r') //check for the end of the word process = true; } } void loop (void) { if (process) { process = false; //reset the process Serial.println (buff); //print the array on serial monitor indx= 0; //reset button to zero } }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: