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.

ADS131A02初始化失败

Other Parts Discussed in Thread: ADS131A02

1.  问题:ADS131A02初始化时,发送RESET指令后,可以接收到其响应FF02;但是接下来发送UNLOCK指令后,去接收不到其响应0655,用NULL指令去读取响应,也得不到。这是为什么?
2.. 条件:STM32F030CCT6驱动ADS131A02,ADS131A02采用SPI同步从模式、32位数据帧格式、开启汉明码(M0: 悬空,M1:上拉,M2:上拉)
我按照数据手册的时序图写的代码。
```
//读写命令函数
uint16_t ADS131A02_Write_CMD(uint16_t command)
{
uint16_t receive = 0X0000;

SPI2_CS_LOW();
receive = SPI2_Write_Read((uint8_t)(command>>8));
receive <<= 8;
receive |= SPI2_Write_Read((uint8_t)(command&0X00FF));
SPI2_Write_Read(0X00);
SPI2_Write_Read(0X00);
SPI2_CS_HIGH();
delay_us(10);
}
//ADS初始化
void ADS131A02_Init(void)
{
uint16_t receive_ack = 0x0000;

ADS_RESET_HIGH();//初始化时,复位引脚必须拉高
ADS131A02_Write_CMD(0X0011);发送RESET指令
do
{
delay_ms(6);//需要延时4.5ms以上才能完成复位周期
receive_ack = ADS131A02_Write_CMD(0X0000);//发送NULL指令,读取RESET命令的响应
}while(receive_ack != 0XFF02);
printf("Receive RESET Command Ack is:%#X\n",receive_ack);

ADS131A02_Write_CMD(0X0655);发送UNLOCK指令
do
{
delay_ms(6);
receive_ack = ADS131A02_Write_CMD(0X0000);//发送NULL指令,读取UNLOCK命令的响应
}while(receive_ack != 0X0655);
printf("Receive UNLOCK Command Ack is:%#X\n",receive_ack);//这里接收不到0X0655,直接卡死在while循环这。

while(1);
}

  • 1. 问题:ADS131A02初始化时,发送RESET指令后,可以接收到其响应FF02;但是接下来发送UNLOCK指令后,去接收不到其响应0655,用NULL指令去读取响应,也得不到。这是为什么?
    2. 条件:STM32F030CCT6驱动ADS131A02,ADS131A02采用SPI同步从模式、32位数据帧格式、开启汉明码(M0: 悬空,M1:上拉,M2:上拉)
    我按照数据手册的时序图写的代码。
    ```
    //读写32位命令函数
    uint16_t ADS131A02_Write_CMD(uint16_t command)
    {
    uint16_t receive = 0X0000;

    SPI2_CS_LOW();
    receive = SPI2_Write_Read((uint8_t)(command>>8));
    receive <<= 8;
    receive |= SPI2_Write_Read((uint8_t)(command&0X00FF));
    SPI2_Write_Read(0X00);
    SPI2_Write_Read(0X00);
    SPI2_CS_HIGH();
    delay_us(10);
    }
    //ADS初始化
    void ADS131A02_Init(void)
    {
    uint16_t receive_ack = 0x0000;

    ADS_RESET_HIGH();//初始化时,复位引脚必须拉高
    ADS131A02_Write_CMD(0X0011);发送RESET指令
    do
    {
    delay_ms(6);//需要延时4.5ms以上才能完成复位周期
    receive_ack = ADS131A02_Write_CMD(0x0000);//发送NULL指令,读取RESET命令的响应
    }while(receive_ack != 0XFF02);
    printf("Receive RESET Command Ack is:%#X\n",receive_ack);

    ADS131A02_Write_CMD(0X0655);发送UNLOCK指令
    do
    {
    delay_ms(6);
    receive_ack = ADS131A02_Write_CMD(0x0000);//发送NULL指令,读取UNLOCK命令的响应
    }while(receive_ack != 0X0655);
    printf("Receive UNLOCK Command Ack is:%#X\n",receive_ack);
    }

  • 怀疑您的上电时序还没有完全完成就发送指令了, 发送unclock收不到相应说明不能使能SPI接口。 参考Figure74的时序. UNLOCK from a POR Command Status Response 以及datasheet Page 52 关于9.5.3.6.1 UNLOCK from POR or RESET的介绍:
    www.ti.com/.../ads131a02.pdf
  • 我说按照datasheet Page 52说明和Figure74来做的。复位完成后,先发一个NULL指令,再发UNLOCK指令,最后通过NULL指令进行读取UNKOCK指令的状态响应
  • 即使是这样,依然读取不到OX0655,只能读取到FF02
  • 即使是这样,依然只能得到FF02,而得不到0655
  • 把M1接地,改成24bit的数据帧的格式再试试,看是否能收到Unlock的ACK指令。
  • 把M1接地,24位格式,也只能接收到FF02,接收不到UNLOCK的ACK(0655)
  • 我把DOUT(MISO)引脚在STM32上设置为复用推挽输出,同时外部接100K上拉电阻,是不是这个的缘故?按通用SPI总线接口模式,应该将MISO设置为浮空输入模式。
  • 收不到unlock指令的话,说明这个器件并没有正确的接收输入指令,也就是说要检查下DIN是否没问题?

    另外,再检查下电源是否没问题,DIN焊接上是否有问题,导致DIN不能正确接入?

    方便的话把DOUT浮空输入再试试。

  • 恩,昨天禁用Hamming Code后,代码可以正常运行了。但是一旦启用Hamming Code后,就不能运行了,又恢复到以前状态了。
    启用Hamming Code时,发送的命令格式:16bit + 8bit zeroes + 8bit HC,这8bit HC改怎么发送?