尊敬的 Chris:
很抱歉问得太多。 我想知道您是否可以帮助我完成 ADS1256上 SPI 通信调试的一些基本逻辑分析仪设置?
SCLK -引脚13 (SCK)
DIN -引脚11 (MOSI)
DOUT -引脚12 (MISO)
DRDY -引脚9
CS -引脚10 (CS)
RESET -引脚8 (或拉至高电平?)
对于以下引脚、哪些引脚应设置为触发类型的低电平、上升电平、高电平、下降电平或边沿?
谢谢、
Khoi Ly
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的 Chris:
很抱歉问得太多。 我想知道您是否可以帮助我完成 ADS1256上 SPI 通信调试的一些基本逻辑分析仪设置?
SCLK -引脚13 (SCK)
DIN -引脚11 (MOSI)
DOUT -引脚12 (MISO)
DRDY -引脚9
CS -引脚10 (CS)
RESET -引脚8 (或拉至高电平?)
对于以下引脚、哪些引脚应设置为触发类型的低电平、上升电平、高电平、下降电平或边沿?
谢谢、
Khoi Ly
我的道歉,这些引脚并不完全需要向你展示。 它们是 Arduino Uno R3上的引脚。
我放置了一个名为 DIO7的 Arduino 数字引脚、该引脚在微控制器接收来自 ADS 1256的 ADC 数据(逻辑分析仪上的 DIO7下降沿触发器)之前触发。 CS 引脚始终保持低电平
digitalWrite (7、HIGH);
…
digitalWrite (7、low);
ADC_val [i]= SPI.transfer (0);
ADC_val[i]<= 8;//向左移位
adc_val[i]|= spi.transfer (0);
ADC_val[i]<= 8;
adc_val[i]|= spi.transfer (0);
您是否知道此逻辑分析仪的数据线(MISO)为什么在时钟之前出现脉冲?
前8位是 B01111111 --- 在第一个 SPI.transfer 中获得0位的唯一方法是、我们在时钟变为高电平之前开始对数据线(MISO)进行计数
第二个8位是 B11111111
第三个8位是 B10111001 --- 同样、最后一个 SPI.transfer 的结束位为1、但您可以看到它是最后一个时钟脉冲之前的一个时钟周期
我们可以组合这三个8位传输来获得总共24位数据。
您好、Khoi、
根据示波器和探头带宽的不同、您可能无法看到所有高频效应、但我仍然认为这将提供更多有关潜在 SI 问题的见解、尤其是因为逻辑分析仪往往会掩盖噪声、过冲和振铃的影响。 请确保在靠近输入引脚的位置进行探测(ADC 上的 DIN、MCU 上的 MISO)、以便您可以查看在迹线接收端看到的信号 (探测源附近不会告诉您迹线或导线的另一端是否存在 SI 问题)。
我认为一根接地线(在每组跳线周围)就足够了、只要它靠近所有其他信号线即可。 我通常只需在我的所有 SPI 跳线周围缠绕一根接地线、确保它将每个电路板的接地端连接在一起。 每个信号上的双绞线布线会更理想、但在这种情况下、我不认为有必要。 但是、由于您是从 Arduino 到试验电路板的跳线、然后从试验电路板到另一电路板、因此您可能需要将每组电线缠绕在一起。 如果您可以卸下试验电路板、只需在 Arduino 和测试板之间进行操作、我强烈推荐它!
尊敬的 Chris:
我尝试了您的建议、我认为示波器结果有一些变化
drive.google.com/open
黄色是时钟、工作正常
绿色是 MISO 线、它的行为似乎不是很好。
时序与逻辑分析仪的结果一致、因此我认为数据解释可能有一些问题、而不是时钟脉冲时序本身。 但是、我想问以下问题吗?
1. MISO 线路在传输结束时保持高电平是否正常? 示波器表明、最后一个 MISO 脉冲会逐渐衰减、这在我看来是不正确的。 逐渐衰减会导致系统在传输结束后看到 MISO 线路保持高电平。
2. MISO 线路的起始位置为高于接地的位、然后在脉冲时低于接地的位。 这是正常的吗?
我有关于 ADS 1256的相关问题:
1.如何知道 SPI 速度的值? 它取决于微控制器吗? 我应该有什么好的资源来了解一下?
2. 以下行允许我设置 Arduino Uno 微控制器的状态寄存器
字节 STATUS_reg = 0x00;//地址(数据表第30页)
字节 STATUS_DATA = 0x01;// 01h = 0000 0 0 1 =>状态:最高有效位优先、自动校准禁用、模拟输入缓冲器禁用
//byte STATUS_DATA = 0x07;// 01h = 0000 0 1 1 =>状态:最高有效位优先、自动校准启用、模拟输入缓冲器启用
SPI.transfer (0x50 | STATUS_reg);// b01010000
SPI.transfer (0x00);//第二个命令字节、只写入一个寄存器
spi.transfer (STATUS_DATA);//将数据字节写入寄存器
delayMicroseconds (100);
Arduino 中的 SPI.transfer 之间存在较小的延迟、可将字节相互分隔。
如果 ESP32使用上述 SPI.transfer 字节连续发送3个字节的流、该怎么办?传输字节之间没有任何间隙、时钟将连续24次脉冲。 将这些字节写入寄存器是否会遇到问题?
谢谢、
Khoi Ly
您好、Khoi、
很遗憾、我无法访问您的 Google Drive。 您是否可以将一些示波器屏幕截图附加到您的 E2E 帖子?...请确保使用"插入/编辑媒体"按钮、因为"CTRL-V"粘贴在 E2E 上效果不是很好。
关于您的问题...
[引用用户="Khoi Ly10"]1. 您如何知道 SPI 速度的值? 它取决于微控制器吗? 我应该有什么好的资源来了解一下?
在大多数微控制器中、可通过选择 SPI 外设使用的时钟源或配置时钟分频器来配置 SCLK 频率。 您可以尝试搜索 Arduino 的"SPI"或"SPI 代码示例"。 我知道第三方 Github 项目(此处: https://github.com/baettigp/ADS12xx-Library)、但我没有尝试过。
ADS1256允许 SCLK 频率最快为 fCLK/2或3.84MHz (对于7.68MHz 时钟)。
[引用用户="Khoi Ly10"]
2. 以下行允许我设置 Arduino Uno 微控制器的状态寄存器
字节 STATUS_reg = 0x00;//地址(数据表第30页)
字节 STATUS_DATA = 0x01;// 01h = 0000 0 0 1 =>状态:最高有效位优先、自动校准禁用、模拟输入缓冲器禁用
//byte STATUS_DATA = 0x07;// 01h = 0000 0 1 1 =>状态:最高有效位优先、自动校准启用、模拟输入缓冲器启用
SPI.transfer (0x50 | STATUS_reg);// b01010000
SPI.transfer (0x00);//第二个命令字节、只写入一个寄存器
spi.transfer (STATUS_DATA);//将数据字节写入寄存器
delayMicroseconds (100);
Arduino 中的 SPI.transfer 之间存在较小的延迟、可将字节相互分隔。
如果 ESP32使用上述 SPI.transfer 字节连续发送3个字节的流、该怎么办?传输字节之间没有任何间隙、时钟将连续24次脉冲。 将这些字节写入寄存器是否会遇到问题?
[/报价]
某些 ADS1256 SPI 字节传输确实需要延迟(请参阅 ADS1256数据表中的"T6")。 我建议使用 GPIO 控制/CS (避免在每个 SPI 字节后切换/CS 的内置帧同步引脚),并在需要延迟时在 SPI.transfer()调用之间插入延迟。
您好、Khoi、
我希望这会有所帮助!
尊敬的 Chris:
感谢您的支持。 我使 ADS1256能够与 ESP32配合使用。 但是、我遇到了以下错误。
在差分模式下、我测量电源电压从0到3V。 该程序工作正常、我能够在终端监视器中记录原始无符号整数数据。 但是、当我增加/减少 电压时、程序偶尔会中断、该电压的值介于~900、000和~1、000、000之间。
中断行为如下:当数据日志从~900000增加到~1000000时、数据变为-1、然后变为0。 一旦变为零、我就无法再收集多少数据、除非我复位微控制器。 当我将值从~1、000、000降低到~900、000时、这种行为类似。
除此之外、代码工作正常
您是否知道这样的情况? 您对调试有什么建议吗?
谢谢、
Khoi Ly
这是我的设置。 我认为其中一个问题可能是我必须执行以下步骤:
SPI.transfer (0x01);//读取数据0000 0001 (01h)//**** 步骤3******
delayMicroseconds (5);
ADC_val [i]= SPI.transfer (0);
ADC_val[i]<= 8;//向左移位
adc_val[i]|= spi.transfer (0);
ADC_val[i]<= 8;
adc_val[i]|= spi.transfer (0);
delayMicroseconds (2);
该部件在 Arduino Uno 上完全正常、但在 ESP32上的行为不一致。
ADS1256_cmd (SPI、cmd);//读取数据0000 0001 (01h)//****** 步骤3******
ETS_DELAY_us (5);
ADC_val[i]= ADS1256_read (SPI);
ADC_val[i]<= 8;//向左移位
ADC_val[i]|= ADS1256_read (SPI);
ADC_val[i]<= 8;
ADC_val[i]|= ADS1256_read (SPI);
ETS_DELAY_us (2);
我尝试使用 RDATAC 一次读取全部24位数据、但我得到的结果完全是我的信号读取结果被丢弃。 由于我在每个循环的开头调用 RDATAC、因此每次读取后 SDATAC 是否应该? 如果我要这样做、我必须确保 SDATAC 命令必须在下一个 DRDY 处于低电平时发出、对吧?
尊敬的 Chris:
因此、在架构方面、我可以在循环之前调用 RDATAC、在循环内部、我将调用 ADS1256_Read (SPI)函数将数据存储到变量中。
也许、如果这在循环中起作用、我可以设置一个中断/任务来处理此数据收集部分?
这里的一个问题是、我必须在通道之间进行多路复用。 多路复用如何影响我的 RDATAC? 当我调用 RDATAC 时、它是否适用于所有通道、或者我必须对每个通道调用 RDATAC? 当我切换通道时、我是否需要 SDATAC 并在之后再次调用它?
当我调用 ADS1256_Read 时、DIN 不是低电平。 我不能完全确定为什么会出现这种情况。 我使用 ESP32中的内置库、它可能会在我不知道的情况下执行一些操作。 但是、由于 SPI 基于同时读取和写入、我可以在读取阶段忽略 DIN、对吧?
我将给这个机会、看看这是怎么发生的
Khoi Ly
您好、Khoi、
通常、您希望 DIN 为"0x00"(即 NOP)、以便 ADC 仅返回数据。 如果 DIN 在数据读取期间形成命令、则可能会中断数据读取操作并获取无效数据。
当您使用 RDATA 命令时、DIN 是否保持低电平(即、您在 RDATA 字节后发送所有零)?
对于通道间的多路复用、根本不能使用 RDATAC 模式。 您必须发送 RDATAC、读取数据、发送 SDATAC、更新寄存器设置、然后重复此操作。
在将数据读取到变量并进行移位时也要小心。 确保将数据转换为正确的数据类型、否则、如果您要移动"uint8_t"、您可能只需尝试对数据执行数学运算即可获得损坏的数据。
尊敬的 Chris:
我想我可能会发现问题。
根据数据表中的图30、我将采样率设置为默认值30kHz、并且即使发生中断、也无法在 DRDY 中将 DIN 和 DOUT 设为低电平。
我尝试使用将 DRATE 设置为1000SPS
REG =(0x50 | 0x03);CMD = 0x00;数据= 0xA1;// A1H = 10100001 = 1000SPS
// 0x02 = 0b11 // 0x00 = 0b00 // 0x01 = 0b01
ADS1256_cmd (SPI、reg);//设置 A/D 数据速率
ADS1256_cmd (SPI、cmd);
ADS1256_cmd (SPI、DATA);
我有三个问题:
如果 DRATE 设置为1000SPS、这是否意味着我的逻辑分析仪上的 DRDY 也显示1kHz?
2.我是否如上面的代码所示发送三个单独的字节、或者我是否应该发送一个单个24位流?
3.第36页的"第2个命令字节:0000 nnnn、其中 nnnn 是要读取的字节数–1"与图35略有冲突。 我想知道第二个命令字节应该是0x00还是0x01?
我尝试过此代码、但我仍然在逻辑分析仪上看到 DRDY 频率为30kHz。 我想知道原因可能是什么。
感谢您的帮助、
Khoi Ly
您好、Khoi、
如果可以,请尝试避免在每个读取循环中使用任何类型的"printf()"或"print to terminal (打印到终端)"命令。 通常、这些类型的操作需要占用处理器资源、可能会阻止您快速处理下一个/DRDY 中断。
要回答您的问题...
非常感谢你的帮助。 我能够获得1kHz DRATE 并修复了 Arduino 代码和 ESP32之间的大量问题。 但是、您能不能帮助我看一下以下逻辑分析仪图像、因为我无法检测到任何明显的东西。
1) 1)复位至加电
2) 2)设置状态寄存器(延迟1ms 后)
3) 3)设置 A/D 控制寄存器(延迟1ms 后)
4) 4)设置 DRATE (延迟1ms 后)
5) 5)执行偏移和增益自校准命令
6)设置多路复用器和通道(无多路复用、我尝试读取 AIN0和 AIN1之间的差分电压)
7) 7)同步和唤醒(延迟5us 后)
8) 8) while 循环内部
RDATA (逻辑分析仪 CS 启用(4)上有一个可防止 SPI 位重写的噪声信号)
读取数据流(我检查 T6远高于50 * tFclock)。
是否需要在 RDATA 命令和24位 MISO 流之间保持 CS 低电平?
DRDY 实际上为1kHz、因此我假设任何 WREG 操作也都正确完成。 我不能完全理解为什么最后一幅图中的 MISO 行上没有任何内容。
谢谢、
Khoi Ly
您好、Khoi、
在/CS 变为低电平后(请参阅数据表中的"t3")、在第一个 SCLK 上升沿之前、您应该添加一个延迟。 如果没有这种延迟、ADS1256可能无法注册第一个 SCLK 边沿、通信将不同步。 有时您必须使用 GPIO 来控制/CS、因为某些微控制器不会对内置 SPI 控制信号时序提供太多控制。
此外、DOUT 信号看起来不正确。 DOUT 应在 SCLK 的上升沿转换、并保持其电平直到下一个上升沿。 您显示的脉冲行为不正常。 目前、您好像观察到一个与 DOUT 容性耦合的信号。
关于您的问题...是的、/CS 需要在发送"RDATA"命令后保持低电平。 只有在您为数据计时后、它才会返回高电平。