我需要为连接到STM32 Cortex M3 MCU的闪存芯片创建一个驱动程序。该芯片通过SPI总线控制。我打算使用MCU的集成SPI外设,但遗憾的是,它只支持8位或16位数据包,而闪存芯片命令的长度为14位。因此,我必须使用GPIO从头开始实现该协议。我的问题是:什么是确保信号正确定时的正确方法?我目前考虑在置位和去置位GPIO线之间插入delays,并禁用中断,但对我来说,这似乎相当不可靠。有没有更好的方法?
dly7yett1#
Jeb的答案是首选方法,如果可能的话,您应该使用硬件SPI,如果DMA是一个不错的选择。如果您出于某种原因发现无法使用硬件SPI,但必须通过GPIO使用“位碰撞”来实现它,则应检查MCU上的定时器/PWM硬件中有哪些选项可用。你不能也不应该像你发布的链接那样使用生硬的“业余爱好者烧毁延迟”,实时性能将是垃圾,你将占用CPU 100%。大多数MCU定时器都带有引脚输出功能,这将允许引脚在定时器过期时更改状态。伪代码将是:
最后,很可能会有一些应用说明或官方示例,说明如何为您的特定MCU编写软件SPI。
bfnvny8b2#
如果可能的话,我建议使用SPI和DMA构建!你可以将你的数据重新Map到一个14位的倍数的字节数组中。因此,每次必须发送7* 4 Bits = 28 bytes的倍数。然后,您可以使用8位大小的标准SPI。但这应该是更快的SPI/DMA比位敲打GPIO的。
kh212irz3#
一些使用模糊数据长度的设备被设计成使得在事务开始时,它们将忽略在第一个“1”之前被时钟记录的所有“0”位,或者忽略在第一个“0”之前被时钟记录的所有“1”位。如果您的器件恰好是以这种方式设计的,您可以通过时钟输出两个“垃圾”位沿着感兴趣的位来使用8位或16位SPI模式。
3条答案
按热度按时间dly7yett1#
Jeb的答案是首选方法,如果可能的话,您应该使用硬件SPI,如果DMA是一个不错的选择。
如果您出于某种原因发现无法使用硬件SPI,但必须通过GPIO使用“位碰撞”来实现它,则应检查MCU上的定时器/PWM硬件中有哪些选项可用。你不能也不应该像你发布的链接那样使用生硬的“业余爱好者烧毁延迟”,实时性能将是垃圾,你将占用CPU 100%。
大多数MCU定时器都带有引脚输出功能,这将允许引脚在定时器过期时更改状态。伪代码将是:
最后,很可能会有一些应用说明或官方示例,说明如何为您的特定MCU编写软件SPI。
bfnvny8b2#
如果可能的话,我建议使用SPI和DMA构建!
你可以将你的数据重新Map到一个14位的倍数的字节数组中。因此,每次必须发送7* 4 Bits = 28 bytes的倍数。
然后,您可以使用8位大小的标准SPI。
但这应该是更快的SPI/DMA比位敲打GPIO的。
kh212irz3#
一些使用模糊数据长度的设备被设计成使得在事务开始时,它们将忽略在第一个“1”之前被时钟记录的所有“0”位,或者忽略在第一个“0”之前被时钟记录的所有“1”位。如果您的器件恰好是以这种方式设计的,您可以通过时钟输出两个“垃圾”位沿着感兴趣的位来使用8位或16位SPI模式。