在 Master (SPI) 中设置 nss_soft

Muz*_*ain 4 arm spi stm32 master-slave stm32f1

我想使用 Nucleo STM32F103RB 在 master 中将 NSS 引脚设置为软件模式。但我有一些问题?

在参考手册中,他们说,

在 NSS 软件模式下,设置 SPI_CR1 寄存器中的 SSM 和 SSI 位。如果在输出模式下需要 NSS 引脚,则只应设置 SSOE 位。

现在,

为什么我们需要用 SSM 设置 SSI 位?

SSOE 位的目的是什么?

ber*_*ing 5

它与很少使用的多主通信有关。

在多主机设置中,NSS 信号控制对 SPI 总线的访问。不幸的是,ST 文档在那里有点模糊,但我的理解是

  • NSS 高电平输入表示总线空闲,您可以传输
  • NSS低输入意味着别人在传输,你变成了奴隶。

为什么我们需要用 SSM 设置 SSI 位?

如果SSM小号oftware小号中号anagement)位在主模式设置,则SSI小号只管闹小号nternal)比特成为NSS信号,而不是销的来源。设置SSI1允许主机传输,设置为0使其成为从机(清除 中的MSTRCR1)。

如果你只有一个主人,只需设置

SPI->CR1 = SPI_CR1_MSTR | SPI_CR1_SPE | SPI_CR1_SSM | SPI_CR1_SSI
Run Code Online (Sandbox Code Playgroud)

不要担心其余的。这是最灵活的方式,您可以通过分别连接到 CS 线的 GPIO 输出来控制任意数量的从机。您也可以将 NSS 引脚用作 GPIO。

SSOE 位的目的是什么?

它将 NSS 引脚更改为输出。最初设置为高电平,当控制器开始传输时(DR写入寄存器时)变为低电平。请注意,传输完成后它不会自动再次变高,而是通过设置SPI_CR1_SPE0

SSOE当单个主机与单个从机通话时使用会很有用,因为 CS 由 SPI 寄存器控制。根本不必与 GPIO 外设通信,无需将其基地址加载到寄存器并将其保存在那里,从而节省了一些周期和闪存中的几个字节,从而可以通过以下方式将寄存器用于其他用途一个优化编译器。