进阶之路(基础篇) - 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 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数据传输相关推荐
- python多线程并发_Python进阶记录之基础篇(二十四)
回顾 在Python进阶记录之基础篇(二十三)中,我们介绍了进程的基本概念以及Python中多进程的基本使用方法.其中,需要重点掌握多进程的创建方法.进程池和进程间的通信.今天我们讲一下Python中 ...
- 黎想深度访谈腾讯顶级产品经理的进阶之路——第二篇《定位》
16个月精心打磨,9位顶级产品专家研讨提炼,凝聚腾讯产品经验的八集八分钟产品课分别从用户.定位.需求.时机.匠心.危机.合作.商业角度出发,还原产品背后的故事,分享给你腾讯产品的心法.艺形艺意工作室创 ...
- 100内奇数之和流程图_Python进阶记录之基础篇(四)
回顾 在Python进阶记录之基础篇(三)中,我们介绍了Python中分支结构if语句的相关知识以及输入函数input()的基本用法.if语句在我们日后的编程中会经常使用到,今天我们讲一下另一个重要的 ...
- python进阶记录之基础篇二十六_Python进阶记录之基础篇(十六)
回顾 在Python进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,需要重点掌握类的创建和对象的使用.今天我们继续讲一下Python中面向对象的相关知识点 ...
- 恭喜你!在28岁前看见了腾讯顶级产品经理的进阶之路——第一篇《用户》
随着我国新媒体网络技术的飞速发展,许多新兴产业也随之诞生,增加了许多的就业机会,例如新媒体推广运营工作.在纷繁复杂的网络环境下,如何通过平台的推荐机制,如何使其精准的抵达至你的目标用户群体呢?艺形艺意 ...
- JAVA学习之路--基础篇三
目录 关于Java中从键盘输入的语句 nextxxx().next().nextLine()的区别 语句 if和if else语句 Switch语句 for语句 while和do..while bre ...
- Ps高手之路基础篇视频教程
课程介绍 Photoshop高手之路的基础篇,全面覆盖了Photoshop的基础知识,使用方法及其在相关行业中的应用技术.非常适合平面设计初学者或有一定基础的平面设计爱好者. 学习地址 百度:http ...
- python学习之路基础篇(第四篇)
一.课程内容回顾 1.python基础 2.基本数据类型 (str|list|dict|tuple) 3.将字符串"老男人"转换成utf-8 s = "老男人" ...
- .NET基础篇——分部类和分部方法
在面向对象的"封装闭合性"开发原则中,一向提倡的是把独立的功能封装在一个类里面的!但从Visual Studio 2005开发,系统提供了一个分部类的开发方式一直受到争议,很多人认 ...
- Python学习之路基础篇--10Python基础,函数进阶
1 命名空间 对于Python 来说命名空间一共有三种 1 内置命名空间 -- Python 解释器 就是Python 解释器一启动就可以使用的名字,储存在内置命名空间中.内置的名字在启动解释器的时候 ...
最新文章
- SAP MM41 收到报错:Retail materials cannot be maintained.
- centos8网络配置开启wifi_CentOS 7.5 最小安装开启 WIFI 连接的设置方法
- 天弘基金交易数据清算从8小时缩至1.5小时 解决余额宝算力难题
- 简述Qt编程中遇到的编码格式问题
- element筛选 ajax,vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询
- maven异常001---报错The folder is already a source folder.的解决办法
- 海天味业打造高端调味品领衔食品美味
- java不重复的随机数_Javascript获取不重复的随机数值
- g40-45支持虚拟化技术_虚拟化技术与原理简介
- 关于uni-app框架下,用户真实头像采集的优化方案
- Linux如何切换字符或者图形界面
- GIS基本理论之四:空间数据分析基本理论
- winform的FormBorderStyle设置为None窗口的最小宽度不能小于132
- 微步在线安全事件分析:全球数亿主机被FireBall攻陷
- web大作业介绍自己的家乡_【天成好作文】胡缤云 二十年后的家乡
- 云痕大数据 家长登录_云痕大数据平台的使用对初中英语教与学的作用
- 一行代码实现微信多开
- 酒店管理系统升级(.net4.0 + sql2005 + linq to sql)
- 白嫖他!悟空CRM项目 ,部署了直接用起来
- 2023. 连接奶牛