咚了个咚 发表于 2025-7-24 23:20

在半双工/单工模式下正确停用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 */}

公羊子丹 发表于 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 未启用)。
页: [1]
查看完整版本: 在半双工/单工模式下正确停用SPI的方法