4

我是 SPI 的新手;Linux 内核提供了一个 API,用于声明 SPI 总线和设备,并根据标准 Linux 驱动程序模型管理它们。

您可以在此处找到 struct 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 中不存在. 所以我可以理解上面陈述的第一部分:“每个设备都可以配置为使用不同的时钟速率”。

但是,第二部分是什么意思?“因为除非选择芯片,否则这些共享信号将被忽略”是否意味着我可以通过启用/禁用具有不同速率的从机来使用不同的时钟速率,但一次只能使用一个?

谢谢您的帮助!问候,

——马特奥

4

2 回答 2

1

SPI 是一个非常松散的“标准”,没有太多要遵循的规则,这很好(我猜也很糟糕)。这很好,因为它很灵活。这很糟糕,因为它可以根据您正在处理的特定硬件以不同的方式实现。一些设备仅支持半双工通信,如您所知,这需要协调何时可以驱动总线。选择线(芯片使能、从机选择,无论您想如何称呼它们)提供了一种方便的方法来执行此操作,而无需使用位来识别哪个从机应该从总线上获取消息。

正如 Wolfgang 所说,在全双工模式下,数据在每个时钟脉冲上从主机和从机发送到总线上,可能非常需要选择线来防止出现坏事。我想强调可能需要;让主处理器与仅在响应某些特定位模式(例如“地址”)时驱动总线的其他处理器通信是完全合理的......更多软件/固件?是的,但这并不能阻止你。

因此,如果说您的 8 位从机,例如 8 位 DAC,您确实可以写入主数据寄存器的值块。独立的选择线将使您能够做到这一点,而无需所有这些从设备同时驱动总线。是的,您必须一次将每个从属寄存器中的值转移到主寄存器中,但这也是一个完全合理的设计。

与一些更复杂的串行协议不同,SPI 实际上非常灵活;因为它不会将您锁定在最大字长或要求您写入总线的任何数据由地址和偏移量之类的东西组成。

于 2014-01-20T22:46:53.870 回答
1

@Matteo M.:我认为实际上不允许您同时将 SS1、SS2 和 SS3 设置为零,并以这种方式同时启用所有三个 SPI 从机。原因是 SPI 从机在接收 MOSI 线上的数据时,会同时在 MISO 线上发回数据。如果实际上所有三个从站都将数据放在(共享的)MOSI 线上,那么就数据和电流而言,都可能发生非常糟糕的事情。

于 2013-10-18T09:50:34.197 回答