STM32F103C8T6的SPI收发数据错误的问题

项目场景:

本人最近在做一个STM32F103C8T6的两个SPI模块自通信实验,旨在验证SPI收发数据的正确性。即事先设定好两个SPI模块发送的值,通过ST-LINK单步调试观察单片机内部寄存器的值。待发送的数据如下:
在这里插入图片描述

同时定义两个SPI的接收数组:
在这里插入图片描述


问题描述

单片机全速运行时,发现传输结果中出现了数据错误:
下图为单步调试中,两个SPI模块数组的接收内容:
在这里插入图片描述
很明显和发送数据不匹配。


原因分析:

参考了网上的一些解决方案,有人说是因为在watch窗口中观察了SPIx->DR或者SPIx->SR导致发送和接收会出问题,试了一下,接收数据还是与发送数据不匹配。后来参考了这篇博客https://amobbs.com/thread-5559839-1-1.html,受到启发,更改了主机和从机的时钟极性和时钟相位:

原先导致出错的设置:

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
 	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 	
  	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;   		
  	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  	SPI_InitStructure.SPI_CRCPolynomial = 7;

更改之后的设置:

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
 	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 	
  	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;   		
  	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;	/* 更改在此处,使主机和从机在时钟下降沿读取数据 */
  	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
  	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  	SPI_InitStructure.SPI_CRCPolynomial = 7;

实验结果:

在这里插入图片描述
可以看到SPI1和SPI2实现了正确的数据接收。


实验总结:

这里我更改了
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; 两个SPI模块就实现了正确的数据接收。
为什么更改CPHA位就能实现正确的数据接收,具体原因还未深入研究,可能是MOSI和MISO管脚的数据在SCLK时钟下降沿比较稳定,或者说SCLK时钟信号的下降沿毛刺比较小等。

希望能帮助更多遇到同样问题的同学,也欢迎大家留言讨论~

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SPI(串行外设接口)是一种串行通信协议,用于在微控制器或其他集成电路之间进行数据传输。SPI接口通常由一个主设备和一个或多个从设备组成。 SPI通信是全双工的,意味着主设备可以同时发送和接收数据。通信通过四个线路进行:时钟线、主输入/从输出(MISO)线、主输出/从输入(MOSI)线和片选(Chip Select,CS)线。主设备通过将时钟线设置为高电平和低电平来控制通信的同步。 在SPI通信中,主设备通过选择特定的从设备,将其片选线置为低电平,以标识正在与该设备通信。然后,主设备通过MOSI线发送数据,从设备通过MISO线接收数据。同时,从设备也可以将数据通过MISO线发送给主设备。 SPI的操作速度相对较快,可以在较短的时间内传输大量数据SPI接口通常被用于与外部设备进行通信,如存储器芯片、传感器、显示屏等。 对于SPI接口的收发数据操作,主设备首先通过设置适当的寄存器或控制位来配置SPI接口的通信参数,如数据位长度、时钟频率等。然后,主设备将待发送的数据写入发送缓冲区,通过MOSI线发送出去。同时,主设备可以通过读取接收缓冲区来接收从设备发送的数据,通过MISO线获取。 SPI收发数据操作是基于硬件的,需要根据具体的使用平台和设备进行正确的配置和编程。在编程过程中需要注意时钟频率、数据位顺序、传输模式等细节,以确保数据的正确传输和接收。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值