Ardunio开发实例-两个Arduino之间SPI通信

两个Arduino之间SPI通信

1、SPI通信协议简述

SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。

SPI通信协议使用SCK,MOSI,MISO和SS等四条线路。 SPI总线可以有一个主设备和多个从设备。 主设备是微控制器,而从设备可以是微控制器,ADC,DAC等。在这里对SPI通信协议不做详细描述,在后期的文章中做专门描述。

一个典型的SPI总线配置如下图所示:

在这里插入图片描述

  • SCK = Serial Clock:时钟信号,由主设备产生。该线路用于时钟脉冲,以同步来自主设备的数据传输。
  • MOSI = Master Out Slave In :主设备数据输出,从设备数据输入。该线路用于将数据从主设备发送到从设备。
  • MISO = Master In Slave Out :主设备数据输入,从设备数据输出。该线路用于将数据从从设备发送到主设备。
  • SS = Slave Select:从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。

在本实例中,将使用Arduino的SPI通信端口。 作为示例,我们将看到两个Arduino板之间的SPI通信。 它是4线串行通信协议。 它支持单主机和多从机通讯。在本实例中,我们将一个Arduino配置为主设备,将另一块板配置为从设备。

2、硬件准备

  • Arduino UNO R3开发板两个及两根数据线
  • 杜绑若干
  • 笔记本电脑一台

Arduino的SPI引脚如下:

在这里插入图片描述
其中:

  • Pin11 = MOSI
  • Pin12 = MISO
  • Pin13 = SCK
  • Pin10 = SS

两块Arduino UNO开发板硬件接线如下图:

在这里插入图片描述

Ardunio UNO开发板连接到电脑。

3、软件准备

  • Arduino IDE
  • SPI库

4、代码实现

主机代码实现

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
#include <SPI.h>

void setup (void) {
Serial.begin(115200);
// 禁止从机片选
digitalWrite(SS, HIGH);
SPI.begin ();
// 8分频时钟
SPI.setClockDivider(SPI_CLOCK_DIV8);
}

void loop (void) {
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);
}

从机代码

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
#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;

void setup (void) {
Serial.begin (115200);
// 由于需要向主机发送数据,因此设置为输出
pinMode(MISO, OUTPUT);
// 设置成从机模式
SPCR |= _BV(SPE);
indx = 0; // buffer empty
process = false;
// 启动中断
SPI.attachInterrupt();
}

// SPI中断回调函数
ISR (SPI_STC_vect){
// 从SPI数据寄存器读取数据
byte c = SPDR;
if (indx < sizeof buff) {
buff [indx++] = c;
if (c == '\r')
process = true;
}
}

void loop (void) {
if (process) {
process = false;
Serial.println (buff);
indx= 0;
}
}

文章来源: https://iotsmart.blog.csdn.net/article/details/114494737