打印
[应用相关]

【STM32】SPI的基本原理、库函数(SPI一般步骤)

[复制链接]
2104|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
SPI的基本介绍
SPI的简介
SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口,是Motorola首先在其MC68HCXX系列处理器上定义的。

SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200。

SPI分为主、从两种模式,一个SPI通讯系统需要包含一个(且只能是一个)主设备,一个或多个从设备。SPI接口的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。

优点:支持全双工通信、通信简单、数据传输速率快;
缺点:没有指定的流控制,没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据的可靠性上有一定的缺陷。
STM32中SPI接口的特点

3线全双工同步传输;
8或16位传输帧格式选择;
主或从操作,支持多主模式;
主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变;
可编程的时钟极性和相位;
可编程的数据顺序,MSB在前或LSB在前;
可触发中断的专用发送和接收标志;
SPI总线忙状态标志;
支持可靠通信的硬件CRC;
可触发中断的主模式故障、过载以及CRC错误标志;
支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求。


使用特权

评论回复
沙发
可怜的小弗朗士|  楼主 | 2024-6-1 20:14 | 只看该作者
SPI协议
SPI引脚说明
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。这四根线分别是MISO、MOSI、SCLK、CS
CS:控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(一般默认为低电位),对此芯片的操作才有效,这就允许在同一总线上连接多个SPI设备成为可能。

也就是说:当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低。
MISO/MOSI/SCLK:通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,MISO,MOSI则基于此脉冲完成数据传输。数据输出通过MOSI线,数据在时钟上升沿或下降沿时采样,同时也会有返回数据用于接受。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

要注意的是:

SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备;
在点对点的通信中,SPI接口不需要进行寻址操作,且为全双工通信,显得简单高效。在多个从设备的系统中,每个从设备需要独立的使能信号,硬件上比I2C系统要稍微复杂一些。

使用特权

评论回复
板凳
可怜的小弗朗士|  楼主 | 2024-6-1 20:14 | 只看该作者
SPI通讯模式
SPI通信有4种不同的模式,不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式
时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,时钟相位CPHA是用来配置数据采样是在第几个边沿:

CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时;
CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时;
CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿;
CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿。

使用特权

评论回复
地板
deliahouse887| | 2024-6-4 17:06 | 只看该作者
CPOL定义了空闲时SCLK的状态(高或低),CPHA定义了数据采样和变化相对于时钟边沿的位置。

使用特权

评论回复
5
maqianqu| | 2024-6-7 20:44 | 只看该作者
根据全双工或半双工模式,可能需要单独的接收函数或在发送函数中同时接收数据。

使用特权

评论回复
6
qiufengsd| | 2024-6-8 15:05 | 只看该作者
使用SPI_I2S_SendData和SPI_I2S_ReceiveData函数进行数据的发送和接收。这两个函数分别用于启动SPI数据传输并获取接收到的数据。

使用特权

评论回复
7
sheflynn| | 2024-6-8 22:54 | 只看该作者
使用SPI_InitTypeDef结构体配置SPI的各项参数,包括模式、时钟极性与相位、时钟分频等,然后调用SPI_Init()函数进行初始化。

使用特权

评论回复
8
timfordlare| | 2024-6-9 16:19 | 只看该作者
在发送和接收数据时,需要注意数据的格式、长度和同步性

使用特权

评论回复
9
yangxiaor520| | 2024-6-9 16:29 | 只看该作者
SPI和UART是单片机外设中最常用的通信接口

使用特权

评论回复
10
tabmone| | 2024-6-10 15:37 | 只看该作者
根据从设备的能力合理设置SPI的时钟频率,过高可能引起通信错误。

使用特权

评论回复
11
janewood| | 2024-6-10 22:44 | 只看该作者
由于SPI通常是全双工通信,所以在发送和接收数据时,需要确保数据的同步。如果是半双工(如只发送或只接收),则相对简单些。

使用特权

评论回复
12
tifmill| | 2024-6-11 20:44 | 只看该作者
正确使用 SS 引脚选择从设备,避免在数据传输时误选其他从设备。

使用特权

评论回复
13
everyrobin| | 2024-6-12 10:39 | 只看该作者
SPI 协议的时钟极性和相位对数据传输有重要影响。

使用特权

评论回复
14
modesty3jonah| | 2024-6-12 14:39 | 只看该作者
如果需要处理SPI通信中的中断事件(如接收完成、发送完成等),需要配置相应的中断服务程序并启用中断。

使用特权

评论回复
15
youtome| | 2024-6-12 21:41 | 只看该作者
进行数据传输或接收时,要检查SPI设备的状态,避免在设备正忙时发起新的传输请求。

使用特权

评论回复
16
robertesth| | 2024-6-14 13:58 | 只看该作者
通信结束后,通过SPI_Cmd()函数禁用SPI,以节省功耗。

使用特权

评论回复
17
elsaflower| | 2024-6-14 18:26 | 只看该作者
如果使用中断功能,应正确配置中断优先级及处理程序,保证数据传输的及时响应。

使用特权

评论回复
18
mmbs| | 2024-6-16 09:21 | 只看该作者
在SPI传输过程中可能会出现错误情况,如传输/接收错误、时钟故障等,应当加入错误处理机制来应对这些状况。

使用特权

评论回复
19
lzbf| | 2024-6-16 21:43 | 只看该作者
若使用硬件NSS,需要将NSS引脚设置为GPIO_Mode_AF_PP模式;如果使用软件NSS,则需要适当配置相关寄存器以管理NSS的行为。

使用特权

评论回复
20
timfordlare| | 2024-6-17 16:52 | 只看该作者
每个从设备需要独立的片选信号来控制何时开始通信。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

746

帖子

0

粉丝