1. 程式人生 > >進階之路(基礎篇) - 009 通過底層AVR方法實現SPI數據傳輸

進階之路(基礎篇) - 009 通過底層AVR方法實現SPI數據傳輸

lean oop and return false 進階 from setup pie

主機端:

/*********************************
代碼功能:通過底層AVR方法實現SPI數據傳輸(主機端)
創作時間:2016*10*17
使用資源:
    更低階的 aTmega(AVR) 庫
    SPI三個寄存器SPCR(控制寄存器),SPCR(狀態寄存器),SPDR(數據的暫存器)
        SPCR(SPI Control Register暫存寄存器)
            7bit    SPIE    片選使能,SPIE = 1;片選無效,SPIE = 0片選有效(主機無需片選)(單機通信也無需片選)
            6bit    SPE        
            5bit    DORD    
            4bit    MSTR    
            3bit    CPOL    時鐘極性,CPOL = 0(時鐘空閑為低電平);CPOL = 1(時鐘空閑為高電平)
            2bit    CPHA    相位極性,CPHA = 0(表示第一個邊沿);CPHA = 1(表示第二個邊沿);都是表示數據采樣,數據有效的時刻。
            1bit    SPR1    
            0bit    SPR0
            
            
            
            
        SPCR(SPI Status Register 暫存寄存器)
        SPDR(SPI Control Register數據的暫存器)
    
作者郵箱:[email protected]
/* */ ********************************/ #define SCK_PIN 13 //宏定義時鐘端口 #define MISO_PIN 12 //宏定義主機輸出線 #define MOSI_PIN 11 //宏定義從機輸出線 #define SS_PIN 10 //片選 boolean SlaveDataFlag; //數據標誌位 void MasterInit(void) //初始化SPI引腳設置 { pinMode(SCK_PIN,OUTPUT); //SCK_PIN為輸出模式,(主機模式)
pinMode(MOSI_PIN,OUTPUT); //初始化主機輸出總線 pinMode(MISO_PIN,INPUT); //初始化從機輸出總線 pinMode(SS_PIN,OUTPUT); //初始化片選引腳(主機高電平,從機低電平) //啟動SPI SPCR = B00000000; SPCR = (1<<SPE)|(1<<MSTR); } byte ReadByte(void) { while(!(SPSR&(1<<SPIF))); return SPDR; } void WriteByte(byte value) { SPDR
= value; while(!(SPSR&(1<<SPIF))); return ; } void setup() { Serial.begin(115200); MasterInit(); Serial.println("[email protected]"); digitalWrite(SS_PIN,HIGH); SlaveDataFlag = true; } void loop() { byte rxData; while(true) { if(SlaveDataFlag) { digitalWrite(SS_PIN,LOW); WriteByte(17); Serial.println("Done writing data..."); Serial.println("Reading data from slave ..."); rxData = ReadByte(); digitalWrite(SS_PIN,HIGH); Serial.println("Dome Reading data ..."); Serial.print("From Slave :"); Serial.println(rxData,DEC); SlaveDataFlag = false; } } }

從機端:

 1 /*********************************
 2 代碼功能:通過底層AVR方法實現SPI數據傳輸(從機端)
 3 創作時間:2016*10*17
 4 使用資源:
 5     更低階的 aTmega(AVR) 庫
 6 作者郵箱:[email protected]
 7 ********************************/
 8 #define SCK_PIN 13
 9 #define MISO_PIN 12
10 #define MOSI_PIN 11
11 #define SS_PIN 10
12 
13 void SlaveInit(void)
14 {
15   pinMode(SCK_PIN,INPUT);
16   pinMode(MISO_PIN,INPUT);
17   pinMode(MISO_PIN,OUTPUT);
18   pinMode(SS_PIN,INPUT);
19   
20   SPCR = B00000000;
21   SPCR = (1<<SPE);
22 }
23 
24 byte ReadByte(void)
25 {
26   while(!(SPSR&(1<<SPIF)));
27   return SPDR;
28 }
29 
30 void writeByte(byte value)
31 {
32   SPDR = value;
33   while(!(SPSR&(1<<SPIF)));
34   return ;
35 }
36 
37 void setup()
38 {
39   Serial.begin(115200);
40   SlaveInit();
41 }
42 
43 void loop()
44 {
45   if(digitalRead(SS_PIN) == LOW)
46   {
47     writeByte(19);
48     byte rxData;
49     rxData = ReadByte();
50     Serial.print("Command :");
51     Serial.println(rxData);
52   }
53 }

進階之路(基礎篇) - 009 通過底層AVR方法實現SPI數據傳輸