通过底层AVR方法实现SPI数据传输
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过底层AVR方法实现SPI数据传输相关的知识,希望对你有一定的参考价值。
主机端:
1 /********************************* 2 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 3 创作时间:2016*10*17 4 使用资源: 5 更低阶的 aTmega(AVR) 库 6 SPI三个寄存器SPCR(控制寄存器),SPCR(状态寄存器),SPDR(数据的暂存器) 7 SPCR(SPI Control Register暂存寄存器) 8 7bit SPIE 片选使能,SPIE = 1;片选无效,SPIE = 0片选有效(主机无需片选)(单机通信也无需片选) 9 6bit SPE 10 5bit DORD 11 4bit MSTR 12 3bit CPOL 时钟极性,CPOL = 0(时钟空闲为低电平);CPOL = 1(时钟空闲为高电平) 13 2bit CPHA 相位极性,CPHA = 0(表示第一个边沿);CPHA = 1(表示第二个边沿);都是表示数据采样,数据有效的时刻。 14 1bit SPR1 15 0bit SPR0 16 17 18 19 20 SPCR(SPI Status Register 暂存寄存器) 21 SPDR(SPI Control Register数据的暂存器) 22 23 作者邮箱:[email protected] 24 ********************************/ 25 #define SCK_PIN 13 //宏定义时钟端口 26 #define MISO_PIN 12 //宏定义主机输出线 27 #define MOSI_PIN 11 //宏定义从机输出线 28 #define SS_PIN 10 //片选 29 boolean SlaveDataFlag; //数据标志位 30 31 void MasterInit(void) //初始化SPI引脚设置 32 { 33 pinMode(SCK_PIN,OUTPUT); //SCK_PIN为输出模式,(主机模式) 34 pinMode(MOSI_PIN,OUTPUT); //初始化主机输出总线 35 pinMode(MISO_PIN,INPUT); //初始化从机输出总线 36 pinMode(SS_PIN,OUTPUT); //初始化片选引脚(主机高电平,从机低电平) 37 //启动SPI 38 SPCR = B00000000; 39 SPCR = (1<<SPE)|(1<<MSTR); 40 } 41 42 byte ReadByte(void) 43 { 44 while(!(SPSR&(1<<SPIF))); 45 return SPDR; 46 } 47 48 void WriteByte(byte value) 49 { 50 SPDR = value; 51 while(!(SPSR&(1<<SPIF))); 52 return ; 53 } 54 55 void setup() 56 { 57 Serial.begin(115200); 58 MasterInit(); 59 Serial.println("[email protected]"); 60 digitalWrite(SS_PIN,HIGH); 61 62 SlaveDataFlag = true; 63 } 64 65 void loop() 66 { 67 byte rxData; 68 while(true) 69 { 70 if(SlaveDataFlag) 71 { 72 digitalWrite(SS_PIN,LOW); 73 WriteByte(17); 74 Serial.println("Done writing data..."); 75 Serial.println("Reading data from slave ..."); 76 rxData = ReadByte(); 77 digitalWrite(SS_PIN,HIGH); 78 Serial.println("Dome Reading data ..."); 79 Serial.print("From Slave :"); 80 Serial.println(rxData,DEC); 81 SlaveDataFlag = false; 82 } 83 } 84 }
从机端:
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 }
以上是关于通过底层AVR方法实现SPI数据传输的主要内容,如果未能解决你的问题,请参考以下文章
Avr Atmel AR32UV3A0512 通过 SPI 进行 EEPROM 仿真