进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输

Posted 极客先锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进阶之路(基础篇) - 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]
********************************/
#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数据传输的主要内容,如果未能解决你的问题,请参考以下文章

单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例

进阶之路(基础篇) - 006 串口的使用

进阶之路(基础篇) - 008 SPI数据传输(库函数方法)

进阶之路(基础篇) - 012 Arduino IDE 添加DHT11传感器第三方库的方法

通过底层AVR方法实现SPI数据传输

进阶之路(基础篇) - 007 脉冲宽度测量