在ARM Cortex M3上实现非标准SPI变体

时间:2012-10-23 06:00:34

标签: c embedded arm cortex-m3

我需要为连接到STM32 Cortex M3 MCU的闪存芯片创建驱动程序。芯片通过SPI总线控制。我打算使用MCU的集成SPI外设,但不幸的是它只支持8位或16位数据包,而闪存芯片命令是14位长。因此,我必须使用GPIO从头开始实现协议。我的问题是:确保信号正确计时的正确方法是什么?我目前考虑在断言和断言GPIO线路之间插入delays并禁用中断,但这对我来说似乎相当不可靠。还有更好的方法吗?

3 个答案:

答案 0 :(得分:4)

Jeb的答案是首选方法,如果可能的话你应该使用硬件SPI,如果DMA也是一个很好的选择。

如果由于某种原因发现您无法使用硬件SPI,但必须使用GPIO上的“bit-banging”来实现它,则应检查MCU上定时器/ PWM硬件中可用的选项。你不能并且不应该像你发布的链接那样使用直率的“业余爱好者烧毁延迟”,实时性能将是垃圾,你将占用100%的CPU。

大多数MCU定时器都带有引脚输出功能,允许引脚在定时器超时时改变状态。伪代码将是:

  • 确定要发送的下一位是1还是0。
  • 相应地设置MCU极性寄存器,以便将引脚切换为高电平或低电平。
  • 当计时器过去时,您需要再次设置极性,可能是通过中断。如何做到这一点非常依赖于硬件。
  • 在您对数据进行比特(MOSI)的同时,还需要生成时钟和芯片选择。时钟可以与数据相同的方式生成,也可以通过PWM信号生成(如果该选项可用)。芯片选择是最简单的部分,因为您只需要在数据传输期间将引脚拉低。

最后,很可能有一些关于如何为特定MCU编写软件SPI的应用笔记或官方示例。

答案 1 :(得分:2)

我建议尽可能使用SPI和DMA构建!

您可以将数据重新映射为字节数组,其大小为14位的倍数。 所以你必须每次发送7 * 4Bits = 28bytes的倍数 然后,您可以使用标准SPI和8Bit大小。

但SPI / DMA的速度应该比击打GPIO的速度快得多。

答案 2 :(得分:0)

一些使用模糊数据长度的设备被设计成在事务开始时它们将忽略在第一个“1”之前输入的所有“0”位或者所有输入的“1”位。在第一个“0”之前。如果您的设备恰好以这种方式设计,您可以通过输出两个“垃圾”位以及感兴趣的位来使用8位或16位SPI模式。