SPI库
您可以使用Arduino官方自带的SPI库将Arduino作为主设备,从而与其他SPI设备(从)进行SPI通信或多设备间的SPI通讯。
使用此库之前,您需要使用以下语句进行引入
1 |
#include <SPI.h> |
在开始之前,请大家建立一个主从的概念,即一个主设备,多个从设备,主设备可以决定与任意一个从设备进行通讯
SPI接口简介
串行外围设备接口(SPI)是微控制器使用的同步串行数据协议,用于在短距离内快速与一个或多个外围设备进行通信。它也可以用于两个开发板之间相互的通信。
使用SPI连接,总是有一个主设备(通常是微控制器)来控制外围设备。通常,所有设备共用以下三条线:
- MISO(Master In Slave Out)-从机线路,用于向主机发送数据,
- MOSI(Master Out Slave In)-主机线路,用于向外围设备发送数据,
- SCK(串行时钟)-同步主机产生的数据传输的时钟脉冲
每个从设备专用的一条线:
- SS(从设备选择)-主设备可用此引脚来决定启用或禁用指定设备。
当从设备的CS引脚为低电平时,它与主机通信。同理CS引脚电平为高时,它将忽略连接到CS引脚的设备, 不与之进行数据交互。
如何接线
为了方便大家参考,下表列出了不同Arduino板上的SPI的连线:
您可以根据自己的开发板类型进行连线
基于AVR的板上的从选择(SS)引脚的说明
所有基于AVR的板都有一个SS引脚,当它们充当由外部主机控制的从机时,该引脚很有用。由于该库仅支持主模式,因此该引脚应始终设置为OUTPUT,否则硬件会自动将SPI接口设置为从模式,从而使库无法工作。
此外,您也可以将任何引脚用作从设备的选择引脚(SS)。例如,Arduino以太网扩展板使用引脚10
控制到板载SD卡的SPI连接,并使用引脚10
控制到以太网控制器的连接。
两块UNO开发板通过SPI通讯
两块Arduino UNO R3开发板通过SPI进行通讯,则需要其中一块作为主设备,另外一块(或多块)作为从设备,同时两块开发板需要共地连接.
电路连接
1 2 3 4 5 6 7 |
UNO(主) UNO(从) (MOSI) 11 11 (MISO) 12 12 (SCK) 13 13 (CS) 10 10 GND GND GND |
示例程序
主设备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/********************************************************************** 程序名称/Program name : SPI主机通讯 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/06/23 程序目的/Purpose : 演示如何使用UNO(主)和UNO(从)之间进行SPI通讯 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: 本程序来源于以下链接,由Dapenson进行整理和注释, 目的是为了让初学者更好的理解和学习相关内容 http://suo.im/5Hd8cE ***********************************************************************/ #include <SPI.h> void setup () { Serial.begin(9600); //初始化串口波特率 digitalWrite(SS, HIGH); // 禁用从设备HIGH为禁用 SPI.begin (); SPI.setClockDivider(SPI_CLOCK_DIV8);//设置SPI的时钟为八分之一 } void loop () { char c; digitalWrite(SS, LOW); //启用从设备 // 发送测试的字符串 for (const char * p = "Hello, world!\r" ; c = *p; p++) { //太极创客团队 / Taichi-Maker (www.taichi-maker.com) SPI.transfer (c); Serial.print(c); } digitalWrite(SS, HIGH); // 发送完毕后再次禁用从设备 delay(2000); } |
从设备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
/********************************************************************** 程序名称/Program name : SPI从机通讯 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/06/23 程序目的/Purpose : 演示如何使用UNO(主)和UNO(从)之间进行SPI通讯 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: 本程序来源于以下链接,由Dapenson进行整理和注释, 目的是为了让初学者更好的理解和学习相关内容 http://suo.im/5Hd8cE ***********************************************************************/ #include <SPI.h> char buff [50]; volatile byte indx; volatile boolean process; void setup () { Serial.begin (9600); pinMode(MISO, OUTPUT); //将MISO设置为输出以便数据发送主机 SPCR |= _BV(SPE); //在从机模式下打开SPI通讯 indx = 0; // 初始化变量 process = false; SPI.attachInterrupt(); //打开中断 } ISR (SPI_STC_vect) // SPI中断程序 { byte c = SPDR; // 从SPI数据寄存器读取字节 if (indx < sizeof buff) { buff [indx++] = c; // 将数据保存在数组buff中的下一个索引中 if (c == '\r') //检查是否是结尾字符,即检测字符是否是\r回车符 process = true; } } void loop () { if (process) { process = false; //重置通讯过程 Serial.println (buff); //在串口监视器上打印接收到的buff数据 indx = 0; //重置index,即为重置buff索引 } } |
效果演示
使用SPI协议控制AD5206数字电位器
在本教程中,您将学习如何使用串行外设接口(SPI)控制AD5206数字电位器。
当您需要通过电子方式而不是手动方式改变电路中的电阻时,数字电位计非常有用。示例应用包括LED调光,音频信号调节和音调生成。在本示例中,我们将使用六通道数字电位器来控制六个LED的亮度。我们将介绍实现SPI通信的步骤,可以将其修改为与其他大多数SPI设备一起使用。太极创客团队 / Taichi-Maker (www.taichi-maker.com)
所需硬件
- Arduino或Genuino板
- AD5206数字电位器
- 6个LED
- 6个220欧姆电阻
- 杜邦线
- 面包板
AD5206数字电位器简介
AD5206是6信道数字电位器。内置了六个可变电阻器(电位计),可用于单独电子控制。芯片上的六个内部可变电阻器中的每一个都有三个引脚,它们的连接可以像使用机械电位计一样。各个可变电阻器引脚分别标记为Ax、Bx、Wx、A1、B1、W1
。太极创客团队 / Taichi-Maker (www.taichi-maker.com)
例如,在本教程中,我们将每个可变电阻器当作一个分压器,方法是将一个侧面引脚(引脚B)拉高,将另一个侧面引脚(引脚A)拉低,然后取中心引脚(Wiper)的可变电压输出。在这种情况下,AD5206提供的最大电阻为10k欧姆,以255
(最大为255,最小为0)数值进行数据输出。太极创客团队 / Taichi-Maker (www.taichi-maker.com)
以下将AD5206数字电位器的一些基本信息列出
电路连接
原理图
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
/********************************************************************** 程序名称/Program name : DigitalPotControl 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/06/30 程序目的/Purpose : 本示例演示了如何使用SPI控制AD5206数字电位器。 AD5206可使用SPI进行控制,发送命令时请发送两个数值, 一个是通道号(0-5),另一个是该通道的映射电阻值(0-255)。 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: 电路: AD5206的所有A引脚都连接到+ 5V AD5206的所有B引脚都接地 每个W引脚与GND串联一个LED和一个220欧姆电阻 CS-到数字引脚10(SS引脚) SDI-到数字引脚11(MOSI引脚) CLK-至数字引脚13(SCK引脚) 注意: 本程序来源于以下地址, 由Dapenson进行整理注释 https://www.arduino.cc/en/Tutorial/DigitalPotControl ***********************************************************************/ // 引入SPI库(Arduino自带,无需下载安装) #include <SPI.h> // 将引脚10设置为从设备数字电位器的使能引脚: const int slaveSelectPin = 10; void setup() { // 将slaveSelectPin设置为输出: pinMode(slaveSelectPin, OUTPUT); // 初始化SPI SPI.begin(); } void loop() { // 循环数字电位器的六个通道: for (int channel = 0; channel < 6; channel++) { // 将当前通道的电阻从最小值更改为最大值: for (int level = 0; level < 255; level++) { digitalPotWrite(channel, level); delay(10); } // 在变化之前延时100毫秒 delay(100); // 将当前通道的电阻从最大值更改为最小值: for (int level = 0; level < 255; level++) { digitalPotWrite(channel, 255 - level); delay(10); } } } void digitalPotWrite(int address, int value) { // 将SS引脚拉低以启用从设备AD5206数字电位器: digitalWrite(slaveSelectPin, LOW); delay(100); // 通过SPI发送地址和值: SPI.transfer(address); SPI.transfer(value); delay(100); // 将SS引脚拉高以取消选择从设备: // 即在每次发送完毕之后禁用从设备 digitalWrite(slaveSelectPin, HIGH); } |
SPI库函数
- setBitOrder太极创客团队 / Taichi-Maker (www.taichi-maker.com)
- usingInterrupt太极创客团队 / Taichi-Maker (www.taichi-maker.com)