進階之路(基礎篇) - 009 通過底層AVR方法實現SPI數據傳輸
主機端:
/********************************* 代碼功能:通過底層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]
從機端:
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數據傳輸