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.

[参考译文] ADS131M04:读取和写入问题

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1509886/ads131m04-read-and-write-issue

器件型号:ADS131M04
主题中讨论的其他器件: AMC131M03

工具/软件:

您好、使用 ADS131M04、我尝试与 IC 通信、我读取默认寄存器值、但数据是 incorrect.in、只是尝试读取 MODE 寄存器默认值。

uint16_t ADS_ReadRegister (uint8_t reg_addr)

uint8_t tx_buf[3]={ 0 };

uint8_t rx_buf[3]={ 0 };

// RREG 命令格式:001A aaaa annn nnnn→0x20 |(addr << 1)

uint16_t 操作码;

opcode = opode_RREG |((uint16_t) reg_addr)<< 7);

tx_buf[0]=(uint8_t)((opcode >> 8)& 0x00FF);

tx_buf[1]=(uint8_t)(opcode & 0x00FF);

tx_buf[2]= 0;

HAL_SPI_TransmitReceive_dma (&hspi3、tx_buf、rx_buf、3);

返回((uint16_t) rx_buf[0]<< 8)|((uint16_t) rx_buf[1]);

}

void ADS_WriteRegister (uint8_t reg_addr、uint16_t 数据)

uint8_t tx_buf[6]={0};

uint8_t rx_buf[6]={0};;

uint16_t 操作码[1];

opcodes[0]= opode_WREG |((uint16_t) reg_addr)<< 7);

// WREG 命令格式:011A aaaa annn nnnn→0x60 |(地址<< 1)

tx_buf[0]=(uint8_t)((opcodes[0]>> 8)& 0x00FF);

tx_buf[1]=(uint8_t)(opcodes[0]& 0x00FF);

tx_buf[2]= 0x0;

tx_buf[3]=(uint8_t)(data >> 8)& 0x00FF;

tx_buf[4]=(uint8_t) data & 0x00FF;

tx_buf[5]= 0x0;

HAL_GPIO_WritePin (CS2_GPIO_Port、CS2_Pin、GPIO_PIN_RESET);

HAL_SPI_TransmitReceive_dma (&hspi3、tx_buf、rx_buf、6);

HAL_GPIO_WritePin (CS2_GPIO_Port、CS2_Pin、GPIO_PIN_SET);

返回

}

读取和写入或不工作以及一个以上 IC 开始提供连续数据示例4ksps 作为默认模式值。 IM 使片选信号持续变为低电平。

该怎么做任何建议,是否有帧格式正确或不正确。 我的 SPI CLK 为10MHz、CLKIN 为8MHZ

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

    您好 Srinath B、

    读取命令不正确。 您正在将"001A aaaa annn nnnnn"发送 到 ADC、正确的 RREG 命令为"101a aaaa annn nnnnnn"。 如果您想  以 ADS131M04中的 GAIN 寄存器(04h 地址)为例、则 应将1010 0010 0000 000 (0xA200)发送至 ADS131M04。

    以下时序对您来说是一个很好的参考:

    1. RREG:读取 GAIN 寄存器(0x4地址)

    2. WREG:写入时钟寄存器(0x03)+寄存器数据。 注意:该时序中的第2个帧用于检查来自 ADC 的响应。 具有两个字的短帧(每个有24位)也可用于 WREG+数据。

    3. 从 ADS131M04的全部4个输入通道读取转换数据的正常运行。 一个帧中总共需要6个字(每个字的长度为24位)、STATUS 字+ 4通道转换数据+ CRC 字。

    如果您有任何其他问题、请告诉我。 最好检查您的时序图。

    BR、

    Dale

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

    你好 Dale 感谢你的答复。

    我在 RREG 中有疑问。 当我们想要读取模式寄存器值时、它的响应将出现在第一帧或第二帧。 与第二个 imgae 写入寄存器一样、您已将默认时钟值写入此寄存器、因为响应也是第二帧?。 如果是在第二个帧中、我们必须发送空命令来获取该数据。

    uint16_t ADS_ReadRegister (uint8_t reg_addr)

    uint8_t tx_buf[6]={0};

    uint8_t rx_buf[6]={ 0 };

    uint8_t tx_buf_ads[6]={0};

    uint8_t rx_buf_ads[6]={ 0 };

     

    uint16_t 操作码;

    opcode = opode_RREG |((uint16_t) reg_addr)<< 7);

    tx_buf[0]=(uint8_t)((opcode >> 8)& 0x00FF);

    tx_buf[1]=(uint8_t)(opcode & 0x00FF);

    tx_buf[2]= 0x00;

    // HAL_GPIO_WritePin (cs_GPIO_Port、cs_Pin、GPIO_PIN_RESET);

    HAL_SPI_TransmitReceive (&hspi3、tx_buf、rx_buf、3、HAL_MAX_DELAY);

    // HAL_GPIO_WritePin (cs_GPIO_Port、cs_Pin、GPIO_PIN_SET);

    MODE =((uint16_t) rx_buf[0]<< 8)|((uint16_t) rx_buf[1]);

    // HAL_GPIO_WritePin (cs_GPIO_Port、cs_Pin、GPIO_PIN_RESET);

    HAL_SPI_TransmitReceive (&hspi3、tx_buf_ads、rx_buf_ads、3、HAL_MAX_DELAY);

    // HAL_GPIO_WritePin (cs_GPIO_Port、cs_Pin、GPIO_PIN_SET);

    返回((uint16_t) rx_buf_ads[0]<< 8)|((uint16_t) rx_buf_ads[1]);

    }

     

    如果您看到此示例、是否正确读取寄存器数据? 在此片中、选择完全保持低电平。

    在上面的示例中、我第一次发送读取 reg 命令、第二次发送 null 命令、在此期间、我必须验证寄存器响应。

    假设从任何寄存器读取一个默认值、则 respone 也应该有唯一合适的默认值。

    请验证是否正确

    谢谢、

    Srinath

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

    您好 Srinath B、

    如果使用 RREG 命令读取单个寄存器、则寄存器 数据将在第二个帧的第一个字上看到。  

    如果您使用  RREG 命令读取多个寄存器、 第1个寄存器数据将在第2个帧的第一个字上看到、 第2个寄存器数据将在 第2个帧的第二个字上看到...

    如果 使用 WREG 命令写入单个寄存器、则会  在第二个帧的第一个字上看到 ADC 的响应。 您 实际上可以读回寄存器数据以检查寄存器写入是否正确、无需等待、也无需查看 ADC 在 第二个帧中的响应。

    您可以查看图8-23/8-24/8-25中的时序和 ADS131M04数据表中的说明以了解所有这些信息。

    BR、

    Dale

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

    你好 Dale 谢谢,我会尝试你提出的任何建议。  如果看图像 IM 发送18字节的空数据获取 ADC 数据,在此期间,我的第一个字(reponse) 的最后一个字节总是出现0x80 ,而我的 最后一个字 CRC 的最后一个字节都是0x0和0x80 ,该怎么做这种如何纠正这种情况,因为两个都是正确的0x0。 会出现什么问题 、我无法匹配 CRC。 请建议一些解决方法。

    谢谢、

    Srinath

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

    您好 、Srinath、

    如果没有时序、则无法进行调试。 有更多建议、SPI 配置应 CPOL=0和 CPHA=1、您可以再次检查微控制器中的配置。

    BR、

    Dale

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

    你好 Dale 感谢你的答复。 IM 开始读取数据。 现在我检查 AMC131M03 IC ,在我面临一个问题,我配置了16位的数据, DCDC 启用和 OSR 128 ,所有工作正常。 但有时我的 CRC 不匹配,让我们说一次300或400读取,在此期间我在状态寄存器中得到一个值是0x0203 ,这意味着最后一个通道数据没有就绪,字长显示32位,复位 位位位为0显示没有发生复位。

    当我的 CRC 正确时,我的状态寄存器显示0x0407 , 这总是意味着所有通道数据都准备就绪,字长为16位,复位位位位位为1 ,表示发生了复位。

    但这是发生一次在每大约200到400之间的读取和之后再大约200到400倍的 CRC 匹配,这可能是原因。 复位位位在状态寄存器中指示什么以及使用什么。 在连续读取期间、复位位位位应该是什么值。  

    您可以建议如何纠正这个问题吗? 在所有这些检查期间,我没有给任何输入 IC 的通道,我只是试图读写和验证 CRC

    此致、

    Srinath

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

    您好 、Srinath、

    是否使用或测试 ADS131M04或 AMC131M03? AMC131M03属于不同的团队、并由他们提供支持。  

    BR、

    Dale

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

    你好 Dale ,现在我使用的是 amc131m03 ,这个问题也只是在这个 IC 中

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

    您好 、Srinath、

    您能否发布有关 AMC131M03的新问题、以便由合适的团队提供支持?

    BR、

    Dale