尊敬的 TI 论坛:
我在共享 SPI 总线上有3个 ADS1158。 我们将其称为 ADC A、B 和 C。我使用2个 GPIO 来切换多路复用器、以便正确设置每个 ADC 的片选引脚。 多路复用器为 SNx4HC139。 每个 DRDY 引脚连接至3个 GPIO、每个 ADC 一个。 ADC A 和 B 的配置相同(现在我们忽略 ADC C):
11月28日13:21:42 raspberrypi acquisition[163587]:[INFO] ADC 0 RESET (参考资料)。
11月28日13:21:42 raspberrypi acquis[163587]:[info] adc 1 reset。
11月28日13:21:42 raspberrypi acquis[163587]:[INFO] ADC 已成功配置。 ADC 配置:
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x0值0x5e
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x1值0x31
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x2值0x0
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x3值0xF
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x4值0x0
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x5值0x0
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x6值0x0
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x7值0x7f
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x8值0x0
Nov 28 13:21:42 raspberrypi acquisition [163587]:[INFOC]寄存器0x9值0x9b
我尝试按以下顺序对 ADC 进行采样(为简单起见、我将忽略 ADC C):
切换 MUX 以选择 ADC A。
2.发送开始采样脉冲到 ADC A (参见下面的代码)。
3.切换 MUX 以选择 ADC B。
4.发送开始采样脉冲到 ADC B。
5.切换 MUX 以选择 ADC A。
6.轮询其 DRDY GPIO、如果该引脚变为0、则使用通道数据读取命令从 ADC A 读取数据(请参阅下面的代码)。
7.切换 MUX 以选择 ADC B。
8.对其 DRDY GPIO 进行轮询,如果它变为0,则使用通道数据读取命令从 ADC B 测试数据。
开始采样脉冲:
字符脉冲= 0b10000000;
SPI_send (handle、&pulse、NULL、sizeof (pulse));
通道数据读取命令:
char TX[]={ 0b00110000、0x00、0x00、0x00 };
SPI_send (handle、TX、Rx、sizeof (TX));
带有超时标志的整个读取通道命令:
bool adc_read_channel (int ready、int handle、char* rx){
uint8_t GPIO = 0;
uint32_t start = gpioTick ();
uint32_t current = gpioTick ();
INT DIFF = CURRENT - START;
while (GPIO == 1 && diff < TIMEOUT){
GPIO = gpioRead (就绪);
电流= gpioTick ();
DIFF = CURRENT - START;
}
如果(diff >= TIMEOUT){
返回 false;
}
//读取采样
char TX[]={ 0b00110000、0x00、0x00、0x00 };
SPI_send (handle、TX、Rx、sizeof (TX));
返回 true;
}
我经常会在 ADC B 上获得超时(这意味着它的 DRDY 引脚在100ms 内不会变为低电平、或者在处理 ADC A 的 SPI 传输时将其复位)。 我添加了一些日志:
Nov 28 13:13:52 raspberrypi acquis[162518]:[info] adc a channel 0开始采样 drdy a 1 b 1 c 1 cs 0 cs (mux 0b01选择 adc a)
11月28日13:13:52 raspberrypi acquis[162518]:[info] adc b channel 0开始采样 drdy a 1 b 1 c 1 cs 0 cs (mux 0b00选择 adc B)
11月28日13:13:52 raspberrypi acquis[162518]:[info]在信道读取之前 drdy a 0 b 1 c 1 cs 0 cs
11月28日13:13:52 raspberrypi acquis[162518]:[info]通道读取后 drdy a 1 b 1 c 1 cs 0 cs 1 (按预期、ADC A 从低切换到高)
11月28 13:13:52 raspberrypi 采集[162518]:DRDY 引脚26 GPIO 值(低电平有效)上的[ERROR] ADC 超时1个差分100000 (100ms)。
11月28日13:13:52 raspberrypi 采集[162518]:[错误] DRdy a 1 b 1 c 1 (ADC B 的 DRDY 引脚在 while 循环期间从不切换)
11月28日13:13:52 raspberrypi acquis[162518]:[错误] cs 1 0 cs 2 0 (多路复用器选择0b00 adc B)
对于 ADC A、此电路工作正常、但未检测到来自 ADC B 的 DRDY 变为低电平。 或者在进入该环路之前它可能先变为低电平、然后又变为高电平、但我不确定什么可能会复位 DRDY。
Question:
1.当 SCLK 针对另一个 ADC 运行时、即使其 CS 为高电平、DRDY 是否会复位? 这是一个共享的 SPI SCLK、数据表显示 DRDY 在 SCLK 的第一个下降沿恢复为高电平。
ADC B 是否也能从 ADC A 获取命令并在其 CS 处于高电平时对这些命令做出反应?
3、有时能用,有时不能用。 如果我在这里和那里添加一些人为的延迟、但这并不一致、这是有效的。 其他什么因素可能导致 DRDY 复位?
4.我是否应该完全忽略 DRDY 并仅依赖于 STATUS 字节中的新位?
非常感谢!