a976209770 发表于 2024-11-8 13:52

APM32E103VE SPI数据左移问题的分析与解决方案

一、问题描述在部分客户使用的基于APM32E103VE的项目中,SPI作为从设备时,偶尔会出现数据左移1位的问题。具体表现为:

[*]客户板子上仅挂载了1个SPI外设。
[*]数据左移问题不稳定,在特定的场景下出现。
二、问题分析通过客户反馈和测试,我们初步推测该问题可能与SPI模块的初始化或配置有关。由于SPI数据的同步发送与接收高度依赖时序,因此可能存在某些情况下SPI寄存器未正确初始化,导致数据传输时发生时序错误。
三、解决方案及调试建议
[*]重新启用SPI模块
通过将 SPI_CR1 寄存器中的 SPE 置高再置低,尝试重新启用SPI模块。
具体步骤如下:

[*]将 SPI_CR1->SPE 先置0,再置1。
[*]这可以确保SPI模块的内部状态机被重新初始化,从而解决数据传输时的潜在时序问题。
[*]切换主从模式
如果重新启用SPI无效,则建议通过切换SPI的主从模式进行调试。
具体操作如下:

[*]先将 SPI_CR1->SSI 和 SPI_CR1->MSTR 置高,配置为主模式。
[*]随后将 SPI_CR1->SSI 和 SPI_CR1->MSTR 置低,切换回从模式。
[*]这种方式可以刷新SPI模块的配置,从而确保数据同步。
[*]优化从机发送空闲数据的处理
客户反馈表明:在代码中移除第一次发送空闲数据的操作后,数据左移的问题得到了缓解。

[*]初步推测,SPI从设备在初始化时立即发送数据可能会引发时序错误,因此建议在从设备初始化完成后,先确保接收缓存清空,再开始正常的数据通信流程。
四、示例代码以下为调试建议的示例代码片段:
// 重新启用SPI模块
SPI1->CR1 &= ~SPI_CR1_SPE;// 禁用SPI
SPI1->CR1 |= SPI_CR1_SPE;   // 启用SPI

// 切换主从模式
SPI1->CR1 |= (SPI_CR1_SSI | SPI_CR1_MSTR);// 配置为主模式
SPI1->CR1 &= ~(SPI_CR1_SSI | SPI_CR1_MSTR); // 切换回从模式

// 从机发送数据前的清空处理
volatile uint8_t dummy = SPI1->DR;// 清空接收缓存
五、总结
[*]对于APM32E103VE SPI作为从设备时出现的数据左移问题,主要是通过重新初始化SPI模块或切换主从模式来解决。
[*]移除从机发送空闲数据的操作可能避免了时序上的冲突。
[*]建议客户在调试过程中逐步应用上述方案,并观察是否能稳定解决问题。


豆杀包 发表于 2024-11-9 18:11

我觉得可能是SPI的CSN上拉的问题

菜鸟的第一步 发表于 2024-11-16 20:33

为啥要切主从模式,没看懂
页: [1]
查看完整版本: APM32E103VE SPI数据左移问题的分析与解决方案