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: CAP引脚是否应该有1.8V输出呢?

Part Number: ADS131M04

我的数字电源和模拟电源都为3.3V, CAP引脚是否应该有1.8V输出呢?

我用STM32F407 的PWM输出占空比为50%的信号作为CLKIN,CLKIN为4MHz;SPI CLK配置为 低电平 下降沿有效2.5Mhz 8位 MSB模式 但无论发什么指令器件都没回应,CAP引脚为0V。我用示波器观测CLKIN SCLK 和DIN波形都正常。RESET为高电平 CS直接配置为始终低电平。

MX_TIM4_Init();
/* USER CODE BEGIN 2 */

setCS(LOW);
InitADC();

// EXTI6_Enable();
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// writeSingleRegister(GAIN1_ADDRESS, 0x0003);//通道0 GAIN = 8
// sendCommand(OPCODE_UNLOCK);
//
// readData(&DataStruct);
spiSendReceiveByte(0x00);
spiSendReceiveByte(0x33);
spiSendReceiveByte(00);

spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);

spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);

spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);

spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);

spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);

spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);

spiSendReceiveByte(00);
spiSendReceiveByte(00);
spiSendReceiveByte(00);

LL_mDelay(1);

}

void InitADC(void)
{
// IMPORTANT: Make sure device is powered before setting GPIOs pins to HIGH state.

// Initialize GPIOs pins used by ADS131M0x


// Initialize SPI peripheral used by ADS131M0x
MX_SPI1_Init();
LL_SPI_Enable(SPI1);
// Run ADC startup function
adcStartup();
}

SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
SPI_InitStruct.ClockPhase = LL_SPI_PHASE_2EDGE;
SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;
SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV16;
SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
SPI_InitStruct.CRCPoly = 10;
LL_SPI_Init(SPI1, &SPI_InitStruct);
LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA);

void adcStartup(void)
{
/* (OPTIONAL) Provide additional delay time for power supply settling */
setSYNC_RESET(LOW);
LL_mDelay(50);
/* (REQUIRED) Set nRESET pin high for ADC operation */
setSYNC_RESET(HIGH);
LL_mDelay(1);

  • 您好,

    是的,CAP 电压应该为1.8V.

    CAP引脚为0V

    这是不正常的,检查下供电是否正常、焊接是否有问题,或多测试几块板子CAP 都是0V 吗?

    DIN 在SCLK 下降沿采样,DOUT 在SCLK 上升沿发送。

    建议你先解决下CAP 为0 的问题,再看通信问题。

  • 好的,谢谢

  • 我无论向寄存器写入什么,怎么总读出0x50f,是不是我的时序不完整啊?我想配置通道1使能,4倍放大。数据能够读出,而且随输入变化,输出数字量是变化的。但配置没能正确写入到ADS131.

  • 怎样才能进入short frame 模式呢?

  • 你好,现在 CAP引脚电压正常了是吗?可以分享出是什么原因CAP电压异常的吗?

    在datasheet  8.5.1.10.8 WREG (011a aaaa annn nnnn)有寄存器写入时序图,你看下,默认CRC是disabled,4个ADC通道是使能的。建议你捕捉下写寄存器时序图看下哪里有异常。

    怎样才能进入short frame 模式呢?

    这个需要你配置寄存器,disable 4个ADC通道。

  • 感谢回复,CAP电压正常了,可能是买了坏的芯片,换芯片解决了问题。

    现在上电能有0xFF24的回复,但不能正常的进行寄存器配置,不配置寄存器时也能读取AD数据,而且数据应该也是正常的。

  • 很高兴你解决了CAP 电压的问题。

    但不能正常的进行寄存器配置,

    你发送其他命令有正确的响应吗?比如LOCK 、UNLOCK命令?

    你是否发送了读寄存器或写寄存器命令?

  • 能写入,我是通过RESET引脚复位后,直接写入模式寄存器配置为16位工作方式(0x0010,好像生效了,共发出18个字节SPI时钟),等待ready'引脚变低,再配置clock(只开通道0,发了12个字节SPI时钟,在前两个字节,收到回复0x41),在等待ready'引脚变低,在写入寄存器。。。一系列操作下来,我利用官方提供的读取数据函数(readData(&DataStruct_AD))无法正确读取数据。

    我想只开通道0,那么读取数据是不是也需要发 完整的3*6字节(18个字节)SPI时钟啊?如果工作在16位模式的话,就需要发送12个字节SPI读时钟?是不是我的改写readData(&DataStruct_AD)函数,因为它只发了6个字节SPI时钟,少发了6个?

  • 你的问题可能是SPI 帧长的问题,建议你看下datasheet 8.5.1.7 SPI Communication Frame章节。

    SPI 帧长一般是6个字,DIN的话,6个字包括一个命令字,一个CRC(CRC disable的话那么发送0s)字,再加4个字的0s;

    DOUT 的话6个字包括一个响应字,4个ADC输出字,加CRC字。

    一个字包含的字节数与寄存器 WLENGTH[1:0] bits设置有关,默认24bits。

    读取寄存器的话,如果需要读取多个寄存器值,那么通信帧长就多于6个字了。

    我想只开通道0,那么读取数据是不是也需要发 完整的3*6字节(18个字节)SPI时钟啊?如果工作在16位模式的话,就需要发送12个字节SPI读时钟?是不是我的改写readData(&DataStruct_AD)函数,因为它只发了6个字节SPI时钟,少发了6个?

    应该是这里的问题。

  • 我看到例程里,如果只转换通道0的话,读取数据只需4个字,我所有操作指令都是1个寄存器一个寄存器配置的,所以都是6WORDS的标准帧,我改写了ReadData函数,并在外中断中读取数据还是不行,读取的数据有问题,原因正在查找中。

  • 我没研究代码例程,我不明白:只转换通道0的话,读取数据只需4个字

    你可以配置为 short frame 模式吗?即disable 掉所有通道,然后看是否可以读取寄存器值。disable 掉所有通道就不进行AD 转换了,就没有转换结果输出了。

  • 您说的对,是我搞错了,开始我没注意CS的时序,因为我只有一个SPI设备,所以为省事,我上来就把CS拉低了,此后没有对cs进行操作(我将例程中的所有对CS的操作都注释掉了),可能是这个原因导致不是完整的帧可能数据会乱套(没进一步验证)。 现在我的采集已经没问题了。

    非常感谢您的帮助!

  • 你的程序,我能不能参考下,我能正常读写寄存器,我设置了DRDY下降沿中断,但是一直等不到DRDY引脚变低

  • writeSingleRegister(CLOCK_ADDRESS, 0x000E);//关通道
    writeSingleRegister(GAIN1_ADDRESS, 0x0002);//通道0 GAIN = 2;
    // writeSingleRegister(THRSHLD_LSB_ADDRESS, 0x0002);//High_Pass -3db 84.8Hz;
    writeSingleRegister(CLOCK_ADDRESS, (CLOCK_DEFAULT & ~CLOCK_OSR_MASK) | CLOCK_OSR_256);//开通道0,采集速度16K

    /* (OPTIONAL) Read back all registers */

    /* (OPTIONAL) Check STATUS register for faults */
    ReadData_AD(&DataStruct_AD);
    ReadData_AD(&DataStruct_AD);
    EXTI6_Enable();//初始化后,我先读两次数据再开中断

    中断程序中

    if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_6) != RESET)
    {
    LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
    /* USER CODE BEGIN LL_EXTI_LINE_6 */
    EXTI6_Disable();//关中断
    ReadData_AD(&DataStruct_AD);//读数据
    Flag_DataReady_AD = 1;
    LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
    EXTI6_Enable();//开中断
    /* USER CODE END LL_EXTI_LINE_6 */
    }

  • 别客气。

  • 感谢你的分享!