- Arduino教程
- Arduino - 主页
- Arduino - 概述
- Arduino - 板描述
- Arduino - 安装
- Arduino - 程序结构
- Arduino - 数据类型
- Arduino - 变量和常量
- Arduino - 操作员
- Arduino - 控制语句
- Arduino - 循环
- Arduino - 功能
- Arduino - 字符串
- Arduino - 字符串对象
- Arduino - 时间
- Arduino - 数组
- Arduino 函数库
- Arduino - I/O 函数
- Arduino - 高级 I/O 功能
- Arduino - 字符函数
- Arduino - 数学库
- Arduino - 三角函数
- Arduino高级版
- Arduino - 到期与归零
- Arduino - 脉宽调制
- Arduino - 随机数
- Arduino - 中断
- Arduino - 通信
- Arduino - 内部集成电路
- Arduino - 串行外设接口
- Arduino 项目
- Arduino - LED 闪烁
- Arduino - LED 褪色
- Arduino - 读取模拟电压
- Arduino - LED 条形图
- Arduino - 键盘注销
- Arduino - 键盘消息
- Arduino - 鼠标按钮控制
- Arduino - 键盘串口
- Arduino 传感器
- Arduino - 湿度传感器
- Arduino - 温度传感器
- Arduino - 水检测器/传感器
- Arduino - PIR 传感器
- Arduino - 超声波传感器
- Arduino - 连接开关
- 电机控制
- Arduino - 直流电机
- Arduino - 伺服电机
- Arduino - 步进电机
- Arduino 和声音
- Arduino - 音调库
- Arduino - 无线通信
- Arduino - 网络通信
- Arduino 有用资源
- Arduino - 快速指南
- Arduino - 有用的资源
- Arduino - 讨论
Arduino - 串行外设接口
串行外设接口 (SPI) 总线是一种串行通信系统,最多使用四个导线,通常为三个。一根导体用于数据接收,一根用于数据发送,一根用于同步,另一根用于选择要通信的设备。它是全双工连接,这意味着数据的发送和接收是同时进行的。最大波特率高于I2C通信系统中的波特率。
板 SPI 引脚
SPI 使用以下四根线 -
SCK - 这是由主机驱动的串行时钟。
MOSI - 这是由主机驱动的主机输出/从机输入。
MISO - 这是由主机驱动的主机输入/从机输出。
SS - 这是从选择线。
使用以下函数。您必须包含 SPI.h。
SPI.begin() - 通过将 SCK、MOSI 和 SS 设置为输出、将 SCK 和 MOSI 拉低、将 SS 拉高来初始化 SPI 总线。
SPI.setClockDivider(divider) - 设置相对于系统时钟的 SPI 时钟分频器。在基于 AVR 的板上,可用的分频器为 2、4、8、16、32、64 或 128。默认设置为 SPI_CLOCK_DIV4,它将 SPI 时钟设置为系统时钟频率的四分之一(对于系统时钟频率为 5 Mhz)。板频率为 20 MHz)。
分频器- 可以是(SPI_CLOCK_DIV2、SPI_CLOCK_DIV4、SPI_CLOCK_DIV8、SPI_CLOCK_DIV16、SPI_CLOCK_DIV32、SPI_CLOCK_DIV64、SPI_CLOCK_DIV128)。
SPI.transfer(val) - SPI 传输基于同时发送和接收:接收到的数据在 receiveVal 中返回。
SPI.beginTransaction(SPISettings(speedMaximum, dataOrder, dataMode)) − speedMaximum 是时钟、dataOrder(MSBFIRST 或 LSBFIRST)、dataMode(SPI_MODE0、SPI_MODE1、SPI_MODE2 或 SPI_MODE3)。
SPI 有四种操作模式,如下所示:
模式 0(默认) - 时钟通常为低电平 (CPOL = 0),并且在从低电平到高电平(前沿)的转换时对数据进行采样 (CPHA = 0)。
模式 1 − 时钟通常为低电平 (CPOL = 0),并且在从高电平到低电平(后沿)的转换时对数据进行采样 (CPHA = 1)。
模式 2 − 时钟通常为高电平 (CPOL = 1),并且在从高电平到低电平(前沿)的转换时对数据进行采样 (CPHA = 0)。
模式 3 − 时钟通常为高电平 (CPOL = 1),并且在从低电平到高电平(后沿)的转换时对数据进行采样 (CPHA = 1)。
SPI.attachInterrupt(handler) - 当从设备从主设备接收数据时调用的函数。
现在,我们将两个 Arduino UNO 板连接在一起;一个作为主人,另一个作为奴隶。
- (SS):引脚 10
- (MOSI):引脚 11
- (MISO):引脚 12
- (SCK):引脚 13
地面是共同的。以下是两块板之间连接的示意图 -
让我们看看 SPI 作为主设备和 SPI 作为从设备的示例。
SPI 作为主控
例子
#include <SPI.h> void setup (void) { Serial.begin(115200); //set baud rate to 115200 for usart digitalWrite(SS, HIGH); // disable Slave Select SPI.begin (); SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8 } void loop (void) { char c; digitalWrite(SS, LOW); // enable Slave Select // send test string for (const char * p = "Hello, world!\r" ; c = *p; p++) { SPI.transfer (c); Serial.print(c); } digitalWrite(SS, HIGH); // disable Slave Select delay(2000); }
SPI 作为从机
例子
#include <SPI.h> char buff [50]; volatile byte indx; volatile boolean process; void setup (void) { Serial.begin (115200); pinMode(MISO, OUTPUT); // have to send on master in so it set as output SPCR |= _BV(SPE); // turn on SPI in slave mode indx = 0; // buffer empty process = false; SPI.attachInterrupt(); // turn on interrupt } ISR (SPI_STC_vect) // SPI interrupt routine { byte c = SPDR; // read byte from SPI Data Register if (indx < sizeof buff) { buff [indx++] = c; // save data in the next index in the array buff if (c == '\r') //check for the end of the word process = true; } } void loop (void) { if (process) { process = false; //reset the process Serial.println (buff); //print the array on serial monitor indx= 0; //reset button to zero } }