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

klsxnrf1  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(110)

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

dly7yett

dly7yett1#

Jeb的答案是首选方法,如果可能的话,您应该使用硬件SPI,如果DMA是一个不错的选择。
如果您出于某种原因发现无法使用硬件SPI,但必须通过GPIO使用“位碰撞”来实现它,则应检查MCU上的定时器/PWM硬件中有哪些选项可用。你不能也不应该像你发布的链接那样使用生硬的“业余爱好者烧毁延迟”,实时性能将是垃圾,你将占用CPU 100%。
大多数MCU定时器都带有引脚输出功能,这将允许引脚在定时器过期时更改状态。伪代码将是:

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

最后,很可能会有一些应用说明或官方示例,说明如何为您的特定MCU编写软件SPI。

bfnvny8b

bfnvny8b2#

如果可能的话,我建议使用SPI和DMA构建!
你可以将你的数据重新Map到一个14位的倍数的字节数组中。因此,每次必须发送7* 4 Bits = 28 bytes的倍数。
然后,您可以使用8位大小的标准SPI。
但这应该是更快的SPI/DMA比位敲打GPIO的。

kh212irz

kh212irz3#

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

相关问题