主机端:

/*********************************
代码功能:通过底层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    SPR0SPCR(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);    //初始化片选引脚(主机高电平,从机低电平)//启动SPISPCR = 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 }

转载于:https://www.cnblogs.com/jikexianfeng/p/6824365.html

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

  1. python多线程并发_Python进阶记录之基础篇(二十四)

    回顾 在Python进阶记录之基础篇(二十三)中,我们介绍了进程的基本概念以及Python中多进程的基本使用方法.其中,需要重点掌握多进程的创建方法.进程池和进程间的通信.今天我们讲一下Python中 ...

  2. 黎想深度访谈腾讯顶级产品经理的进阶之路——第二篇《定位》

    16个月精心打磨,9位顶级产品专家研讨提炼,凝聚腾讯产品经验的八集八分钟产品课分别从用户.定位.需求.时机.匠心.危机.合作.商业角度出发,还原产品背后的故事,分享给你腾讯产品的心法.艺形艺意工作室创 ...

  3. 100内奇数之和流程图_Python进阶记录之基础篇(四)

    回顾 在Python进阶记录之基础篇(三)中,我们介绍了Python中分支结构if语句的相关知识以及输入函数input()的基本用法.if语句在我们日后的编程中会经常使用到,今天我们讲一下另一个重要的 ...

  4. python进阶记录之基础篇二十六_Python进阶记录之基础篇(十六)

    回顾 在Python进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,需要重点掌握类的创建和对象的使用.今天我们继续讲一下Python中面向对象的相关知识点 ...

  5. 恭喜你!在28岁前看见了腾讯顶级产品经理的进阶之路——第一篇《用户》

    随着我国新媒体网络技术的飞速发展,许多新兴产业也随之诞生,增加了许多的就业机会,例如新媒体推广运营工作.在纷繁复杂的网络环境下,如何通过平台的推荐机制,如何使其精准的抵达至你的目标用户群体呢?艺形艺意 ...

  6. JAVA学习之路--基础篇三

    目录 关于Java中从键盘输入的语句 nextxxx().next().nextLine()的区别 语句 if和if else语句 Switch语句 for语句 while和do..while bre ...

  7. Ps高手之路基础篇视频教程

    课程介绍 Photoshop高手之路的基础篇,全面覆盖了Photoshop的基础知识,使用方法及其在相关行业中的应用技术.非常适合平面设计初学者或有一定基础的平面设计爱好者. 学习地址 百度:http ...

  8. python学习之路基础篇(第四篇)

    一.课程内容回顾 1.python基础 2.基本数据类型  (str|list|dict|tuple) 3.将字符串"老男人"转换成utf-8 s = "老男人" ...

  9. .NET基础篇——分部类和分部方法

    在面向对象的"封装闭合性"开发原则中,一向提倡的是把独立的功能封装在一个类里面的!但从Visual Studio 2005开发,系统提供了一个分部类的开发方式一直受到争议,很多人认 ...

  10. Python学习之路基础篇--10Python基础,函数进阶

    1 命名空间 对于Python 来说命名空间一共有三种 1 内置命名空间 -- Python 解释器 就是Python 解释器一启动就可以使用的名字,储存在内置命名空间中.内置的名字在启动解释器的时候 ...

最新文章

  1. SAP MM41 收到报错:Retail materials cannot be maintained.
  2. centos8网络配置开启wifi_CentOS 7.5 最小安装开启 WIFI 连接的设置方法
  3. 天弘基金交易数据清算从8小时缩至1.5小时 解决余额宝算力难题
  4. 简述Qt编程中遇到的编码格式问题
  5. element筛选 ajax,vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询
  6. maven异常001---报错The folder is already a source folder.的解决办法
  7. 海天味业打造高端调味品领衔食品美味
  8. java不重复的随机数_Javascript获取不重复的随机数值
  9. g40-45支持虚拟化技术_虚拟化技术与原理简介
  10. 关于uni-app框架下,用户真实头像采集的优化方案
  11. Linux如何切换字符或者图形界面
  12. GIS基本理论之四:空间数据分析基本理论
  13. winform的FormBorderStyle设置为None窗口的最小宽度不能小于132
  14. 微步在线安全事件分析:全球数亿主机被FireBall攻陷
  15. web大作业介绍自己的家乡_【天成好作文】胡缤云 二十年后的家乡
  16. 云痕大数据 家长登录_云痕大数据平台的使用对初中英语教与学的作用
  17. 一行代码实现微信多开
  18. 酒店管理系统升级(.net4.0 + sql2005 + linq to sql)
  19. 白嫖他!悟空CRM项目 ,部署了直接用起来
  20. 2023. 连接奶牛

热门文章

  1. 第三方物流(Third Party Logistics,3PL)
  2. es search delete
  3. Google 推荐和鼓励的 13 条代码审查标准,建议收藏!
  4. 不要网上乱拷贝代码了!一段网上找的代码把公司服务器崩了!
  5. IntelliJ 平台 2020 年路线图,规划原来这么厉害
  6. 软件架构入门,看这篇就够了···
  7. 【干货】阿里直播平台的架构演进
  8. 年轻时不多闯闯,老了拿什么来吹
  9. 80% 的公司在招聘时都忽略的一个细节
  10. 我们团队一位Android开发者的故事