1

我正在使用 STM32L475 MCU,并且正在使用 SPI 与 SD 卡进行通信。

当我配置 SPI SCK GPIO 引脚时,我将其配置为 PushPull 模式下的备用功能 SPI。我将 ClockPolarity 设置为空闲低电平,这会让我认为 SCK 线在不活动时会保持低电平,但事实并非如此。相反,SCK 线闲置高,直到 SPI 通信开始。这意味着如果我进行 SPI 写入和后续读取,则会触发一个额外的时钟脉冲,从而中断我的通信。

我发现能够解决此问题的唯一方法是进一步将 GPIO 引脚配置为具​​有下拉电阻,但在我看来,这在电流消耗方面会很浪费。将引脚配置为开漏也不起作用,因为无论如何我都需要添加一个上拉电阻。最后,我尝试为 SCK 引脚写入 GPIO 引脚的输出寄存器并将其设置为低电平,但这并没有改变任何东西。

在我看来,我唯一的选择是在推挽引脚上放置一个下拉电阻并不断浪费电流以使 SCK 线保持低电平。我想知道这是否是人们用于 SPI 通信的正常解决方案?我无法想象它是。

4

1 回答 1

1

CPOL是 SPIx_CR1 的第 1 位,控制特定 SPI 的 CLK 引脚的空闲状态。因此,如果您想在空闲时将 SCK 引脚保持在低电平状态,请尝试:

SPI1->CR1 &= 0xFFFE;

您还可以在 STM32CubeMX 中配置时钟极性: screenshot

我自己没有尝试过,但是根据官方文档,这两种方法应该可以工作。 STM32L47xxx 官方参考

42.4.6 通信格式
  时钟相位和极性控制 软件可以使用 SPIx_CR1 寄存器中的 CPOL 和 CPHA 位选择四种可能的时序关系。当没有数据传输时,CPOL(时钟极性)位控制时钟的空闲状态值。该位影响主模式和从模式。如果 CPOL 复位,则 SCK 引脚处于低电平空闲状态。如果 CPOL 置位,则 SCK 引脚处于高电平空闲状态。
...
位 1 CPOL:时钟极性
0。空闲时 CK 为 0
1:空闲时 CK 为 1
注意:通信进行时不应更改此位。
除了在 TI 模式下应用 CRC 的情况外,该位在 SPI TI 模式下不使用。

于 2020-11-17T05:22:26.093 回答