首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ARM Cortex M3上实现非标准SPI变体

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

Stack Overflow用户
提问于 2012-10-23 14:00:34
回答 3查看 1.9K关注 0票数 3

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-23 15:52:44

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

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

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

  • 确定要发送的下一位是1还是0。
  • 相应地设置单片机极性寄存器,以便将引脚切换到高电平或低电平。
  • 当定时器到期时,您需要再次设置极性,可能是通过中断。如何做到这一点是非常hardware-dependent.
  • At的同时你位爆炸的数据(MOSI),你还需要产生时钟和芯片选择。时钟可以以与数据相同的方式生成,也可以通过PWM信号生成(如果该选项可用)。芯片选择是最简单的部分,因为您只需要在数据传输过程中拉低引脚。

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

票数 4
EN

Stack Overflow用户

发布于 2012-10-23 14:25:59

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

您可以将数据重新映射到大小为14位倍数的字节数组中。所以你每次都要发送多个7*4Bits=28bytes。

然后,您可以使用8Bit大小的标准SPI。

但使用SPI/DMA时,这应该比位敲击GPIO快得多。

票数 2
EN

Stack Overflow用户

发布于 2014-01-26 05:50:39

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13024348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档