主机端:

 /*********************************
 代码功能:通过底层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 = (<<SPE)|(<<MSTR);
 }

 byte ReadByte(void)
 {
   <<SPIF)));
   return SPDR;
 }

 void WriteByte(byte value)
 {
   SPDR = value;
   <<SPIF)));
   return ;
 }

 void setup()
 {
   Serial.begin();
   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();
       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) 库
 作者邮箱:jikexianfeng@outlook.com
 ********************************/
 #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);
   }
 }

通过底层AVR方法实现SPI数据传输的更多相关文章

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

    主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...

  2. SPI数据传输(库函数方法)

    主机端: /********************************* 代码功能:SPI数据传输(主机端) 引脚说明: SS/CS:片选(高电平屏蔽,低电平启用) MOSI :主机送出信号 M ...

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

    主机端: /********************************* 代码功能:SPI数据传输(主机端) 引脚说明: SS/CS:片选(高电平屏蔽,低电平启用) MOSI :主机送出信号 M ...

  4. 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较

    我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...

  5. Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化

    我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...

  6. Linux驱动 - SPI驱动 之四 SPI数据传输的队列化

    我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...

  7. 2019-5-29-Roslyn-让-VisualStudio-急速调试底层库方法

    title author date CreateTime categories Roslyn 让 VisualStudio 急速调试底层库方法 lindexi 2019-5-29 20:2:9 +08 ...

  8. EF 底层封装方法(供参考)

    闲暇之余,整理了一下EF底层的一些基础方法,供查看,只有接口,具体实现需要你们自己写了. 建议:接口的实现定义为虚方法,当父类的方法不满住子类需求时,可以重写此方法 此接口都为公用方法,基本上满足小系 ...

  9. jQuery晦涩的底层工具方法们

    这里整理的是jQuery源码中一些比较晦涩难懂的.内部的.最底层的工具方法,它们多为jQuery的上层api方法服务,目前包括: jQuery.access jQuery.access: functi ...

随机推荐

  1. bash的操作环境[转]

          Bash Shell 的操作环境: 是否记得我们登陆主机的时候,屏幕上头会有一些说明文字,告知我们的 Linux 版本啊什么的, 还有,登陆的时候我们还可以给予用户一些信息或者欢迎文字呢. ...

  2. 请求rest web服务client

    RestClient using System; using System.Globalization; using System.IO; using System.Net; using System ...

  3. <mvc:annotation-driven/>与<mvc:default-servlet-handler/>之间的一个问题

    <mvc:annotation-driven/>与<mvc:default-servlet-handler/>之间的一个问题 在做项目的时候,我希望静态资源由WEB服务器默认的 ...

  4. java的基本认识

    一.java的特点: 1.跨平台性:不受计算机硬件及操作系统的约束而在任意计算机环境下运行. 2.面向对象:以对象为基本粒度,基下包含属性和方法. 3.安全性:语言级安全性.编译性安全性.运行时安全性 ...

  5. FM/PCM与FM/PPM的区别

    FM/PCM的优点:     1 高可靠性和高抗干扰性.大家知道,一般PPM遥控设备都要求在操作时先开发射机后开接收机,先关接收机后关发射机.其原因是在没有发射信号时,接受机会因自身内部的噪音或外界的 ...

  6. FW开发代码规范---小任性(2)

    三.空行 (1)在每个函数.结构体.枚举定义结束之后都要加空行. 在一个函数体内,逻辑密切相关的语句之间不加空行,其它地方应加空行分隔. struct st1 { - }; // 空行 enum { ...

  7. Linux 11g rac PSU

    PSU补丁:p22191577_112040_Linux-x86-64.zipOPATCH工具:p6880880_112000_LINUX.zip 解压OPATCH工具 覆盖到/u01/11.2.0/ ...

  8. hihocoder 1391 [扫描线]

    /* 题意: 两方对阵,互发导弹.防护罩可以让导弹原速反向. 每一枚导弹有发射时间航行时间伤害值. 防护罩也有开启时间和防御时间. 其中一方防护罩开启时间已知,求另一方防护罩合理安排开启时间使得己方受 ...

  9. sql 简单事务例子

    BEGIN TRY BEGIN TRAN ) BEGIN UPDATE table SET ... END ELSE BEGIN UPDATE table SET ... UPDATE table S ...

  10. java后台异步任务执行器TaskManager

    java后台异步任务执行器TaskManager 此方式基于MVC方式: 一,使用任务: @Resource private TaskManager taskManager; public strin ...