树莓派(主)与STM32(从)使用SPI通信

本文详细介绍了如何使用树莓派通过SPI协议与STM32进行全双工8位数据传输。配置了SPI的工作模式0,即CPOL=0,CPHA=0,禁止CRC校验。在树莓派侧,首先需要开启SPI功能,然后通过BCM支持包进行通信。STM32端进行了SPI初始化,设置为从机模式,全双工8位传输。在主函数中实现了数据的发送与接收,并通过串口将数据打印到电脑上。

1.实验目的

使用树莓派向 STM32 发送数据,STM32 收到数据后通过串口的方式将数据打印到电脑上,同时返回给树莓派数据。树莓派接收到数据后打印在控制台上。
SPI 的配置为

树莓派主机
STM32 从机
全双工
8 bit 传输
工作模式 0 :CPOL|CPHA = 00
MSB 优先
禁止 CRC 校验

2.SPI 简介

SPI(Serial Peripheral Interface,串行外设接口)是 Motorola 公司提出的一种同步串行数据传输标准

2.1 接口

SPI 接口经常被称为 4 线串行总线,以主/从方式工作,数据传输过程由主机初始化,其使用的 4 条信号线分别为:

  1. SCLK:串行时钟,用来同步数据传输,由主机输出,从机不用配置时钟
  2. MOSI:主机输出从机输入数据线,通常先传输 MSB ;
  3. MISO:主机输入从机输出数据线,通常先传输 LSB ;
  4. 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部分(只讲解SPI和主函数部分)

4.1 spi.c 中 spi 的初始化代码

/* SPI1 引脚初始化,会在HAL_SPI_Init的时候调用*/
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{
   
   
    GPIO_InitTypeDef GPIO_InitStruct = {
   
   0};
    if(spiHandle->Instance==SPI1)
    {
   
   
        __HAL_RCC_SPI1_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
        
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天地神仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值