Arm STM32F1-在裸机上使用主SPI

Arm STM32F1-在裸机上使用主SPI,arm,stm32,spi,Arm,Stm32,Spi,我一直在尝试移植我的一些AVR代码,以将一个简单的SPI LCD驱动到ARM作为一个学习练习(一般来说,我对ARM非常陌生)。为此,我只需要在主模式下使用SPI 我查找了我的设备(STM32F103C8),发现我需要的SPI1引脚、SCK和MOSI分别映射为PA5和PA7以及其他外围设备的替代功能(第29页)。我的理解是,为了在这些管脚上使用SPI功能,我需要确保映射到同一管脚的任何其他功能都被禁用。但是,当查看外围时钟控制寄存器的默认值时,其他功能似乎已被禁用 我查看了中的SPI部分,包括第2

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

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

我查看了中的SPI部分,包括第25.3.3节-在主模式下配置SPI。首先,我在APB2ENR中启用了SPI1主时钟,并按照本节中的步骤根据需要配置SPI1。我还更改了PA5/7的设置,将其模式设置为“备用功能输出推拉”(9.1.4)。最后,我通过设置CR1_SPE启用了SPI1

从我的阅读中,我认为在如上配置SPI之后,通过向SPI1数据寄存器加载一个值,数据将被移出。但是,在写入数据之后,SPI状态寄存器中的TXE标志永远不会被设置,这表明我写入其中的数据就在那里


在这一点上,我假设还有一些我没有正确配置的东西。例如,我不能100%确定如何使用PA5/7引脚。我试着从数据表上了解我能做什么,但我什么也做不到。在它工作之前,还有什么需要做的吗?

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

我不认为错误配置管脚会阻止SPI尝试传输数据。它不会去任何地方,但外围设备仍会发送它。我建议外围设备配置不正确。你把时钟调到SPI了吗?你启用了SPI吗?发布你的代码,否则我们只能猜测…你是对的,我没有触摸SSM/SSI设置,因为我认为它们不会影响主模式。我会用代码更新我的帖子,thanks@Triforcer-当您不使用硬件CS引脚时,这些位会影响主模式。STM32应该支持多主模式,所以当CS在主模式下处于低位时,它们不会传输任何内容。SSM和SSI用作“软件从属选择”,适用相同的规则-当它们为“0”时,您将看不到任何传输。设置SSI/SSM位解决了我的问题,谢谢。我过去使用的微控制器没有多主控制器的规定,所以这个概念对我来说是陌生的。我不知道为什么你的答案被否决了。人们这样做而不给出理由似乎是没有建设性的。否决票很可能是对我对对方的否决票的报复(现在被删除的答案),因为它包含了一个“如何不写代码”的完美例子。