如何控制覆盆子pi中的SPIDEV moudule中的CS信号

时间:2018-06-03 21:36:49

标签: c python-2.7 raspberry-pi3 adc

我正在尝试使用Python 2.7中的SPIDEV模块,通过Raspberry Pi设备上提供的SPI总线将Raspberry Pi 3与ADS1256 ADC连接。 该项目旨在与其中两个ADC进行通信,并以250Hz采样率对所有通道(每个通道8个通道)进行采样。

负责数据交易的SPIDEV模块中的函数是xferxfer2。这些功能的问题在于它们发出CS激活命令(使CS为低电平),执行事务并发出CS释放命令(将CS置为高电平)。为了与ADS1256通信,需要将一系列命令发送到ADC,同时将CS保持在逻辑低电平。这可以通过列出所有命令并将它们传递到xfer / xfer2函数来实现,如下所示:

$xfer2([10, 20, 30, 40])$

然而,这种发送命令的方式并没有给ADC足够的时间来处理每个命令,换句话说,指令之间的时序违反了ADC的时序规范。另一方面,如果一次发送一个命令,则CS切换会导致ADC忘记上一个命令。

我尝试在网上提出了另外两个替代方案,引入了太多的延迟,我无法在每个采样实例之间的时间范围内挤压所有通道读取。这些替代方案是:

  • WiringPi模块:该模块具有wiringPiSPIDataRW功能,仅执行数据事务,CS可由模块中的IO功能单独控制。缺点是每次调用此函数之间的时间以及将CS置为低电平并调用此函数之间的时间超过200微秒,当我对所有通道进行采样时,总计超过4毫秒(我的采样周期) 。 使用SPIDEV时为CS使用单独的引脚:此选项还在函数调用之间引入了超过100微秒的延迟。

这是我通过挖掘Raspberry Pi社区和Stack Overflow学到的两个建议。

SPIDEV中的xfer函数还提供了一个称为延迟的参数,根据文档,它应该控制块之间的延迟,但它只表示在事务完成后CS应保持低电平的时间。例如:如果我发出:

$xfer2([12, 23, 34, 46], 1800000, 30)$

只有在发送46结束后,它才会在最后保持CS低30微秒。它在每个字节之间不提供30微秒,即12,23,34和46,这是我需要的理想选择。但是,如果我这样做

xfer2([12])
xfer2([23])
xfer2([34])
xfer2([46])

当然,由于Raspberry Pi的性质,每次之间的时间将超过100微秒,这是我无法处理的。

这样可以帮助我控制命令之间的延迟是理想的事情。

如果不可能,可以让我在xfer函数中控制CS,这样就不会切换它。这意味着我可以用IO功能控制CS引脚。这将阻止我的电路板上使用树莓派GPIO标头CE引脚作为CS的硬件修改。虽然它仍然是一个缓慢的解决方案,但比wiringPi模块中的函数快得多。 在最坏的情况下,我将不得不修改我的硬件并使用不同的GPIO引脚作为CS。

感谢您阅读

0 个答案:

没有答案
相关问题