我对SPI非常熟悉;Linux内核提供了一个API,用于声明SPI总线和设备,并根据标准的Linux驱动程序模型管理它们。
您可以在这里找到结构spi_master的描述:https://www.kernel.org/doc/htmldocs/device-drivers/API-struct-spi-master.html
上述链路上的描述说,“每个设备可以配置为使用不同的时钟速率,因为这些共享信号被忽略,除非选择芯片”。要把这句话放在比赛中,我必须说,“设备”指的是SPI从设备,而“那些共享信号”指的是MOSI、MISO和SCK信号。
实际上,在struct spi_device (https://www.kernel.org/doc/htmldocs/device-drivers/API-struct-spi-device.html)中有一个名为max_speed_hz的属性,它不存在于struct spi_master中。因此,我可以理解上述声明的第一部分:“每个设备可能被配置为使用不同的时钟速率”。
但是,第二部分是什么意思呢?“由于这些共享信号被忽略,除非选择芯片”是否意味着允许我使用不同的时钟速率,但通过启用/禁用不同速率的奴隶,只能使用一个时钟速率?
谢谢你的帮助!致以敬意,
- Matteo
发布于 2013-10-18 09:50:34
@Matteo .:我认为你实际上是,不允许同时将SS1、SS2和SS3设置为零,并以这种方式使所有三个SPI奴隶都能在同一时间内。原因是SPI从站在MOSI线路上接收数据时,同时在MISO线路上发送数据。如果所有的三个从站都会将数据放在(共享) MOSI线上,那么无论是在数据还是在电流方面,都会发生非常糟糕的事情。
发布于 2014-01-20 22:46:53
SPI是一个非常宽松的“标准”,没有太多的规则可遵循,这是好的(和坏的,我猜)。它是好的,因为它是灵活的。这是不好的,因为它可以根据您正在处理的特定硬件以不同的方式实现。有些设备只支持半双工通信,正如您所知,这种通信需要协调总线何时可以驱动。选择行(芯片启用,从选择,无论您想要调用它们)提供了一种方便的方法来完成这一点,而不使用位来标识哪个从总线上应该得到消息。
在全双工模式下,在每个时钟脉冲上,数据被从主站和从站拖到总线上,因此非常需要选择线路来防止坏的事情发生,正如沃尔夫冈所说。我想强调这可能是必需的;也许让一个主处理器与其他处理器通信是完全合理的,这些处理器只在响应特定的位模式(例如“地址”)时驱动总线.更多的软件/固件?是的,但这并没有阻止你。
因此,如果您的8位从处理器是这样的话,例如8位DACs,您确实可以编写主数据寄存器的值块。独立选择线将使您能够做到这一点,而不需要所有的奴隶驾驶公共汽车一次。是的,你必须一次把每个奴隶的值转换到主寄存器中,但这也是一个完全合理的设计。
与一些更复杂的串行协议不同,SPI实际上非常灵活;因为它不会将您锁定为最大字大小,也不会要求您写入总线的任何数据都由地址、偏移等内容组成。
https://stackoverflow.com/questions/17493681
复制相似问题