在半双工/单工模式下正确停用SPI的方法
本帖最后由 咚了个咚 于 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 */}
你这个看着像是 SPI_CR1 寄存器里的位没清干净,切换模式前最好关一下 SPI。 我之前遇到过类似情况,用 __HAL_SPI_DISABLE 再改模式会稳定点。 是不是 SPI 外设时钟没关?可以试试在切主从之前关掉外设时钟。 建议把 HAL_SPI_DeInit 放在切换模式前做一次,别等最后再 deinit。 也可以先把 NSS 拉高再切换,防止主机模式立刻输出时钟。 我看你是主循环里一直重新 init,能不能把 init 拆成主从两个函数? STM32 的 SPI 如果没正确停用,切模式时残留的状态机会触发时钟。 你用的是 HAL 库的话,切模式要注意先关闭 SPI,然后重置控制寄存器。 也可以考虑直接操作寄存器来切换模式,别走 HAL,那样可控性高点。 这个循环里反复 init/deinit 其实挺浪费的,有条件的话最好保持一个状态机来管理。 通常与SPI 外设状态未正确复位或模式切换时序问题有关。 可在MX_SPI1_Init中添加断点,检查初始化前hspi1.Instance->CR1寄存器的值,确保SPE位(bit6)为 0(SPI 未启用)。
页:
[1]