主机端:

/*********************************
代码功能:通过底层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)
{
while(!(SPSR&(<<SPIF)));
return SPDR;
} void WriteByte(byte value)
{
SPDR = value;
while(!(SPSR&(<<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)
{
while(!(SPSR&(<<SPIF)));
return SPDR;
} void writeByte(byte value)
{
SPDR = value;
while(!(SPSR&(<<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);
}
}

进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输的更多相关文章

  1. 通过底层AVR方法实现SPI数据传输

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

  2. docker进阶之路-基础篇 | 一:环境搭建

    转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061747.html 一.准备工作 查看内核 Docker 要求 CentOS ...

  3. docker进阶之路-基础篇 | 二:portainer安装与基本使用

    转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061755.html ​简介 Portainer 是轻量级,跨平台,开源的管理D ...

  4. python之路基础篇

    基础篇 1.Python基础之初识python 2.Python数据类型之字符串 3.Python数据类型之列表 4.Python数据类型之元祖 5.Python数据类型之字典 6.Python Se ...

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

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

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

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

  7. 《成神之路-基础篇》JVM——Java内存模型(已完结)

    Java内存模型 本文是<成神之路系列文章>的第一篇,主要是关于JVM的一些介绍. 持续更新中 Java内存模型 JVM内存结构 VS Java内存模型 VS Java对象模型(Holli ...

  8. Python学习之路基础篇--01Python的基本常识

    1 计算机基础 首先认识什么是CPU(Central Processing Unit),即中央处理器,相当于人类的大脑.内存,临时储存数据,断电即消失.硬盘,可以长久的储存数据,有固态硬盘,机械硬盘之 ...

  9. 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件

    作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...

随机推荐

  1. logistic回归(一)

    http://www.2cto.com/kf/201307/226576.html , 这个是Sigmoid函数,在这个回归过程中非常重要的函数,主要的算法思想和这个密切相关.这个函数的性质大家可以自 ...

  2. [Docker] Linking Node.js and MongoDB Containers

    To do communcation between containers, we need to do link between containers. 1. Run a container wit ...

  3. MATLAB中的集合运算

    matlab里关于集合运算和二进制数的运算的函数 intersect:集合交集ismember :是否集合中元素setdiff :集合差集setxor :集合异或(不在交集中的元素)union :两个 ...

  4. centos7默认安装没有连接到网络

    1.显示所有连接 # nmcli con show 2.连接到网络 # nmcli con up enp0s3 这个ens33是通过显示所有连接查到的

  5. MACD底背离选股公式——通达信、同花顺

    {底背离,通达信版.同花顺版} DIFF:=EMA(CLOSE,) - EMA(CLOSE,); DEA:=EMA(DIFF,); MACD:=*(DIFF-DEA); QZQ:=BARSLAST(R ...

  6. 利用mvn进行多环境配置

    代码里的resource信息有很多,代码里写死某一个环境的配置的话,有以下若干问题. 1. dev,不同的beta上,使用的resource信息不同. 2. 代码没有发布到对应的环境上,需要去机器上需 ...

  7. js跨域解决方式

    什么是跨域? 概念:仅仅要协议.域名.port有不论什么一个不同,都被当作是不同的域.(所谓同源是指,域名.协议,port同样.),对于port和协议的不同,仅仅能通过后台来解决. URL 说明 是否 ...

  8. Win10下安装Ubuntu16.04虚拟机并搭建TensorFlow1.3环境

    本文具体参考资料链接 1.VMware下载安装 百度输入VMware搜索,出现如下界面,点击下载: 此处安装步骤可以网上搜索,也可不用搜索,直接按照按照提示一步一步确认即可完成. 2.Ubuntu16 ...

  9. Ulua_toLua_基本案例(二)_ScriptsFromFile

    在Untiy中用Lua.必需要LuaInterface. LuaInterface的介绍请看:点击打开链接 能够先光写Lua,生成.lua的纯文件. 再Unity中通过,luaState.DoFile ...

  10. SpringMVC学习笔记五:使用converter进行参数数据转换

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6832898.html  一:SpringMVC数据绑定机制 1:request到达SpringMVC框架时,框 ...