2012-10-23 22 views
3

我需要为连接到STM32 Cortex M3 MCU的闪存芯片创建驱动程序。该芯片通过SPI总线进行控制。我打算使用MCU的集成SPI外设,但不幸的是,它仅支持8位或16位数据包,而闪存芯片命令长14位。因此,我必须使用GPIO从头开始实施协议。我的问题是:确保正确的信号时序的正确方法是什么?我目前想在插入delays之间断言和解除断言禁用GPIO线路,但它似乎是相当不可靠的。有没有更好的方法?在ARM Cortex M3上实现非标准SPI变化

+4

我会抵制这样一个模糊的界面的内存。有很多使用“标准SPI”的存储器,只要有SPI标准即可。 – Lundin

+0

@Lundin,不幸的是,硬件部分不是我设计的,显然我们现在不能把它扔掉。我同意一个更方便的接口芯片将是更好的选择。 –

+1

也许有其他制造商的引脚兼容替代品?即使重新设计硬件不是一种选择,您至少应该要求使用该特定部件的理由。 – Lundin

回答

4

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

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

大多数MCU定时器都带有一个引脚输出功能,可以在定时器超时时改变引脚的状态。然后,伪代码将是:

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

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

2

如果可能的话,我会推荐使用SPI和DMA构建!

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

但是,与SPI/DMA相比,这应该快得多。

0

一些使用模糊数据长度的设备被设计成在事务开始时它们将忽略在第一个“1”之前计时的所有“0”位,或者所有“1”位被计时在第一个“0”之前。如果您的设备碰巧是以这种方式设计的,那么您可以使用8位或16位SPI模式,将两个“垃圾”位与感兴趣的位一起计时。