主机端:
/********************************* 代码功能:通过底层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 = (<<SPE)|(<<MSTR); } byte ReadByte(void) { <<SPIF))); return SPDR; } void WriteByte(byte value) { SPDR = value; <<SPIF))); return ; } void setup() { Serial.begin(); MasterInit(); Serial.println("[email protected]"); digitalWrite(SS_PIN,HIGH); SlaveDataFlag = true; } void loop() { byte rxData; while(true) { if(SlaveDataFlag) { digitalWrite(SS_PIN,LOW); WriteByte(); 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; } } }
从机端:
/********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTmega(AVR) 库 作者邮箱:[email protected] ********************************/ #define SCK_PIN 13 #define MISO_PIN 12 #define MOSI_PIN 11 #define SS_PIN 10 void SlaveInit(void) { pinMode(SCK_PIN,INPUT); pinMode(MISO_PIN,INPUT); pinMode(MISO_PIN,OUTPUT); pinMode(SS_PIN,INPUT); SPCR = B00000000; SPCR = (<<SPE); } byte ReadByte(void) { <<SPIF))); return SPDR; } void writeByte(byte value) { SPDR = value; <<SPIF))); return ; } void setup() { Serial.begin(); SlaveInit(); } void loop() { if(digitalRead(SS_PIN) == LOW) { writeByte(); byte rxData; rxData = ReadByte(); Serial.print("Command :"); Serial.println(rxData); } }