Embedded 位碰撞SPI/I2C在嵌入式应用中的缺点是什么

Embedded 位碰撞SPI/I2C在嵌入式应用中的缺点是什么,embedded,i2c,spi,Embedded,I2c,Spi,我开始明白,当涉及到GPIO上的SPI/I2C时,位碰撞是一种可怕的做法。为什么会这样?我不知道这有多可怕,但是如果你已经有了SPI或I2C外设,肯定会有一个“不要重新发明轮子”的论点来反对位碰撞,特别是当你的代码中可能有一个bug时——例如,你可能在SPI时钟的错误边缘采样,根据所涉及的公差和测试所用的硬件,在投入生产之前,您可能不会注意到这一点。文章还指出,您正在使用额外的处理能力,并且可能会在生成的任何信号中引入抖动 综上所述,如果您的硬件没有内置外设,或者其他设备已经用完了,例如,如果内

我开始明白,当涉及到GPIO上的SPI/I2C时,位碰撞是一种可怕的做法。为什么会这样?

我不知道这有多可怕,但是如果你已经有了SPI或I2C外设,肯定会有一个“不要重新发明轮子”的论点来反对位碰撞,特别是当你的代码中可能有一个bug时——例如,你可能在SPI时钟的错误边缘采样,根据所涉及的公差和测试所用的硬件,在投入生产之前,您可能不会注意到这一点。文章还指出,您正在使用额外的处理能力,并且可能会在生成的任何信号中引入抖动


综上所述,如果您的硬件没有内置外设,或者其他设备已经用完了,例如,如果内置SPI外设被您必须持续通信的高带宽设备使用,则位碰撞是唯一可用的选择,也许你可以使用另一个SPI设备,而这个设备在你的应用程序中不需要如此实时。

bit bang是可移植的,比如Linux内核驱动程序中的I2C代码。你可以让它快速启动并运行,它就可以正常工作。基于硬件的解决方案通常不是,需要一段时间才能启动和运行,并且受到硬件实现的限制。并非所有spi,尤其是i2c都符合可在通用硬件解决方案中实现的标准。你必须始终能够依靠叮当声

位碰撞会消耗更多的处理器资源,这使得它在这方面不受欢迎。它更便于携带,或者取决于它是如何编写的,因此在这方面是可取的。硬件SPI/I2C与之相反,它带走了一些cpu开销,不可移植,不总是足够灵活来处理所有外围设备

作为一名专业人士,您需要对两者都感到满意,就像您在设计中所做的任何其他嵌入式权衡一样。

位碰撞带来的软件开销会消耗CPU周期,您可以将其用于其他目的。这可能会对系统对其他事件的响应产生显著影响,并且在硬实时系统中,可能会显著影响系统满足实时截止日期的能力

如果位碰撞接口不想对实时性能产生不利影响,那么它必须被赋予较低的优先级,因此它本身在数据吞吐量和延迟方面是不确定的

通过使用硬件接口和DMA传输来最大限度地减少软件开销,从而实现CPU效率最高的传输。钻头撞击与此相反


我不会说这是可怕的;如果在应用程序中,您可以实现响应性和实时性约束,并且使用位碰撞可能会降低所需部件的成本,或者允许您使用现有硬件,那么这可能是完全合理的。

这样的情况不会被称为可怕。但是,是的,当我们使用位碰撞实现协议时,很可能控制器会错过执行其他更重要的任务,因为该协议可能比专用硬件消耗更多的CPU时间。因此,应避免在实时环境或时间关键环境中使用is。

除此之外,还有一个关于位碰撞的问题,通常在从引脚读取和/或写入引脚时,产生的信号通常具有更多的抖动或小故障,特别是当控制器在通信时也在执行其他任务时。。如果不可避免地要使用位碰撞,那么至少尝试将其与中断一起使用,而不是轮询。

位碰撞在非实时系统中不太可能。如果你把它放在不可中断的内核中,那么你真的必须确保在重新调度用户进程之前,你只需要对一定数量的比特进行比特切换

考虑一下:您有一个以1/1000秒间隔运行的调度计时器。当它运行时,您检查某个进程是否希望通过bitbanged接口发送数据,并处理该请求。该请求要求您以9600波特(例如)对一个字节进行位转换。现在您遇到了一个问题:需要0.8毫秒才能对一个字节进行位爆炸。您实际上负担不起这一点,因为当调度中断运行时,它必须完成它的工作,加载需要运行的下一个进程,然后退出。这通常需要比1ms短得多的时间,1ms主要用于运行用户进程,直到下一次中断。但如果你开始恶作剧,那么你大部分时间都是无所事事


解决这一问题的一种方法是使用定时器外围设备,仅用于比特传输目的。这将产生一个相当自主的、由中断驱动的比特流代码,它根本不必处于空闲状态——但这只是以使用专用计时器为代价的。如果你能支持一个专用的硬件定时器,那么BitBang可能会非常有效。但一般来说,在多任务环境中,很难在高速下进行可靠的比特攻击

看起来CPU响应能力和资源是主要的折衷方案;我想知道比特碰撞是否有信号传输质量的缺点?例如,如果我正在推动I2C/SPI的信号距离限制,则位碰撞实现是否会与典型的硬件外围设备执行不同?