進階之路(基礎篇) - 008 SPI數據傳輸(庫函數方法)
阿新 • • 發佈:2017-05-08
ria att clockd == bus 屏蔽 attach serial out
主機端:
1 /********************************* 2 代碼功能:SPI數據傳輸(主機端) 3 引腳說明: 4 SS/CS:片選(高電平屏蔽,低電平啟用) 5 MOSI :主機送出信號 6 MISO :主機結收信號 7 CLK :時鐘脈沖 8 SPI成員: 9 begin(); 10 功能 :初始化SPI,設置CLK,MISO和SS為輸出,將SCK和MOSI拉低,將SS拉高。 11 形式 :SPI.begin(); 12 返回值:none 13 setBitOrder();14 功能:設 置進入和輸出SPI總線比特(bit)的順序:LSBFIRST(低位開始)或者 MSBFIRST (高位開始)。 15 形式:SPI.setBitOrder(order); 16 參數:order:LSBFIRST或 MSBFIRST 17 返回值:none 18 setClockDivider(); 19 功能:設置SPI串行通信時鐘的分頻系數 20 形式:setClockDivider(SPI_CLOCK); 21 參數(SPI_CLOCK) 22 SPI_CLOCK_DIV2 //2分頻,系統時鐘的 1/223 SPI_CLOCK_DIV4 //4分頻,系統時鐘的 1/4 24 SPI_CLOCK_DIV8 //8分頻,系統時鐘的 1/8 25 SPI_CLOCK_DIV16 //16分頻,系統時鐘的 1/16 26 SPI_CLOCK_DIV32 //32分頻,系統時鐘的 1/32 27 SPI_CLOCK_DIV64 //64分頻,系統時鐘的 1/64 28 SPI_CLOCK_DIV128 //128分頻,系統時鐘的 1/12829 setDataMode(); 30 功能:設置數據模式 31 形式:SPI.setDataMode(mode); 32 參數(mede): 33 SPI_MODE0 CPOL = 0 CPHA = 0 34 SPI_MODE1 CPOL = 0 CPHA = 1 35 SPI_MODE2 CPOL = 1 CPHA = 0 36 SPI_MODE3 CPOL = 1 CPHA = 1 37 時鐘極性CPOL: 即SPI空閑時,時鐘信號SCLK的電平(1:空閑時高電平; 0:空閑時低電平) 38 時鐘相位CPHA: 即SPI在SCLK第幾個邊沿開始采樣(0:第一個邊沿開始; 1:第二個邊沿開始) 39 transfer(); 40 功能:在SPI上傳輸一個字節(byte),發送和接收都是這個函數 41 形式:SPI.transfer(val); 42 參數(val):要發送的字節 43 返回值:從 bus 上讀取字節。(讀操作使用的時候) 44 end(); 45 功能:結束傳輸 46 形式:end(); 47 參數:無 48 返回值:無 49 創作時間:2016*10*10 50 作者郵箱:[email protected] 51 ********************************/ 52 #include<SPI.h> //共用MOSI從機輸入線 53 void setup() 54 { 55 Serial.begin(115200); //串口通信波特率 56 Serial.println("start ..."); 57 digitalWrite(SS,HIGH); //SS高電平表示從器件未被選中,從器件不工作,MISO輸出高阻; 58 SPI.begin(); //初始化SPI串口 59 SPI.setClockDivider(SPI_CLOCK_DIV8); //設置SPI的時鐘速率為8分頻 60 } 61 void loop() 62 { 63 char c; 64 digitalWrite(SS,LOW); //啟動周邊選擇 65 for(const char *p = "Hello world!\n";c = *p;p++) //送出測試的字符 66 { 67 SPI.transfer(c); //SPI輸出數據 68 Serial.print(c); //串口輸出數據 69 } 70 digitalWrite(SS,HIGH); //使從器件不工作 71 delay(1000); 72 }
從機端:
1 /********************************* 2 代碼功能:SPI數據傳輸(從機端) 3 創作時間:2016*10*14 4 作者郵箱:[email protected] 5 ********************************/ 6 #include<SPI> 7 char buf[100]; //設置緩沖區 8 volatile byte pos; //定義一個共享的字符 9 volatile boolean process_it; //定義一個共享的整型 10 11 void setup(void) 12 { 13 //通信串口設置 14 Serial.begin(115200); //設置串口和波特率 15 Serial.println("start slave"); 16 //SPI總線設置 17 pinMode(MISO,OUTPUT); //拉高屏蔽主機輸出線 18 SPCR |= _BV(SPE); //打開ISP在從機 19 SPI.setBitOrder(MSBFIRST); //傳輸方式高位開始 20 SPI.setDataMode(SPI_MODE0); //設置SPI數據模式 21 SPI.setClockDivider(SPI_CLOCK_DIV8); //設置SPI的時鐘速率為8分頻 22 //中斷使用數據 23 pos = 0; 24 process_it = false; //假 25 SPI.attachInterrupt(); //準備好中斷 26 } 27 //ISR終端服務程序 28 ISR(SPI_STC_vect) 29 { 30 byte c = SPDR; //從SPI寄存器讀取數據 31 if(pos < sizeof(buf)) //判斷空間是否使用完 32 { 33 buf[pos++] =c; 34 if(c ==‘\n‘) 35 process_it = true; 36 } 37 } 38 void loop(void) 39 { 40 if(process_it) //判讀數據是否寫入結束 41 { 42 String stringOne = String(buf); 43 Serial.print(stringOne); 44 buf[pos] = 0; 45 pos = 0; 46 process_it = false; 47 } 48 }
進階之路(基礎篇) - 008 SPI數據傳輸(庫函數方法)