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

主机端:

 1 /*********************************
 2 代码功能:SPI数据传输(主机端)
 3 引脚说明:
 4     SS/CS:片选(高电平屏蔽,低电平启用)
 5     MOSI :主机送出信号
 6     MISO :主机结收信号
 7     CLK     :时钟脉冲
 8 SPI成员:
 9     begin();
10         功能 :初始化SPI,设置CLK,MISO和SS为输出,将SCK和MOSI拉低,将SS拉高。
11         形式 :SPI.begin();
12         返回值:none
13     setBitOrder();
14         功能:设 置进入和输出SPI总线比特(bit)的顺序:LSBFIRST(低位开始)或者 MSBFIRST (高位开始)。
15         形式:SPI.setBitOrder(order);
16         参数:order:LSBFIRST或 MSBFIRST
17         返回值:none
18     setClockDivider();
19         功能:设置SPI串行通信时钟的分频系数
20         形式:setClockDivider(SPI_CLOCK);
21         参数(SPI_CLOCK)
22             SPI_CLOCK_DIV2      //2分频,系统时钟的 1/2
23             SPI_CLOCK_DIV4      //4分频,系统时钟的 1/4
24             SPI_CLOCK_DIV8      //8分频,系统时钟的 1/8
25             SPI_CLOCK_DIV16     //16分频,系统时钟的 1/16
26             SPI_CLOCK_DIV32      //32分频,系统时钟的 1/32
27             SPI_CLOCK_DIV64      //64分频,系统时钟的 1/64
28             SPI_CLOCK_DIV128     //128分频,系统时钟的 1/128
29     setDataMode();
30         功能:设置数据模式
31         形式:SPI.setDataMode(mode);
32         参数(mede):
33             SPI_MODE0  CPOL = 0 CPHA = 0
34             SPI_MODE1  CPOL = 0 CPHA = 1
35             SPI_MODE2  CPOL = 1 CPHA = 0
36             SPI_MODE3  CPOL = 1 CPHA = 1
37             时钟极性CPOL: 即SPI空闲时,时钟信号SCLK的电平(1:空闲时高电平; 0:空闲时低电平)
38             时钟相位CPHA: 即SPI在SCLK第几个边沿开始采样(0:第一个边沿开始; 1:第二个边沿开始)
39     transfer();
40         功能:在SPI上传输一个字节(byte),发送和接收都是这个函数
41         形式:SPI.transfer(val);
42         参数(val):要发送的字节
43         返回值:从 bus 上读取字节。(读操作使用的时候)
44     end();
45         功能:结束传输
46         形式:end();
47         参数:无
48         返回值:无
49 创作时间:2016*10*10
50 作者邮箱:[email protected]
51 ********************************/
52 #include<SPI.h>                            //共用MOSI从机输入线
53 void setup()
54 {
55   Serial.begin(115200);                    //串口通信波特率
56   Serial.println("start ...");
57   digitalWrite(SS,HIGH);                //SS高电平表示从器件未被选中,从器件不工作,MISO输出高阻;
58   SPI.begin();                            //初始化SPI串口
59   SPI.setClockDivider(SPI_CLOCK_DIV8);    //设置SPI的时钟速率为8分频
60 }
61 void loop()
62 {
63   char c;
64   digitalWrite(SS,LOW);                     //启动周边选择
65   for(const char *p = "Hello world!\n";c = *p;p++)    //送出测试的字符
66   {
67     SPI.transfer(c);        //SPI输出数据
68     Serial.print(c);        //串口输出数据
69   }
70   digitalWrite(SS,HIGH);    //使从器件不工作
71   delay(1000);
72 }

从机端:

 1 /*********************************
 2 代码功能:SPI数据传输(从机端)
 3 创作时间:2016*10*14
 4 作者邮箱:[email protected]
 5 ********************************/
 6 #include<SPI>
 7 char buf[100];                            //设置缓冲区
 8 volatile byte pos;                        //定义一个共享的字符
 9 volatile boolean process_it;            //定义一个共享的整型
10
11 void setup(void)
12 {
13     //通信串口设置
14   Serial.begin(115200);                    //设置串口和波特率
15   Serial.println("start slave");
16   //SPI总线设置
17   pinMode(MISO,OUTPUT);                    //拉高屏蔽主机输出线
18   SPCR |= _BV(SPE);                        //打开ISP在从机
19   SPI.setBitOrder(MSBFIRST);            //传输方式高位开始
20   SPI.setDataMode(SPI_MODE0);            //设置SPI数据模式
21   SPI.setClockDivider(SPI_CLOCK_DIV8);    //设置SPI的时钟速率为8分频
22   //中断使用数据
23   pos = 0;
24   process_it = false;            //假
25   SPI.attachInterrupt();        //准备好中断
26 }
27   //ISR终端服务程序
28 ISR(SPI_STC_vect)
29 {
30   byte c = SPDR;        //从SPI寄存器读取数据
31   if(pos < sizeof(buf))    //判断空间是否使用完
32   {
33     buf[pos++] =c;
34     if(c ==‘\n‘)
35       process_it = true;
36   }
37 }
38 void loop(void)
39 {
40   if(process_it)    //判读数据是否写入结束
41   {
42     String stringOne = String(buf);
43     Serial.print(stringOne);
44     buf[pos] = 0;
45     pos = 0;
46     process_it = false;
47   }
48 }
时间: 2024-07-29 13:59:52

进阶之路(基础篇) - 008 SPI数据传输(库函数方法)的相关文章

【思库教育】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

python之路-基础篇-8 循环

python中循环有两种,分别是for循环和while循环,循环可以将序列的数据进行迭代处理: for循环 for循环依次把list.tuple或字符串中的每个元素迭代出来,例如: names = ["zhangcong", "lisanjiang", "pangzhiguo"] for name in names: print name # 执行结果 zhangcong lisanjiang pangzhiguo 所以for x in - 循环