我需要为连接到STM32 Cortex M3单片机的闪存芯片创建一个驱动程序。该芯片通过SPI总线进行控制。我打算使用MCU的集成SPI外设,但不幸的是,它只支持8位或16位的数据包,而闪存芯片的命令长度为14位。因此,我必须使用GPIO从头开始实现该协议。我的问题是:什么是确保信号正确计时的正确方法?我目前考虑在禁用中断的情况下在断言和反断言GPIO线之间插入delays,但对我来说这似乎相当不可靠。有没有更好的方法?
发布于 2012-10-23 15:52:44
Jeb的答案是首选的方法,如果可能,您应该使用硬件SPI,如果DMA是一个很好的选项。
如果出于某种原因,您发现不能使用硬件SPI,但必须通过GPIO使用"bit-banging“来实现它,则应检查MCU上的timer/PWM硬件中有哪些可用选项。你不能也不应该像你发布的链接那样使用生硬的“业余爱好者延时”,实时性能将是垃圾,你将100%占用CPU。
大多数MCU定时器都带有引脚输出功能,这将允许引脚在定时器到期时更改状态。伪代码将是:
最后,很可能有一些关于如何为特定MCU编写软件SPI的应用笔记或官方示例。
发布于 2012-10-23 14:25:59
如果可能的话,我建议使用SPI和DMA构建!
您可以将数据重新映射到大小为14位倍数的字节数组中。所以你每次都要发送多个7*4Bits=28bytes。
然后,您可以使用8Bit大小的标准SPI。
但使用SPI/DMA时,这应该比位敲击GPIO快得多。
发布于 2014-01-26 05:50:39
一些使用模糊数据长度的设备被设计成在事务开始时,它们将忽略在第一个"1“之前计时的所有"0”比特,或者在第一个"0“之前计时的所有"1”比特。如果您的设备恰好是以这种方式设计的,那么您可以使用8位或16位SPI模式,方法是将两个“垃圾”位与感兴趣的位一起打卡。
https://stackoverflow.com/questions/13024348
复制相似问题