如何在树莓pi上控制SPIDEV模块中的CS信号
我试图使用Python 2.7中的SPIDEV模块通过Raspberry Pi单元上可用的SPI总线将Raspberry Pi 3与ADS1256 ADC连接起来。 该项目将与其中两个ADC通信,并以250Hz采样率对所有通道(每个通道8个)进行采样 SPIDEV模块中负责数据事务的函数是如何在树莓pi上控制SPIDEV模块中的CS信号,c,python-2.7,raspberry-pi3,adc,C,Python 2.7,Raspberry Pi3,Adc,我试图使用Python 2.7中的SPIDEV模块通过Raspberry Pi单元上可用的SPI总线将Raspberry Pi 3与ADS1256 ADC连接起来。 该项目将与其中两个ADC通信,并以250Hz采样率对所有通道(每个通道8个)进行采样 SPIDEV模块中负责数据事务的函数是xfer和xfer2。这些函数的问题在于,它们发出CS激活命令(使CS处于低位),执行事务并发出CS释放命令(使CS处于高位)。为了与ADS1256通信,在CS保持逻辑低电平时,需要向ADC发送一系列命令。这可
xfer
和xfer2
。这些函数的问题在于,它们发出CS激活命令(使CS处于低位),执行事务并发出CS释放命令(使CS处于高位)。为了与ADS1256通信,在CS保持逻辑低电平时,需要向ADC发送一系列命令。这可以通过列出所有命令并将它们传递给xfer
/xfer2
函数来实现,如下所示:
$xfer2([10, 20, 30, 40])$
然而,这种发送命令的方式没有给ADC足够的时间来处理每个命令,或者换句话说,指令之间的定时违反了ADC的定时规范。另一方面,如果一次发送一个命令,则CS切换会导致ADC忘记上一个命令
我在网上尝试过的另外两种选择,引入了太多的延迟,我无法在每个采样实例之间的时间范围内压缩所有通道读取。这些备选方案是:
- WiringPi模块:该模块具有仅执行数据事务的
功能,CS可由模块中的IO功能单独控制。缺点是每次调用此函数之间的时间以及将CS调低到调用此函数之间的时间超过200微秒,当我对所有通道进行采样时,总计将超过4毫秒(我的采样周期)。 在使用SPIDEV时为CS使用单独的pin:此选项也会在函数调用之间引入超过100微秒的延迟wiringPiSPIDataRW
xfer
函数还提供了一个名为delay的参数,根据文档,它应该控制块之间的延迟,但它只意味着在事务完成后CS应保持在低位的时间。例如:如果我发布:
$xfer2([12, 23, 34, 46], 1800000, 30)$
只有在发送46结束后,它才会在结束时将CS保持低电平30微秒。它不提供每个字节之间的30微秒,即12、23、34和46,这是我需要的理想值。然而,如果我这样做
xfer2([12])
xfer2([23])
xfer2([34])
xfer2([46])
当然,由于覆盆子皮的性质,两者之间的时间将超过100微秒,我无法处理
因此,能够帮助我控制命令之间的延迟是一件理想的事情
如果不可能的话,我可以控制xfer函数中的CS,这样它们就不会切换它。这意味着我可以通过IO功能控制CS引脚。这将防止在我的电路板上使用raspberry pi GPIO头CE引脚作为CS的硬件修改。虽然它仍然是一个缓慢的解决方案,但比wiringPi
模块中的函数快得多。
在最坏的情况下,我将不得不修改我的硬件,并使用不同的GPIO引脚作为CS使用
谢谢你的阅读