STM32F1 - 在裸机上使用主 SPI

STM32F1 - Using master SPI on bare metal

作为学习练习,我一直在尝试移植我的一些 AVR 代码以将简单的 SPI LCD 驱动到 ARM(我对 ARM 还是很陌生)。为此,我只需要在主模式下使用 SPI。

我查看了我的设备 (STM32F103C8) 的 datasheet,发现我需要的 SPI1 引脚、SCK 和 MOSI 分别映射为 PA5 和 PA7 的替代功能,以及其他外围设备 (pg .29).我的理解是,为了在这些引脚上使用 SPI 功能,我需要确保禁用映射到同一引脚的任何其他内容。然而,当查看外设时钟控制寄存器的默认值时,其他功能似乎已被禁用。

我查看了 reference manual 中的 SPI 部分,包括部分 25.3.3 - 在主模式下配置 SPI 。首先,我在 APB2ENR 中启用了 SPI1 主时钟,然后按照本节中的步骤根据我的需要配置 SPI1。我还更改了 PA5/7 的设置,将其模式设置为 "Alternate Function Output push-pull" (9.1.4)。最后,我通过设置 CR1_SPE.

启用了 SPI1

根据我的阅读,我认为通过如上配置SPI后将值加载到SPI1数据寄存器,数据将被移出。但是写入数据后,SPI状态寄存器中的TXE标志一直没有置位,说明我写入的数据就在那里。

在这一点上,我假设还有一些我未能正确配置的东西。例如,我不是 100% 确定如何处理 PA5/7 引脚。我试图从数据表中了解我能做什么,但我一无所获。在它起作用之前还有什么需要做的吗?

我几乎可以肯定您没有在 SPIx->CR1 寄存器中设置 SSMSSI 位。这些芯片中的 SPI 非常简单,对于轮询传输,您需要设置 SSMSSISPEMSTR、正确的格式(LSBFIRSTCPOLCPHA) 和适当的波特率 (BR) 在 SPIx->CR1 中,您就可以开始了。