进阶之路(基础篇) - 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    SPR0

        SPCR(SPI Status Register 暂存寄存器)
        SPDR(SPI Control Register数据的暂存器)

作者邮箱:[email protected]
********************************/
#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 = (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("[email protected]");
  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 作者邮箱:[email protected]
 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 }
时间: 2024-11-05 15:52:42

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

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

主机端: 1 /********************************* 2 代码功能:通过底层AVR方法实现SPI数据传输(主机端) 3 创作时间:2016*10*17 4 使用资源: 5 更低阶的 aTmega(AVR) 库 6 SPI三个寄存器SPCR(控制寄存器),SPCR(状态寄存器),SPDR(数据的暂存器) 7 SPCR(SPI Control Register暂存寄存器) 8 7bit SPIE 片选使能,SPIE = 1;片选无效,SPIE = 0片选有效(主机无需片

【思库教育】2017PHP项目实战基础+进阶+项目之基础篇

下载链接: [思库教育]2017PHP项目实战基础+进阶+项目之基础篇 小白变大牛,您的专属资源库! 小白变大牛,您的专属资源库! 内容非常充实,可以看目录,设计的面多,项目多,技能多,如果掌握好,找一份PHP的工作,易如反掌!学完后可以到PHP小白变大牛精华区查找更加符合你的资源或者项目! [思库教育]2017PHP项目实战基础+进阶+项目之基础篇[思库教育]2017PHP项目实战基础+进阶+项目之进阶篇[思库教育]2017PHP项目实战基础+进阶+项目之项目篇小白变大牛!Python小白,J

Linux运维之路 基础篇:Linux基础命令(一)

Linux运维之路 基础篇:Linux基础命令(一) Linux哲学宗旨: 一切皆文件:把几乎所有的资源,包括硬件设备都组织为文件 有众多单一的小程序组成,一个程序制实现一个功能,组成小程序完成复杂操作 尽量避免和用户交互:实现脚本编程,以自动完成某些功能 使用纯文本文件保存配置信息 终端:用户和主机交互时用到的设备 物理终端:直接接入的设备也叫控制台/dev/console 虚拟终端:附加在物理终端上虚拟出的,默认启动六个,Ctrl+Alt(F1~F6),系统启动时,默认启动虚拟终端1,启动终

python之路-基础篇-day3

今日所讲知识点总结: 1.set集合 2.collections Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几个额外的数据类型: 1)Counter:计数器 2)OrderedDict:有序字典 3)defaultdict:默认字典 4)namedtuple:可命名元组 5)deque:双向队列 set集合 set集合是一个元素不重复的无序集合.类似于字典的key组成的一个无序集

python之路-基础篇3

作业: 1.每周写一篇博客 2.编写登录接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 3.多级菜单 三级菜单 可依次选择进入各子菜单 所需新知识点:列表.字典

python之路基础篇

1. Python基础之初识python 2. Python数据类型之字符串 3. Python数据类型之列表 4. Python数据类型之元祖 5. Python数据类型之字典 6. Python Set集合,函数,深入拷贝,浅入拷贝,文件处理 7. Python之常用模块 8. python正则表达式 9. python面向对象编程 10.python之socket编程 11.python进程.线程.协程

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

一.课程内容回顾 1.python基础 2.基本数据类型  (str|list|dict|tuple) 3.将字符串“老男人”转换成utf-8 s = "老男人" ret = bytes(s,encoding="utf-8") print(ret) ret1 = bytes(s,encoding="gbk") print(ret1) #程序运行结果如下: b'\xe8\x80\x81\xe7\x94\xb7\xe4\xba\xba' b'\xc0

Linux成长之路-基础篇(1)

一.计算机组成及功能1.计算机的组成计算机组成指的是系统结构的逻辑实现,包括机器机内的数据流和控制流的 组成及逻辑设计等.主要分为五个部分:控制器,运算器,存储器,输入设备,输出设备.2.各组成部分的功能(1)运算器:运算器的主要功能是对数据进行各种运算.这些运算除了常规的加.减.乘.除等基本的算术运算之外,还包括能进行"逻辑判断"的逻辑处理能力,即"与"."或"."非"这样的基本逻辑运算以及数据的比较.移位等操作.(2)控制

python之路-基础篇-day2

基本数据类型 在Python中,一切事物都是对象,对象基于类创建 注:查看对象相关成员的函数有:var,type,dir 基本数据类型主要有: 整数 长整型 浮点型 字符串 列表 元组 字典 set集合 接下来将对以上数据类型进行剖析: 1.整数 int 如:18.73.-100 每一个整数都具备如下功能: class int(object): """ int(x=0) -> integer int(x, base=10) -> integer Convert a