STM32F1 - 在裸机上使用主 SPI
Posted
技术标签:
【中文标题】STM32F1 - 在裸机上使用主 SPI【英文标题】:STM32F1 - Using master SPI on bare metal 【发布时间】:2017-06-29 07:02:19 【问题描述】:我一直在尝试移植我的一些 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 的设置,将其模式设置为“交替功能输出推挽式”(9.1.4)。最后,我通过设置 CR1_SPE 来启用 SPI1。
从我的阅读中,我认为通过在如上所述配置 SPI 后将值加载到 SPI1 数据寄存器中,数据会被移出。但是,写入数据后,SPI状态寄存器中的TXE标志从未置位,表明我写入的数据只是坐在那里。
在这一点上,我假设还有一些我未能正确配置的东西。例如,我不能 100% 确定如何处理 PA5/7 引脚。我试图从数据表中了解我能做什么,但我没有得到任何结果。在它起作用之前还有什么需要做的吗?
【问题讨论】:
我认为引脚配置不正确不会阻止 SPI 尝试传输数据。它不会去任何地方,但外围设备仍会发送它。我建议外围设备配置不正确。您是否启用了 SPI 的时钟?您是否启用了 SPI? 发布你的代码,否则我们只能猜测...... 【参考方案1】:我几乎可以肯定您没有在SPIx->CR1
寄存器中设置SSM
和SSI
位。这些芯片中的 SPI 非常简单,对于轮询传输,您需要设置 SSM
、SSI
、SPE
、MSTR
、正确的格式(LSBFIRST
、CPOL
、CPHA
)和正确的波特率(BR
) 在SPIx->CR1
中,你很高兴。
【讨论】:
你说得对,我没有触摸 SSM/SSI 设置,因为我认为它们不会影响主模式。我会用代码更新我的帖子,谢谢 @Triforcer - 当您不使用硬件 CS 引脚时,这些位会影响主模式。 STM32 应该支持多主模式,所以当主模式下 CS 为低电平时,它们不会传输任何内容。 SSM 和 SSI 用作“软件从属选择”并且适用相同的规则 - 当它们为“0”时,您将看不到任何传输。 设置 SSI/SSM 位解决了我的问题,谢谢。我过去使用的微控制器没有多主控的规定,所以这个概念对我来说很陌生。我不确定为什么您的回答被否决了。人们在没有给出理由的情况下这样做似乎没有建设性...... 投反对票很可能是对我投给对方的投反对票的报复(现已删除的答案),因为它包含了“如何不编写代码”的完美示例。以上是关于STM32F1 - 在裸机上使用主 SPI的主要内容,如果未能解决你的问题,请参考以下文章
如何在 STM32F1 上使用 HAL 库永久启用 uart RX 中断