通过底层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 仿真

avr单片机中spi通信 要取从机的数据,从机数据在啥时候写入SPDR寄存器?最好有例子。

Java SPI机制原理和使用场景

Dubbo底层源码分析之SPI扩展点

AVR单片机教程——走向高层

用 AVR 计算七段数字