1.实验目的
使用树莓派作为主机向 STM32 从机发送数据,STM32 收到数据后通过串口的方式将数据打印到电脑上,同时返回给树莓派数据。树莓派接收到数据后打印在控制台上。
2.SPI 简介
SPI(Serial Peripheral Interface,串行外设接口)是 Motorola 公司提出的一种同步串行数据传输标准
2.1 接口
SPI 接口经常被称为 4 线串行总线,以主/从方式工作,数据传输过程由主机初始化,其使用的 4 条信号线分别为:
- SCLK:串行时钟,用来同步数据传输,由主机输出,从机不用配置时钟
- MOSI:主机输出从机输入数据线,通常先传输 MSB ;
- MISO:主机输入从机输出数据线,通常先传输 LSB ;
- CS:片选线,低电平有效,由主机输出。
在 SPI 总线上,某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机。连接是对应相连,如下所示
SCLK-----SCLK
MOSI-----MOSI
MISO-----MISO
CS-----CS
2.2 数据传输
在一个 SPI 时钟周期内,会完成如下操作:
- 主机通过 MOSI 线发送 1 位数据,从机通过该线读取这 1 位数据;
- 从机通过 MISO 线发送 1 位数据,主机通过该线读取这 1 位数据。
这是通过移位寄存器来实现的。如下图所示,主机和从机各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。
2.3 时钟极性和时钟相位
在 SPI 操作中,最重要的两项设置就是时钟极性( CPOL 或 UCCKPL )和时钟相位( CPHA 或 UCCKPH )。
- CPOL 表示时钟信号的初始电平的状态(就是空闲状态),CPOL 为 0 表示时钟信号初始状态为低电平,为 1 表示时钟信号的初始电平是高电平。
- CPHA 表示在哪个时钟沿采样数据,CPHA 为 0 表示在首个时钟变化沿采样数据,而 CPHA 为 1 则表示在第二个时钟变化沿采样数据。
主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。所以为了保证主从机正确通信,应使得它们的SPI具有相同的时钟极性和时钟相位。
2.4 SPI的4种工作模式
由于 CPOL 和 CPHA 都有两种不同状态,所以 SPI 分成了 4 种模式。我们在开发的时候,使用比较多的是模式 0 和模式 3 ,如下表所示
SPI工作模式 | CPOL | CPHA | SCL空闲状态 | 采样边沿 | 采样时刻 |
---|---|---|---|---|---|
0 | 0 | 0 | 低电平 | 上升沿 | 奇数边沿 |
1 | 0 | 1 | 低电平 | 下降沿 | 偶数边沿 |
2 | 1 | 0 | 高电平 | 下降沿 | 奇数边沿 |
3 | 1 | 1 | 高电平 | 上升沿 | 偶数边沿 |
2.5 优缺点
优点:
- 支持全双工操作
- 操作简单
- 数据传输速率较高
缺点:
- 需要占用主机较多的口线(每个从机都需要一根片选线)
- 只支持单个主机
3.树莓派部分
3.1 开启SPI
树莓派默认是没有开启 SPI 的功能的,我们需要手动去开启一下
在终端输入
raspi-config
然后跟着下面的图进行操作(小键盘上下左右是选择,回车是确定)
输入命令
ls /dev/spi*
出现如下图的样子,就是成功打开了
3.2 安装vscode(可选)
3.3 下载bcm支持包
4.STM32部分
5.验证结果
cd “/home/pi/SPI_test/bcm2835-1.71/examples/spi/” && gcc *.c -o spi && "/home/pi/SPI_test/bcm2835-1.71/examples/spi/"spi
6.部分问题
7.源码
树莓派bcm2835-1.71(带本实验所需程序)
STM32F407从机SPI使用HAL库轮询方式