主机端:

  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. <<SPIF)));
  42. return SPDR;
  43. }
  44.  
  45. void WriteByte(byte value)
  46. {
  47. SPDR = value;
  48. <<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. <<SPIF)));
  27. return SPDR;
  28. }
  29.  
  30. void writeByte(byte value)
  31. {
  32. SPDR = value;
  33. <<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. }

通过底层AVR方法实现SPI数据传输的更多相关文章

  1. 进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输

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

  2. SPI数据传输(库函数方法)

    主机端: /********************************* 代码功能:SPI数据传输(主机端) 引脚说明: SS/CS:片选(高电平屏蔽,低电平启用) MOSI :主机送出信号 M ...

  3. 进阶之路(基础篇) - 008 SPI数据传输(库函数方法)

    主机端: /********************************* 代码功能:SPI数据传输(主机端) 引脚说明: SS/CS:片选(高电平屏蔽,低电平启用) MOSI :主机送出信号 M ...

  4. 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较

    我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...

  5. Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化

    我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...

  6. Linux驱动 - SPI驱动 之四 SPI数据传输的队列化

    我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...

  7. 2019-5-29-Roslyn-让-VisualStudio-急速调试底层库方法

    title author date CreateTime categories Roslyn 让 VisualStudio 急速调试底层库方法 lindexi 2019-5-29 20:2:9 +08 ...

  8. EF 底层封装方法(供参考)

    闲暇之余,整理了一下EF底层的一些基础方法,供查看,只有接口,具体实现需要你们自己写了. 建议:接口的实现定义为虚方法,当父类的方法不满住子类需求时,可以重写此方法 此接口都为公用方法,基本上满足小系 ...

  9. jQuery晦涩的底层工具方法们

    这里整理的是jQuery源码中一些比较晦涩难懂的.内部的.最底层的工具方法,它们多为jQuery的上层api方法服务,目前包括: jQuery.access jQuery.access: functi ...

随机推荐

  1. jquery选择器之层级选择器

    HTML示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  2. html5-websocket初探

    HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广和使用,而websocket作为一种新的web通信技术具有巨大意义. 什 ...

  3. UML,Powerdesigner 使用方法

    http://blog.163.com/guomaolin_gavin/blog/static/199618307201272674936220/

  4. Java学习总结(二)----Java语言基础

    1.     Java语言基础 2.1 关键字 定义:被java语言赋予特殊含义的单词 特点:关键字中的字母都为小写 用于定义数据类型的关键字 class,interface,byte,short,i ...

  5. Tcpdump使用常用9实例

    以下将给出9个使用tcpdump的例子,以说明tcpdump的具体使用方法. 1.针对特定网口抓包(-i选项) 当我们不加任何选项执行tcpdump时,tcpdump将抓取通过所有网口的包:使用-i选 ...

  6. Asp.net MVC 视图引擎

    Asp.net MVC视图引擎有两种: 1.ASPX View Engine 这个做过WebForm的人都清楚 设计目标:一个用于呈现Web Form页面的输出的视图引擎. 2.Razor View ...

  7. Java多线程--wait和join

    首先从公司一道笔试题开始 package test; public class Test implements Runnable { public int i = 0; @Override publi ...

  8. 关于JS中的JSON

    早期,一般是使用XML作为互联网上传输结构化数据的,但由于它解析麻烦,字符冗长,因此被轻量级的JSON所逐渐替代.JSON是JavaScript的一个严格子集,利用了JavaScript中一些模式来表 ...

  9. OpenGL 学习

    一.红宝书学习资料汇集 第八版的图书源码 源代码: http://opengl-redbook.com/Code/oglpg-8th-edition.zip 第九版的图书源码 http://www.o ...

  10. SQL Error (1130): Host '192.168.1.126' is not allowed to connect to this MySQL server

    通过HeidiSQL连接MYSQL数据库报错: SQL Error (1130): Host '192.168.1.126' is not allowed to connect to this MyS ...