1. 程式人生 > >進階之路(基礎篇) - 008 SPI數據傳輸(庫函數方法)

進階之路(基礎篇) - 008 SPI數據傳輸(庫函數方法)

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/2
23 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/128
29 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數據傳輸(庫函數方法)