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.

[参考译文] ADS131A04:ADS131A04:同步从模式配置无法获取 ADC 数据。

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/736155/ads131a04-ads131a04-synchronous-slave-mode-configuration-unable-to-get-adc-data

器件型号:ADS131A04

您好!

我在同步从模式下使用 ADS131A04 ADC、配置如下。

M0:悬空、同步从模式。

M1:GND、24位配置。

M2:GND、汉明码关闭。

我能够按照数据表中的规定配置和读取每个命令和寄存器的响应。 但是、在启用全部四个 ADC 后、我无法获取 ADC 数据。

在配置期间、我的 D_SYS_CFG[0](CRC 被禁用)_CFG[1]= 0 (动态帧大小)、并且全部四个 ADC 都被启用。 因此,在读取 ADC 数据时,我将读取20字节的数据(4字节状态响应和4*4字节通道数据)。

上电复位时、寄存器正在进行配置、但数据日志中显示的状态响应读取需要一些时间才能稳定至0x22000000。

记录的 ADC 配置和 ADC 数据如下所示:-

*所有响应均为32位十六进制。
ADC 首次测试计划!!!

复位寄存器响应:ff0400ff

解锁命令 respone:65500ff

STAT_1寄存器响应:220000ff

STAT_N 寄存器响应:240000ff

STAT_S 寄存器响应:250000ff

STAT_M2寄存器响应:270200ff

A_SYS_CFG 寄存器响应:2b6000ff

D_SYS_CFG 寄存器响应:2c3c00ff

CLK1寄存器响应:2d0800ff

CLK1寄存器响应:2d0200ff

CLK2寄存器响应:2e2600ff

ADC_ENA 寄存器响应:2f0f0000

WAKEUP 命令 respone:330000

LOCK 命令 respone:5550000

e2e.ti.com/.../ADS131A04_5F00_data_5F00_log.txt

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

    欢迎访问 E2E 论坛。 我们正在仔细查看您的答复、并应在明天之前收到后续答复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Anshul、

    欢迎来到我们的论坛、感谢您的发帖!

    [引用 USER="Anshul Basra "]在读取 ADC 数据时,我正在读取20字节的数据(4字节状态响应和4 * 4字节通道数据)。[/引用]

    您是否真正使用24位模式? 当 M1 = GND 时、每个 SPI 字只需发送3个字节。 因此、为了从所有四个通道读取数据、您总共需要15个字节:一个字表示状态、另一个字表示每个通道。

    [报价用户="Anshul Basra "]读取状态响应需要一些时间才能稳定到数据日志中下面显示的0x22000000。[/报价]

    您是否在数据日志中显示的每个状态响应之前在帧中发送 NULL 命令? 发送 NULL 命令时、请查看 STAT_1寄存器的内容。 数据日志中的状态响应指示的一些错误消息表示您有 SPI 故障、我之前的评论将对此进行解释。 其他响应没有意义、这可能表明由于每帧 SCLK 数量不正确而导致 SPI 传输错误。

    此致、

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

    是的、我使用 Null 命令来读回每个寄存器设置的状态响应、并发送命令来配置 ADC。

    我已经对函数进行了定义、以便向 ADC 发送32位命令。 如前所述、在我使用 Null 命令读取响应的下一帧中、present 命令的状态可用。

    正如您所说的、现在我正在读取15个字节的数据(3字节状态响应、3字节* 4通道数据= 12字节)。 我仍然没有从 ADC 获取数据。 所有通道数据为零、状态响应为0x2200。

    我正在分享如何配置 ADC 和读取微控制器上的数据。

    /*用户代码 begin 2 */
    printf ("ADC 首次测试程序!!!!!\n");

    ResetCommand (GPIOA、GPIO_PIN_4);
    printf ("复位寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    DevIdCommand (GPIOA、GPIO_PIN_4);

    //printf ("就绪命令响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    //等待设备就绪...........
    while ((((NullCommand (GPIOA、GPIO_PIN_4))& 0xFFFFFF0000)!= 0xFF040000){}

    UnlockCommand (GPIOA、GPIO_PIN_4);
    printf ("解锁命令响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));

    readRegisterCommand (GPIOA、GPIO_PIN_4、STAT_1);
    printf ("STAT_1寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    readRegisterCommand (GPIOA、GPIO_PIN_4、STAT_N);
    printf ("STAT_N 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    readRegisterCommand (GPIOA、GPIO_PIN_4、STAT_S);
    printf ("STAT_S 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    readRegisterCommand (GPIOA、GPIO_PIN_4、STAT_M2);
    printf ("STAT_M2寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    readRegisterCommand (GPIOA、GPIO_PIN_4、A_SYS_CFG);
    printf ("A_SYS_CFG 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    //writeRegisterCommand (GPIOA、GPIO_PIN_4、D_SYS_CFG、0x3F);
    readRegisterCommand (GPIOA、GPIO_PIN_4、D_SYS_CFG);
    printf ("D_SYS_CFG 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    readRegisterCommand (GPIOA、GPIO_PIN_4、CLK1);
    printf ("CLK1寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    writeRegisterCommand (GPIOA、GPIO_PIN_4、CLK1、0x02);
    printf ("CLK1寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    writeRegisterCommand (GPIOA、GPIO_PIN_4、CLK2、0x26);
    printf ("CLK2寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));

    writeRegisterCommand (GPIOA、GPIO_PIN_4、ADC_ENA、0x0F);
    printf ("ADC_ENA 寄存器响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));

    WakeupCommand (GPIOA、GPIO_PIN_4);

    printf ("唤醒命令响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));
    LockCommand (GPIOA、GPIO_PIN_4);
    printf ("锁定命令响应:%x\n"、NullCommand (GPIOA、GPIO_PIN_4));

    /*用户代码在*/时开始

    while (1)

    /*用户代码结束,同时*/
    printf("\n**** 循环开始*** \n");
    DRDY_STATUS = HAL_GPIO_ReadPin (GPIOA、GPIO_PIN_0);
    DONE_STATUS = HAL_GPIO_ReadPin (GPIOA、GPIO_PIN_1);
    printf ("DRDY 状态:%x\n"、DRDY_STATUS);

    //读取数据

    HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_RESET);// CS 低电平
    HAL_SPI_Receive (&hspi1、Rx_DATA、15、200);
    // HAL_DELAY (500);
    HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_SET);// CS 高电平

    uint32_t STATUS_RESPONSE = Rx_DATA[0]<<16 | Rx_DATA[1]<<8 | Rx_DATA[2];
    uint32_t ch0 = rx_data[3]<<16 | rx_data[4]<<8 | rx_data[5];
    uint32_t CH1 = rx_data[6]< 16 | rx_data[7]< 8 | rx_data[8];
    uint32_t CH2 = rx_data[9]<<16 | rx_data[10]<8 | rx_data[11];
    uint32_t ch3 = rx_data[12]<<16 | rx_data[13]<<8 | rx_data[14];
    // uint32_t CRC = rx_data[20]<<24 | rx_data[21]<<16 | rx_data[22]<<8 | rx_data[23];
    printf ("状态响应:%x\n"、STATUS_RESPONSE);
    printf ("ch0:%x\n"、ch0);
    printf ("ch1:%x\n"、ch1);
    printf ("ch2:%x\n"、ch2);
    printf ("ch3:%x\n"、ch3);
    //printf ("CRC:%x\n"、CRC);

    HAL_GPIO_TogglePin (GPIOB、GPIO_PIN_3);

    printf ("\n ****** 循环结束******* \n");

    /*用户代码 begin 3 */

    DSO 波形快照:-

    黄色:CS

    蓝色:SCLK

    品红色:MISO

    绿色:MOSI

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

    您好、Anshul、

    您必须为 SPI 帧中的每个字发送正确的位数。 如果器件配置为24位模式、并且您每字发送32位、则通信将不起作用。

    请通过将 M1连接到 IOVDD、将 ADS131A04配置为32位模式。

    此致、

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

    大家好、我将 M1连接到 IOVDD。

    现在、我正在读取20字节的通道数据(禁用 CRC)、但 仍然会获得与0x22000000相同的状态响应、并且所有通道数据都为0。

    在同步从机模式下、我已将 DRDY 和 CS 连接到微控制器 CS、在读取数据时、我将 CS 设置为低电平读取20个字节并将其设置回高电平。 是正确的、或者我必须发送 Null 命令才能读取通道数据。

           HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_RESET);// CS 低电平
          HAL_SPI_Receive (&hspi1、Rx_DATA、20、200);//读取20字节数据
          HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_SET); // CS 高电平


          // HAL_DELAY (5);
          uint32_t STATUS_RESPONSE = Rx_DATA[0]<<24 | Rx_DATA[1]<<16 | Rx_DATA[2]<<8 | Rx_DATA[3];
          uint32_t ch0 = rx_data[4]<<24 |rx_data[5]<<16 | rx_data[6]<8 | rx_data[7];
          uint32_t CH1 = Rx_DATA[8]<<24 |Rx_DATA[9]<<16 | Rx_DATA[10]<8 | Rx_DATA[11];
          uint32_t CH2 = rx_data[12]<<24 |rx_data[13]<<16 | rx_data[14]<<8 | rx_data[15];
          uint32_t ch3 = rx_data[16]<<24 |rx_data[17]<<16 | rx_data[18]<8 | rx_data[19];

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

    尊敬的 Anshul:

    感谢您的更新。

    您的原理图连接声音正确。 当您保持/CS 为低电平并发送20个字节的 SCLK、并且 DIN 也为低电平时、您实际上已经在发送 NULL 命令。 在读取数据时、您不需要发送任何内容、只需发送 DIN 上的内容。

    您是否在范围内查看过通信时序、以验证您是否满足所有时序规格? 请记住、同步从机模式需要一个固定的数据速率周期、该周期由/DRDY 下降沿之间的时间设置。 由于/DRDY 和/CS 在您的设置中连接在一起、因此数据速率周期还会建立通信帧的周期。 在下面的图66中、请注意/DRDY 和/CS 如何设置 DIN 和 DOUT 同时传输的通信帧大小。  

    如果这不是您打算与 ADS131A04进行通信的方式、则可能异步从模式更适合您的应用。

    此致、

x 出现错误。请重试或与管理员联系。