Arduino SPI库

SPI库可以让Arduino与SPI设备进行通信。 您可以将Arduino作为主设备,与其他SPI设备(从)进行SPI通信或多设备间的SPI通讯。

SPI接口简介

串行外围设备接口(SPI)是微控制器使用的同步串行数据协议,用于在短距离内快速与一个或多个外围设备进行通信。它也可以用于两个开发板之间相互的通信。

使用SPI连接,总是有一个主设备(通常是微控制器)来控制外围设备。通常,所有设备共用以下三条线:

  • MISO(Master In Slave Out)-从机线路,用于向主机发送数据,
  • MOSI(Master Out Slave In)-主机线路,用于向外围设备发送数据,
  • SCK(串行时钟)-同步主机产生的数据传输的时钟脉冲

每个从设备专用的一条线:

  • SS(从设备选择)-主设备可用此引脚来决定启用或禁用指定设备。

当从设备的CS引脚为低电平时,它与主机通信。同理CS引脚电平为高时,它将忽略连接到CS引脚的设备, 不与之进行数据交互。

使用之前使用以下语句进行Wire库声明 

#include <SPI.h>

下表显示了SPI引脚在各种Arduino板上的位置。 

Board
SPI pins
Uno
11 (MOSI), 12 (MISO), 13(SCK), 10(SS)
Mega2560
51 (MOSI), 50 (MISO), 52(SCK), 53(SS)
Leonardo ICSP-4 (MOSI), ICSP-1 (MISO), ICSP-3(SCK), -(SS)

您可以根据自己的开发板类型进行连线

Arduino SPI库

基于AVR的板上的从选择(SS)引脚的说明

所有基于AVR的板都有一个SS引脚,当它们充当由外部主机控制的从机时,该引脚很有用。由于该库仅支持主模式,因此该引脚应始终设置为OUTPUT,否则硬件会自动将SPI接口设置为从模式,从而使库无法工作。

此外,您也可以将任何引脚用作从设备的选择引脚(SS)。例如,Arduino以太网扩展板使用引脚10控制到板载SD卡的SPI连接,并使用引脚10控制到以太网控制器的连接。


库函数
函数 用途 参数说明 返回值
SPISettings(
speedMaximum,
dataOrder,
dataMode)
SPISettings对象用于为SPI设备配置SPI端口。

speedMaximum: 最高的通讯速度。

(对于额定频率高于20 MHz的SPI芯片,请使用20000000)。

dataOrder: 数据传输顺序选择
MSBFIRST
LSBFIRST
dataMode :数据模式选择
SPI_MODE0(默认)
SPI_MODE1
SPI_MODE2
SPI_MODE3
begin()

SPI总线初始化。

即将SCK(Pin13),MOSI(Pin11)和SS(Pin10)默认引脚设置为输出模式,并将SCK和MOSI设置为低电平,SS为高电平。

beginTransaction(
settings)
使用SPISettings中的配置进行SPI总线初始化。
SPISettings:指定配置
end()
停止使用SPI总线
(在初始化时设置的各个引脚输出模式将不会改变)。
endTransaction()
停止使用SPI总线

(通常在禁用某引脚上的从设备后调用此函数,以允许其他库使用SPI总线)。

transfer(val)
transfer16(val16)
transfer(buffer, size)
传输数据。

SPI传输是同时发送和接收的:接收到的数据以receivedVal(或receivedVal16)形式返回。在缓冲区传输的情况下,接收到的数据就地存储在缓冲区中(旧数据将替换为接收到的数据)。

val: 通过总线发送的字节
val16:通过总线发送的两个字节变量
buffer: 要传输的数据数组
接收到的数据
usingInterrupt(
irqNo)
如果你的SPI通讯是在中断中进行的,需要使用此函数来设置中断编号。
irqNo: 中断编号

两块UNO开发板通过SPI通讯

两块Arduino UNO R3开发板通过SPI进行通讯,则需要其中一块作为主设备,另外一块(或多块)作为从设备,同时两块开发板需要共地连接,引脚接线方式如下:

            UNO(主)       UNO(从)
(MOSI)          11         11
(MISO)          12         12
(SCK)           13         13
(CS)            10         10
GND            GND         GND
主设备程序
#include <SPI.h>
 
void setup () {
  Serial.begin(9600); //初始化串口波特率
  digitalWrite(SS, HIGH); // 禁用从设备HIGH为禁用
  SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0));
}
 
void loop () {
  char c;
  digitalWrite(SS, LOW); //启用从设备
  // 发送测试的字符串
  for (const char * p = "Hello, world!\r" ; c = *p; p++) {
    SPI.transfer(c);
    Serial.print(c);
  }
  digitalWrite(SS, HIGH); // 发送完毕后再次禁用从设备
  delay(2000);
}
从设备程序
#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索引
  }
}


- 本文内容来自网络,如有侵权,请联系本站处理。

2022-06   阅读(2244)   评论(0)
 标签: maker Arduino SPI

涨知识
步进电机

步进电机是将电脉冲信号,转变为角位移或线位移的开环控制电机,又称为脉冲电机。

评论:
相关文章

ESP32 使用DAC模拟输出完成两路呼吸灯

ESP32的DAC函数可以实现真正的模拟输出。


在 ESP32 上使用 LEDC (PWM)

ESP32 没有Arduino输出 PWM 的 analogWrite(pin, value) 方法,取而代之的 ESP32 有一个 LEDC 来实现PWM功能。


《米思齐实战手册:Arduino图形化编程指南》

本书由少年创学院联合创始人兼院长、知名创客程晨撰写,以Arduino作为硬件平台,介绍了使用米思齐(Mixly)软件进行程序开发的方法。


MicroPython SPI类

MicroPython的SPI是一个用于进行串行外设接口总线协议的类。


ESP32 SPI

ESP32有四个SPI外设,分别为SPI0、SPI1、HSPI和VSPI。


Arduino UNO R4 WiFi 官方介绍文档

本文档作为UNO R4 WiFi的技术概览,您将找到一系列资源和指南链接,帮助您开始下一个项目。


OneButton: 用于使用单个按钮进行多用途输入的Arduino库

Arduino OneButton库是一个用于简化按钮操作的库,它可以轻松地处理按钮的单击、双击和长按等操作。适用于Arduino开发板以及ESP32等其他基于Arduino的开发板。


Arduino Bootloader

本文从Arduino Uno入手,看看怎样在这个"简单"的8bit单片机搭建一个属于自己的bootloader


Arduino IDE第三方开发包的制作

许多硬件厂商都希望自己的开发板能被Arduino IDE集成开发环境所支持。这里就以小脚丫开发板所使用的开发包为例,介绍一下第三方开发包的制作方法。

搜索
小鹏STEM教研服务

专属教研服务系统,助您构建STEM课程体系,打造一站式教学环境。