我是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中。所以我可以理解上面声明的第一部分:“每个设备可能配置为使用不同的时钟速率”。
但是,第二部分是什么意思? “因为除非选择芯片,否则忽略那些共享信号”是否意味着我可以通过启用/禁用不同速率的从设备来使用不同的时钟速率但只能使用一个?
感谢您的帮助!的问候,
- 利玛
答案 0 :(得分:1)
@Matteo M。:我认为你实际上不允许同时将SS1,SS2和SS3设置为零,这样就可以在同一时刻启用所有三个SPI从设备。原因是,SPI从机在MOSI线路上接收数据的同时,会在MISO线路上发回数据。如果实际上所有三个从站将数据放在(共享)MOSI线上,那么就数据和电流都会发生非常糟糕的事情。
答案 1 :(得分:1)
SPI是一个非常宽松的“标准”,没有很多规则要遵循,这很好(我猜也不好)。它很好,因为它很灵活。这很糟糕,因为它可以根据您正在处理的特定硬件以不同的方式实现。有些设备仅支持半双工通信,如您所知,需要协调何时可以驱动总线。选择线(芯片使能,从机选择,无论你想要它们调用它们)都提供了一种方便的方法来实现这一点,而无需使用位来识别哪个从机应该从总线上获得消息。
在全双工模式下,数据在每个时钟脉冲上从主设备和从设备丢弃到总线上,因此沃尔夫冈表示,可能非常需要选择线来防止坏事。我想强调可以是必需的;或许主处理器可能与其他处理器通信,只响应某些特定位模式(例如,“地址”)时才驱动总线...更多软件/固件?是的,但它并没有阻止你。
因此,如果你说的是8位从器件,例如8位DAC,你确实可以写入主数据寄存器的值块。独立的选择线将使您能够在没有所有这些从属设备同时驱动总线的情况下执行此操作。是的,你必须一次一个地将每个从属的值转移到主寄存器中,但这也是一个完全合理的设计。
与一些更复杂的串行协议不同,SPI实际上非常灵活;因为它不会将您锁定为最大字大小或要求您写入总线的任何数据都包含地址和偏移等内容。