3

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

4

3 回答 3

4

Jeb 的回答是首选方法,如果可能,您应该使用硬件 SPI,如果 DMA 也是一个不错的选项。

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

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

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

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

于 2012-10-23T07:52:44.033 回答
2

如果可能的话,我建议使用 SPI 和 DMA 中的构建!

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

但这应该比使用 SPI/DMA 快得多。

于 2012-10-23T06:25:58.780 回答
0

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

于 2014-01-25T21:50:39.000 回答