zoukankan      html  css  js  c++  java
  • 进阶之路(基础篇)

    主机端:

    /*********************************
    代码功能:通过底层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数据的暂存器)
        
    作者邮箱:jikexianfeng@outlook.com
    ********************************/
    #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("jikexianfeng@outlook.com");
      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 作者邮箱:jikexianfeng@outlook.com
     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 }
  • 相关阅读:
    Python学习笔记 第四天
    Python学习笔记 第三天
    linux系统优化(CentOS7)
    ARMS踩坑合集
    zabbix报错合集(附解决方法)
    keepalived
    ansible
    nginx
    安装虚拟机
    linux发展、redhat与centos的区别
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/6824365.html
Copyright © 2011-2022 走看看