主机端:

  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片选有效(主机无需片选)(单机通信也无需片选)
  9. 6bit SPE
  10. 5bit DORD
  11. 4bit MSTR
  12. 3bit CPOL 时钟极性,CPOL = 0(时钟空闲为低电平);CPOL = 1(时钟空闲为高电平)
  13. 2bit CPHA 相位极性,CPHA = 0(表示第一个边沿);CPHA = 1(表示第二个边沿);都是表示数据采样,数据有效的时刻。
  14. 1bit SPR1
  15. 0bit SPR0
  16.  
  17. SPCR(SPI Status Register 暂存寄存器)
  18. SPDR(SPI Control Register数据的暂存器)
  19.  
  20. 作者邮箱:jikexianfeng@outlook.com
  21. ********************************/
  22. #define SCK_PIN 13 //宏定义时钟端口
  23. #define MISO_PIN 12 //宏定义主机输出线
  24. #define MOSI_PIN 11 //宏定义从机输出线
  25. #define SS_PIN 10 //片选
  26. boolean SlaveDataFlag; //数据标志位
  27.  
  28. void MasterInit(void) //初始化SPI引脚设置
  29. {
  30. pinMode(SCK_PIN,OUTPUT); //SCK_PIN为输出模式,(主机模式)
  31. pinMode(MOSI_PIN,OUTPUT); //初始化主机输出总线
  32. pinMode(MISO_PIN,INPUT); //初始化从机输出总线
  33. pinMode(SS_PIN,OUTPUT); //初始化片选引脚(主机高电平,从机低电平)
  34. //启动SPI
  35. SPCR = B00000000;
  36. SPCR = (<<SPE)|(<<MSTR);
  37. }
  38.  
  39. byte ReadByte(void)
  40. {
  41. while(!(SPSR&(<<SPIF)));
  42. return SPDR;
  43. }
  44.  
  45. void WriteByte(byte value)
  46. {
  47. SPDR = value;
  48. while(!(SPSR&(<<SPIF)));
  49. return ;
  50. }
  51.  
  52. void setup()
  53. {
  54. Serial.begin();
  55. MasterInit();
  56. Serial.println("jikexianfeng@outlook.com");
  57. digitalWrite(SS_PIN,HIGH);
  58.  
  59. SlaveDataFlag = true;
  60. }
  61.  
  62. void loop()
  63. {
  64. byte rxData;
  65. while(true)
  66. {
  67. if(SlaveDataFlag)
  68. {
  69. digitalWrite(SS_PIN,LOW);
  70. WriteByte();
  71. Serial.println("Done writing data...");
  72. Serial.println("Reading data from slave ...");
  73. rxData = ReadByte();
  74. digitalWrite(SS_PIN,HIGH);
  75. Serial.println("Dome Reading data ...");
  76. Serial.print("From Slave :");
  77. Serial.println(rxData,DEC);
  78. SlaveDataFlag = false;
  79. }
  80. }
  81. }

从机端:

  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 = (<<SPE);
  22. }
  23.  
  24. byte ReadByte(void)
  25. {
  26. while(!(SPSR&(<<SPIF)));
  27. return SPDR;
  28. }
  29.  
  30. void writeByte(byte value)
  31. {
  32. SPDR = value;
  33. while(!(SPSR&(<<SPIF)));
  34. return ;
  35. }
  36.  
  37. void setup()
  38. {
  39. Serial.begin();
  40. SlaveInit();
  41. }
  42.  
  43. void loop()
  44. {
  45. if(digitalRead(SS_PIN) == LOW)
  46. {
  47. writeByte();
  48. byte rxData;
  49. rxData = ReadByte();
  50. Serial.print("Command :");
  51. Serial.println(rxData);
  52. }
  53. }

进阶之路(基础篇) - 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. Authentication and Authorization in ASP.NET Web API

      You've created a web API, but now you want to control access to it. In this series of articles, we ...

  2. [Spring Boot] Use Component Scan to scan for Bean

    Component Scan is important concept when we want to create Bean. Currently we know what, for the cla ...

  3. pip通过requirements.txt安装依赖

    pip install -t . -r requirements.txt requirements.txt Keras==2.0.8 gensim torchvision opencv-python ...

  4. Python 各种测试框架简介

    转载:https://blog.csdn.net/yockie/article/details/47415265 一.doctest doctest 是一个 Python 发行版自带的标准模块.本篇将 ...

  5. [R]Kick start

  6. 8个DBA最常用的监控Oracle数据库的常用shell脚本

    本文介绍了8个常用的监控数据shell脚本.首先回顾了一些DBA常用的Unix命令,以及解释了如何通过Unix Cron来定时执行DBA脚本.网上也有好多类似的文章,但基本上都不能正常运行,花点时间重 ...

  7. SpringBoot添加对Mybatis的支持

    1.修改maven配置文件pom.xml,添加对mybatis的支持: <dependency> <groupId>org.mybatis.spring.boot</gr ...

  8. 【转】java 线程的几种状态

    java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...

  9. 第八周(3) Word2007样式

    第八周(3) Word2007样式 教学时间 2013-4-19 教学课时 2 教案序号 23 教学目标 1.掌握样式的概念2.能够熟练地创建样式.修改样式的格式,使用样式3.熟练利用样式格式化文档 ...

  10. 创建一个入门的JAVA WEB站点(REST JERSEY)

    最近一直在看TOMCAT,想要自己创建一个小WEB站点,有不想要部署在其他的容器内这是一个不错的学习对象. 一.选择合适的模版 mvn archetype:generate -DarchetypeCa ...