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.

[参考译文] ADS1261

Guru**** 2385100 points
Other Parts Discussed in Thread: ADS1261
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1531977/ads1261

器件型号:ADS1261

工具/软件:

您好、

我尝试 测量 一个力平台在 400SPS 和增益 64 下 4 个负载单元的数据(4 路差分输出;单极电源)。 我为 ADS1261 设计了一个分线板、用于将所有称重传感器连接到它、放大原始数据并进行模数转换。

在原理图(随附的文件)中、您可以看到我将 START、RESET、PWDN 引脚硬接线至 DVDD、将 CS 引脚接至 GND、以使 ADC 始终通电、处于活动状态并选择用于串行通信。 现在、我正在尝试在 ADS1261 和 teensy 4.1 MCU 之间建立 SPI 通信。 TEENCY 的默认 SPI 总线包含引脚 11 (MOSI)、12 (MISO)、13 (SCLK) 和 10 (CS)。 TEENCY 的引脚 11 (MOSI) 连接到 ADS 的 DIN 引脚、引脚 12 (MISO) 连接到 ADS 的 DOUT、引脚 13 (SCLK) 连接到 ADS 的 SCLK、引脚 10 (CS) 连接到 GND、引脚 2 (GPIO) 连接到 ADS 的 DRDY。 我已经定义了所有必要的寄存器分配和转换命令(您可以检查随附的代码文本;它用于一个通道)、但 ADS 仍然没有响应、MCU 正在读取一些垃圾值。 注意:SPI 总线上仅连接了一个 ADS、  多个从 器件之间不共享总线。 未设置内部基准、AVDD 设置为基准。 ADS 芯片 ID 被识别为 0x81。

我无法理解我的错误所在。 如果您能帮助我解决问题、那将会很好。

此致、

Charles

代码:

#include

// teensy 4.1 SPI0 默认引脚
#define DRDY_PIN 2.

SPISettings spiSettings (1000000、MSBFIRST、SPI_MODE1);
#define INTERT_COMMAND_DELAY_US 50

//启用此选项以调试原始数据和状态
#define DEBUG_RAW_BYTES TRUE

void safeDelay (){
 delayMicroseconds (inter_command_delay_US);
}

void writeRegister (uint8_t reg、uint8_t val){
 safeDelay ();
 SPI.beginTransaction(spiSettings);
 spi.transfe (0x40 | reg); // WREG 命令
 SPI.TRANSFER (0x00);     //写入 1 寄存器
 spi.transfer (val);
 spi.endTransaction();
}

uint8_t readRegister (uint8_t reg){
 safeDelay ();
 SPI.beginTransaction(spiSettings);
 SPI.transfe (0x20 | reg); // RREG 命令
 SPI.TRANSFER (0x00);     //读取 1 个寄存器
 uint8_t val = spi.transfe (0xFF);
 spi.endTransaction();
 返回值;
}

bool waitForDRDY (unsigned long timeout_ms = 1000){
 无符号长启动= millis();
 而 (digitalRead (DRDY_PIN)=高电平){
  如果 ((millis ()- start)> timeout_ms) 返回 false;
  delayMicroseconds (10);
 }
 返回 true;
}

int32_t readADCData (bool &statusOK){
 uint8_t 状态;
 uint8_t data[4];

 safeDelay ();
 SPI.beginTransaction(spiSettings);
 SPI.TRANSFER (0x12); // RDATA 命令

 STATUS = SPI.TRANSFER (0xFF); //读取 STATUS 字节
 对于 (int i = 0;i < 4;++I){
  DATA[i]= spi.transfe (0xFF);
 }

 spi.endTransaction();

 //调试打印
 if (debug_raw_bytes){
  serial.print(“status:0x“);serial.print (status、hex);
  serial.print(“|字节:“);
  对于 (int i = 0;i < 4;i++){
   serial.print(“0x")“);Serial.print (data[i]、hex);Serial.print (“);
  }
  serial.println();
 }

 statusOK =!(status 和 0x80); //位 7 = 1 表示 ADC 错误

 //合并字节
 int32_t =((int32_t) data[0]<< 24)|
        ((int32_t) data[1]<< 16)|
        ((int32_t) data[2]<< 8)|
        ((int32_t) data[3]);

 返回值;
}

void setupADS1261 (){
 Delay (100); //等待上电
 SPI.beginTransaction(spiSettings);
 SPI.TRANSFER (0x06); // RESET 命令
 spi.endTransaction();
 延迟 (10);
 writeRegister (0x01、0x02); //电源:内部基准关闭
 延迟 (10);
 writeRegister (0x02、0x28); // MODE0:SINC3400SPS
 writeRegister (0x03、0x00); // MODE1:单次模式
 writeRegister (0x04、0x70); // Mode2:4 字节+ SPITIM 开启+ STATUS 开启
 延迟 (10);
 uint8_t mode2 = readRegister (0x04);
 serial.print(“MODE2 寄存器回读= 0x“);
 serial.println(mode2,十六进制);  
 writeRegister (0x10、0x06); // GAIN1:增益= 64
 writeRegister (0x11、0x23); // INPMUX:AIN2 - AIN3

 delay(50); //让它稳定下来
}

void triggerSingleConversion(){
 safeDelay ();
 SPI.beginTransaction(spiSettings);
 SPI.TRANSFER (0x08); //启动命令
 spi.endTransaction();
}

void setup(){
 Serial.begin(115200);
 延迟 (100);

 pinMode(DRDY_PIN,输入);
 SPI.begin();

 serial.println(“初始化 ADS1261……“);

 //读取 ID
 uint8_t id = readRegister (0x00);
 serial.print(“芯片 ID = 0x“);serial.println (id、hex);
 if (id != 0x80 && id != 0x81){
  serial.println(“无效的 ID。 检查 SPI 接线。“);
  while (1);
 }

 setupADS1261 ();
 serial.println(“ADS1261 initialized.“);
}




void loop(){
 triggerSingleConversion();

 if(!waitForDRDY (1000)){
  serial.println(“DRDY timeout“);
  延迟 (500);
  返回;
 }

 bool statusOK = false;
 int32_t = readADCData (statusOK);

 if (statusOK){

  serial.print(“ADC Raw =“);
  serial.println (ADC_RAW);
 }其他{
  serial.println(“检测到 ADC 状态错误!“);

 }

 延迟 (500);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charles Jebaraj:

    您能否提供显示 ADC 与您的控制器之间通信的逻辑分析仪数据? 请包含 CS、DIN、DOUT、SCLK 和 DRDY 信号。

    这将使我们能够查看您发送到 ADC 的内容、ADC 的响应方式以及检查时序(从您的代码中看这并不明显)

    -布莱恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bryan:

    对于 ADS1261 — 启动,复位,PWDN 引脚硬接线至 DVDD、CS 引脚在 PCB 本身硬接线至 GND… 对于 ADS1261 和 teensy 4.1 MCU 之间的 SPI 通信、使用默认的 SPI 总线 0:MCU 的引脚 11 (MOSI) 连接到 ADS 的 DIN 引脚、引脚 12 (MISO) 连接到 ADS 的 DOUT、引脚 13 (SCLK) 连接到 ADS 的 SCLK、引脚 10 (CS) 连接到 GND、引脚 2 (GPIO) 连接到 ADS 的 DRDY ... 我们没有逻辑分析仪、因此无法为您提供 DIN、DOUT、DRDY 和 SCLK 引脚的数字信号 我在这里附加了修改后的代码文件以及我们可以在串行端口上看到的输出... 很明显、ADC 芯片 ID 已正确识别、默认寄存器值也已正确读取、但写入寄存器命令都失败、这就是 ADC 读取和转换可能未发生的原因。 请帮助我们让它发挥作用…… 注意:在我们当前的硬件设置中、ADS 始终在 SPI 总线上选择(因为 CS 引脚永久连接至低电平)、在连续转换模式下(因为 START 引脚永久连接到 DVDD);SPI 总线上只有一个 ADC…… 在该设置中、我们如何正确建立 SPI 通信并使 ADC 正常工作

    e2e.ti.com/.../ADS1261_5F00_SPI_5F00_ModifiedCode.txt

    此致、  

    Charles

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charles Jebaraj:

    我不确定如何在不能看到通信的情况下提供帮助。 您的代码可能正确、但通信时序关闭。 您将无法仅通过查看代码来确定这一点。

    您将需要某种方法来监控通信 、以至少检查是否满足时序要求。 但这也有助于诊断一般的通信问题

    此外、我不建议将 CS 保持为低电平。 SCLK 引脚上的任何干扰都可能被解释为额外的 SCLK 周期或错过的 SCLK 周期、从而引发整个通信。 是的、可以将 CS 接地、但同样不建议这样做、因为您必须小心通信

    -布莱恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Bryan