2017-02-10 12 views
1

我一直在试图移植一些AVR代码来驱动一个简单的SPI LCD作为学习练习(我对ARM一般来说很新颖)。为此,我只需要在主模式下使用SPI。我查看了我的器件(STM32F103C8)的datasheet,发现我需要的SPI1引脚,SCK和MOSI分别与其他外设(第29页)一起映射为PA5和PA7的替代功能。我的理解是,为了在这些引脚上使用SPI功能,我需要确保映射到同一引脚的任何其他功能都被禁用。但是,在查看外设时钟控制寄存器的默认值时,看起来其他功能已被禁用。STM32F1 - 在裸机上使用主SPI

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

从我的阅读中,我曾经想过,在配置SPI之后,通过将值加载到SPI1数据寄存器中,数据将被移出。但是,在写入数据之后,SPI状态寄存器中的TXE标志永远不会置位,表示我写入的数据只是坐在那里。

在这一点上,我假设有其他东西我没有正确配置。例如,我不能100%确定如何处理PA5/7引脚。我试图从数据表中理解我能做些什么,但我没有得到任何地方。还有什么需要完成之前,它会工作?

+0

我不认为引脚配置不正确会阻止SPI尝试传输数据。它不会去任何地方,但外围设备仍然会这样。我会建议外设配置不正确。你是否启用了SPI的时钟?你是否启用了SPI? –

+0

发布你的代码,否则我们所能做的只是猜测...... –

回答

4

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

+0

你说得对,我没有触及SSM/SSI设置,因为我认为它们不会影响主模式。我会用代码更新我的帖子,谢谢 – Triforcer

+0

@Triforcer - 当您不使用硬件CS引脚时,这些位会影响主模式。 STM32应该支持多主机模式,所以当主机模式下CS低时,它们不会传输任何东西。 SSM和SSI作为“软件从属选择”并适用相同的规则 - 当它们为“0”时,您将看不到任何传输。 –

+0

设置SSI/SSM位解决了我的问题,谢谢。我过去使用的微控制器没有多主机的规定,所以这个概念对我来说是陌生的。我不知道为什么你的答案被低估了。对于没有给出理由的人来说,这似乎不具有建设性。 – Triforcer