通过底层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数据的暂存器)
作者邮箱: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数据传输的更多相关文章
- 进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输
主机端: /********************************* 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 创作时间:2016*10*17 使用资源: 更低阶的 aTme ...
- SPI数据传输(库函数方法)
主机端: /********************************* 代码功能:SPI数据传输(主机端) 引脚说明: SS/CS:片选(高电平屏蔽,低电平启用) MOSI :主机送出信号 M ...
- 进阶之路(基础篇) - 008 SPI数据传输(库函数方法)
主机端: /********************************* 代码功能:SPI数据传输(主机端) 引脚说明: SS/CS:片选(高电平屏蔽,低电平启用) MOSI :主机送出信号 M ...
- 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较
我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...
- Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...
- Linux驱动 - SPI驱动 之四 SPI数据传输的队列化
我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...
- 2019-5-29-Roslyn-让-VisualStudio-急速调试底层库方法
title author date CreateTime categories Roslyn 让 VisualStudio 急速调试底层库方法 lindexi 2019-5-29 20:2:9 +08 ...
- EF 底层封装方法(供参考)
闲暇之余,整理了一下EF底层的一些基础方法,供查看,只有接口,具体实现需要你们自己写了. 建议:接口的实现定义为虚方法,当父类的方法不满住子类需求时,可以重写此方法 此接口都为公用方法,基本上满足小系 ...
- jQuery晦涩的底层工具方法们
这里整理的是jQuery源码中一些比较晦涩难懂的.内部的.最底层的工具方法,它们多为jQuery的上层api方法服务,目前包括: jQuery.access jQuery.access: functi ...
随机推荐
- Windows下启动,关闭Nginx命令
启动 直接点击Nginx目录下的nginx.exe 或者 cmd运行start nginx 关闭 nginx -s stop 或者 nginx -s quit stop表示立即 ...
- lua的栈
lua的栈是从栈底到栈顶: lua_pushstring(L, "test1");lua_pushstring(L, "test2");lua_pushstri ...
- command -ubuntu
WC -c, --bytes print the byte counts -m, --chars print the character counts -l, --lines print the ne ...
- Angular2.0-组件
截止到目前为止,Angular2.0完成了其alpha-32版本的开发,新的版本还在迭代开发当中,这其中有个问题,就是每个版本相比于以前的版本都会有一些改动,包括API方面的修改,这会导致很多基于以前 ...
- List<T>线性查找和二分查找BinarySearch效率分析
今天因为要用到List的查找功能,所以写了一段测试代码,测试线性查找和二分查找的性能差距,以决定选择哪种查找方式. 线性查找:Contains,Find,IndexOf都是线性查找. 二分查找:Bin ...
- PHP截断函数mb_substr()详细介绍
[导读] 在php中mb_substr()函数是用来截中文与英文的函数,可以方便快速的解决截取指定字符长度的问题,下面我来给大家介绍介绍.提示:mb_substr在于php中是默认不被支持的我们需要在 ...
- java readLine()
原文 虽然写IO方面的程序不多,但BufferedReader/BufferedInputStream倒是用过好几次的,原因是: 它有一个很特别的方法:readLine(),使用起来特别方便,每次读回 ...
- django Q和F查询
Q查询——对对象的复杂查询F查询——专门取对象中某列值的操作 Q查询1.Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询,例如: from django. ...
- Fighting Game
感谢上外静中任淳同学提供 uses crt; label h; //h是重新开始游戏 const y1=18; y2=18; //p1,p2的纵坐标 var ...
- 数据库 MySql
MySql 一,概述 1,什么是数据库? 数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 二,下载安装 想要使用MySQL来存储并操作数据,则需要做几件事情: a. 安装My ...