[其他ST产品] 在半双工/单工模式下正确停用SPI的方法

[复制链接]
 楼主| 咚了个咚 发表于 2025-7-24 23:20 | 显示全部楼层 |阅读模式
本帖最后由 咚了个咚 于 2025-7-24 23:22 编辑

我让STM32F4在一定时间后从从机模式切换为主机模式,作为主机发送消息,然后再切换回从机模式。如果将SPI配置为slave_rxonly并启用SPI,当我将设备重新配置为主机时,会意外地立即发送时钟信号。而我此时并没有发送任何数据。
这是我的主循环。
while (1)  {    /* USER CODE END WHILE */     /* USER CODE BEGIN 3 */          MX_SPI1_Init(); /* This configures master */          HAL_Delay(10);           sendHelloWorld();          configSlave(); /* Configures slave mode */          __HAL_SPI_ENABLE(&hspi1); /* Enabling the device in this mode generates a continous clock during master init */           HAL_Delay(100);           HAL_SPI_DeInit(&hspi1);        /* Disables SPI and de-initializes the peripheral */  }
公羊子丹 发表于 2025-7-25 07:26 | 显示全部楼层
你这个看着像是 SPI_CR1 寄存器里的位没清干净,切换模式前最好关一下 SPI。
周半梅 发表于 2025-7-25 07:27 | 显示全部楼层
我之前遇到过类似情况,用 __HAL_SPI_DISABLE 再改模式会稳定点。
帛灿灿 发表于 2025-7-25 07:28 | 显示全部楼层
是不是 SPI 外设时钟没关?可以试试在切主从之前关掉外设时钟。
童雨竹 发表于 2025-7-25 07:29 | 显示全部楼层
建议把 HAL_SPI_DeInit 放在切换模式前做一次,别等最后再 deinit。
万图 发表于 2025-7-25 07:30 | 显示全部楼层
也可以先把 NSS 拉高再切换,防止主机模式立刻输出时钟。
Wordsworth 发表于 2025-7-25 07:30 | 显示全部楼层
我看你是主循环里一直重新 init,能不能把 init 拆成主从两个函数?
Bblythe 发表于 2025-7-25 07:31 | 显示全部楼层
STM32 的 SPI 如果没正确停用,切模式时残留的状态机会触发时钟。
Pulitzer 发表于 2025-7-25 07:32 | 显示全部楼层
你用的是 HAL 库的话,切模式要注意先关闭 SPI,然后重置控制寄存器。
Uriah 发表于 2025-7-25 07:33 | 显示全部楼层
也可以考虑直接操作寄存器来切换模式,别走 HAL,那样可控性高点。
Clyde011 发表于 2025-7-25 07:34 | 显示全部楼层
这个循环里反复 init/deinit 其实挺浪费的,有条件的话最好保持一个状态机来管理。
是你的乱码 发表于 2025-7-28 14:33 | 显示全部楼层
通常与SPI 外设状态未正确复位或模式切换时序问题有关。
是你的乱码 发表于 2025-7-28 14:46 | 显示全部楼层
可在MX_SPI1_Init中添加断点,检查初始化前hspi1.Instance->CR1寄存器的值,确保SPE位(bit6)为 0(SPI 未启用)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

50

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

41

主题

50

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部