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.

[参考译文] ADS1256:使用 F280049C 读取 ADS1256寄存器

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1513315/ads1256-using-f280049c-to-read-ads1256-registers

器件型号:ADS1256
主题: TMS320F280049中讨论的其他器件

工具/软件:

我正在使用 TMS320F280049来连接 ADS1256。 我将 F280049的 SPI 配置为1 MHz 的模式1、没有使用 FIFO 或中断、但我无法正确读取任何 ADS1256寄存器、即使我的逻辑分析仪布线看起来合理、ADC 仍会返回虚假数据。 下面是我的初始化代码以及我用于读取寄存器的函数:

void ADS1256_writeRegister(uint8_t reg, uint8_t value) {
 CS_LOW();
 while (GPIO_readPin(ADS1256_DRDY_GPIO))
 ;
 SPI_writeByte(ADS1256_CMD_WREG | (reg & 0x0F));

 SPI_writeByte(0x00); // write one register
 SPI_writeByte(value);
 CS_HIGH();
}

static void ADS1256_sendCmd(uint8_t cmd) {
 CS_LOW();
 SPI_writeByte(cmd);
 CS_HIGH();
}

void ADS1256_init(void) {
 while (GPIO_readPin(ADS1256_DRDY_GPIO))
 ;
 CS_LOW();
 SPI_writeByte(ADS1256_CMD_SELFCAL);
 while (GPIO_readPin(ADS1256_DRDY_GPIO))
 ;
 CS_HIGH();

 ADS1256_writeRegister(ADS1256_STATUS, 0x06);

 ADS1256_writeRegister(ADS1256_ADCON, ADS1256_PGA_GAIN_1);
 ADS1256_writeRegister(ADS1256_DRATE, 0x23);
 ADS1256_writeRegister(ADS1256_IO, 0x00);

 while (GPIO_readPin(ADS1256_DRDY_GPIO))
 ;
 CS_LOW();
 SPI_writeByte(ADS1256_CMD_SELFCAL);
 while (GPIO_readPin(ADS1256_DRDY_GPIO))
 ;
 CS_HIGH();
}

uint8_t ADS1256_readRegister(uint8_t reg) {
 uint8_t val;

 ADS1256_sendCmd(ADS1256_CMD_SDATAC);
 
 while (GPIO_readPin(ADS1256_DRDY_GPIO))
 ;
 CS_LOW();

 SPI_writeByte(ADS1256_CMD_RREG | (reg & 0x0F));
 SPI_writeByte(0x01); // read one register

 DEVICE_DELAY_US(50);
 // val = SPI_receiveByte(ADS1256_SPI_BASE, 0x00);
 // val = SPI_receiveByte(ADS1256_SPI_BASE, 0x00);

 CS_HIGH();
 return val;
}

ADS1256_readRegister()在循环中运行函数、结果如下图所示:




在上图中、MISO 数据流不规则。 输出显示为乱码、而不是我正在读取的寄存器中的两个预期字节。

通过放大捕获可以看到、主器件发送的 SPI 命令和数据字节按预期显示、但从 ADS1256返回的数据仍然出现乱码:两个有效寄存器字节绝不会出现在 MISO 上。



提前感谢您的帮助!

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

    您好 Chen、

    ADS1256在 SCLK 的上升沿发送数据、在 SCLK 的下降沿捕获数据。  根据 F280049用户指南、您需要选择"rising edge without delay"或 SPI 模式00。  使用 SPI 模式1将导致建立和保持时间违例。

    此外、为了从单个寄存器读取、SPI 帧的 长度需要为3个字节。  在此期间、/CS 线路必须保持低电平、否则 SPI 端口将被复位并且不会执行读取寄存器命令。  图34显示了从 MUX 开始读取2个寄存器的正确命令序列。

    首先、发送命令0x1101h、延迟 T6=50个 CLK 周期。  假设您使用的是8MHz 时钟、那么您需要延迟至少 T6=50*125ns=6.25us。  然后、通过发送16个 SCLK 来读取 MUX 和 ADCON 寄存器。  ADS1256将在 SCLK 的上升沿发送数据、F280049应在 SCLK 下降沿捕获数据。

    此致、
    Keith Nicholas
    精密 ADC 应用

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

    您好,感谢您的帮助! 我已成功读取 ADS1256寄存器。 现在我正在尝试读取转换数据:我选择了通道0并发送了相应的命令和寄存器设置。 我看到的值看起来合理、但 ADC 不应该在主器件发出0x03(RDATA)命令后立即输出三个字节?

    在上面的捕获中、我看到在三个预期数据字节之前传输了另外六个字节()0x28 0x89 0xF8。 这些额外的字节是什么、它们是否包含任何有用的信息?

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

    您好 Chen、

    您需要添加一些额外的延迟。

    发送 SYNC 和 WAKEUP 命令后、您需要等待 DRDY 变为低电平、然后发送 RDATAC 命令。

    发送 RDATAC 命令后、您至少需要等待6.5us (T6=50*tCLK);在这种情况下、您只需要等待大约4us。

    详细信息可在此处找到:

    总共发送5个 SPI 帧。  第一个帧(WREG 设置多路复用器输入)时、ADC 提供最后一个 输出数据0x2889f8h。  由于没有新的转换结果、您将重复获得相同的数据。  接下来的3个帧仅为8b、因此您仅得到0x28h、但最后一个帧为24b 时钟、这将 再次提供完整的24b 数据。

    此致、
    Keith