你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

《STM32学习笔记》之From Zero To Hero | SPI通信异常分析

[复制链接]
STMCU-管管 发布时间:2020-3-5 16:36
SPI,全称为 SerialPeripheral Interface(串行外设接口),是一种用于短距离通信的同步串行通信接口,主要应用在嵌入式系统。
这是第二篇分享,《STM32学习笔记》之SPI通信常见问题分析。

SPI的应用场合很广,显示模组、时钟芯片、存储芯片、温度传感器等众多器件都有使用SPI接口通信。这些器件通常作为从设备,STM32作为主设备来控制它们。

STM32 SPI基础内容

绝大部分STM32芯片都有多个SPI外设,它可与外部SPI器件进行半双工/全双工同步串行通信。

1. SPI特性

· 三条线全双工、双线单工同步传输
· 支持 8 位或 16 位传输帧格式选择
· 支持主模式或从模式操作
· 可编程的时钟极性和相位
· 支持 MSB 或 LSB 数据顺序
· 支持DMA收发数据

更多特性请查阅《STM32参考手册》。

2. 引脚描述

MISO:主输入/从输出数据;
MOSI:主输出/从输入数据;
SCK:时钟(主输出,从输入时钟);
NSS:从器件选择,可理解片选信号;

11.png

3. SPI时序

SPI的时序中有两个参数需要注意,那就是时钟相位和时钟极性。在STM32中,SPI时序由CPOL 和 CPHA 这两位来决定。
通过软件配置这两个参数,可分为四种时序关系,如下图:

22.png

4. 数据帧格式

串行同行数据传输分为 MSB 和LSB,也就是最高有效位在前,还是最低有效位在前。(注:最左边的比特位即为最高有效位)。
比如传输一个字节:0x95(10010101)。

33.png

如果按照MSB(高位在前),则发送顺序:1001 0101。
如果按照LSB(低位在前),则发送顺序反过来:1010 1001。

STM32 SPI参数配置

通常STM32的SPI作为主机连接外部从机,要与从机建立正常通信,就必须与从机的参数匹配才行。
这里以【STM32作为SPI主机读写SPI Flash】为例,主要配置参数:双向全双工、主机模式、8位数据、MSB等。

1.标准外设库配置

SPI_InitTypeDef  SPI_InitStructure;
SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex; //双向全双工
SPI_InitStructure.SPI_Mode =SPI_Mode_Master;                      //主机模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //8位数据
SPI_InitStructure.SPI_CPOL =SPI_CPOL_High;                        //时钟极性:空闲为高
SPI_InitStructure.SPI_CPHA =SPI_CPHA_2Edge;                       //时钟相位:第2个时钟沿捕获
SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;                          //软件控制NSS信号
SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_4; //波特率预分频值为4
SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_MSB;                 //数据传输从 MSB 位开始
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);

2. STM32CubeMX配置

44.png

首先选择全双工主机模式,然后再逐步配置下面参数。这里的波特率时钟灰色不可配置,由你系统时钟和分频时钟决定。
这些配置参数比较容易理解(英文清晰明了),若不懂可针对性查阅参考手册。

STM32 SPI常见问题

虽说SPI相对比较简单,但在实际应用过程中还是会存在一些奇怪的问题,下面通过案例来分析SPI常见的一些问题。

问题一:NSS片选问题

有工程师使用硬件NSS控制从机,以为NSS信号是自动控制,导致操作从设备失败。

分析原因:STM32 SPI的NSS信号为片选信号,可“使能”为硬件控制(参看上面参数配置)。
但在应用中同样需要软件操作才能控制NSS信号(高低),比如:
SPI_NSSInternalSoftwareConfig(SPI1,SPI_NSSInternalSoft_Set);
解决办法:按照通信时序,控制NSS信号高低(通常低有效)。

问题二:SPI引脚复用功能问题

STM32的SPI是一种复用功能,之前使用标准外设库的工程师容易遗漏复用功能的配置导致SPI不能使用。

分析原因:SPI有些引脚对应的是特殊功能的引脚,比如:PB3(MISO)对应的是 JTDO,如果不配置则默认这个引脚的功能就是 JTDO的功能。
以前经常存在这种问题,但现在通过工具STM32CubeMX配置时自动配置了复用功能。

解决办法:参考官方提供在初始化代码中配置复用功能(同时,推荐使用HAL库)。
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5,GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6,GPIO_AF_SPI1);

问题三:时钟速率过高问题

有工程师购买一个通信为SPI的模块,最高通信速率8MB/s,他使用10.5MB/s通信速率也能用,但偶尔会出现通信异常。

分析原因:一个芯片标称的最高速率其实是相对保守的值,在条件比较好的情况下超过了最高值也能用,但不能保证稳定性。
STM32 SPI的时钟频率由系统时钟和分频决定,有的工程师没有深入理解这些参数,发现能用就不管了。
如上章节中的21MB/s,如果修改系统时钟,其实这个值会发生相应变化

解决办法:最简单的办法就是修改分频值。同时,如果环境恶劣,建议使用屏蔽线。(在保证整个产品系统实时性的同时,尽量降低通信速率)

问题四:时钟相位问题

有不少工程师在调试SPI时会遇到数据“移位”的问题,数据能收发为什么会出现这种问题呢?

分析原因:SPI通信时钟由主机提供,本身上电时(主从)各自的信号就不稳定,如果从机时钟相位也不匹配,就会因为时钟引起数据移位,或者异常的情况。

解决办法:软件上匹配SPI主从设备的时钟相位,使用通信协议,CRC、 checksum校验等。



收藏 2 评论1 发布时间:2020-3-5 16:36

举报

1个回答
慎微 回答时间:2020-3-6 09:20:27
thanks for your sharing

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版