TIwilliam hill官网
直播中

王波

7年用户 1452经验值
私信 关注
[问答]

ADS1298连续转换时读取到的数据异常,是哪里出了问题?


  • 源程序如下:
    ADS1298初始化程序
    void ADS1298_Init(void) // 初始化ADS1298各寄存器
    {
    uint8_t i,data;
    ADS1298_START(HIGH); // 开始转换数据
    ADS1298_CS(LOW); // 使能ADS1298操作
    delay_us(10); // 延时
    SPI_SendByte(ORDER_SDATAC); // 停止读取数据
    delay_us(5); // 延时
    SPI_SendByte(ORDER_RESET); // 复位器件
    delay_us(10); // 延时
    SPI_SendByte(ORDER_SDATAC); // 停止读取数据
    delay_us(5); // 延时
    // 调试代码
    if(DEBUGE) // 调试模式下将读取全部寄存器值
    {
    SPI_SendByte(READ_DEVICE_ID); // 读取数据起始地址
    delay_us(5); // 延时
    SPI_SendByte(25); // 读取全部26个数据
    for(i=0;i<26;i++)
    {
    data=SPI_SendByte(0x00); // 读取设备ID
    if(DEBUGE) Usart1_Send_Char(data); // 发送26个寄存器初始值
    }
    }
    // 设置ADS1298内部寄存器
    // 设置寄存器CONFIG_3
    SPI_SendByte(WRITE_CONFIG_3_REGISTER); // 设置寄存器起始地址
    delay_us(5); // 解码延时
    SPI_SendByte(0); // 设置一个寄存器
    SPI_SendByte(0xC0); // 设置寄存器CONFIG_3 使能内部参考源 设置为2.4V
    // 设置寄存器CONFIG_1
    SPI_SendByte(WRITE_CONFIG_1_REGISTER); // 设置寄存器起始地址
    SPI_SendByte(0); // 设置一个寄存器
    SPI_SendByte(0x80); // 设置寄存器CONFIG_1 使能高效能模式 转换速率为500SPS
    // 设置寄存器CONFIG_2
    SPI_SendByte(WRITE_CONFIG_2_REGISTER); // 设置寄存器起始地址
    delay_us(5); // 解码延时
    SPI_SendByte(0); // 设置一个寄存器
    SPI_SendByte(0x00); // 设置寄存器CONFIG_2 内部测试寄存器
    // 设置各转换通道
    SPI_SendByte(WRITE_CHANNEL_1_SET_REGISTER); // 设置寄存器起始地址
    delay_us(5); // 解码延时
    SPI_SendByte(7); // 设置八个寄存器
    for(i=0;i<8;i++) // 连续设置八个寄存器
    {
    SPI_SendByte(0x81); // 默认6倍增益 输入短路
    }
    // 设置寄存器GPIO
    SPI_SendByte(WRITE_GENERAL_PORT_IO); // 设置寄存器起始地址
    delay_us(5); // 解码延时
    SPI_SendByte(0); // 设置一个寄存器
    SPI_SendByte(0xB0); // 设置GPIO
    // 回读设置参数
    if(DEBUGE) // 调试模式下将读取全部寄存器值
    {
    SPI_SendByte(READ_DEVICE_ID); // 读取数据起始地址
    delay_us(5); // 解码延时
    SPI_SendByte(25); // 读取全部26个数据
    for(i=0;i<26;i++)
    {
    data=SPI_SendByte(0x00); // 读取设备ID
    if(DEBUGE) Usart1_Send_Char(data); // 发送26个寄存器初始值
    }
    }
    ADS1298_START(HIGH); // 开始转换数据
    SPI_SendByte(ORDER_RDATAC); // 发送连续读取数据命令
    delay_us(100);
    ADS1298_CS(HIGH); // 禁用ADS1298操作
    delay_us(5); // 高电平延时
    // if(DEBUGE) ADS1298_Read_Initreg(); // 读取初始化寄存器参数
    }

    数据转换读取程序:
    void ADS1298_Read_Data(void) // 读取ADS1298转换数据
    {
    uint8_t i;
    while(ADS1298_READY==1); // 等待ads1298准备好
    // 读取状态数据
    ADS1298_CS(0); // 使能ADS1298
    delay_us(5); // 短延时
    for(i=0;i<27;i++)
    {
    ADS1298_ALL_Channel=SPI_SendByte(0x00);// 发哦送数据并读取
    }
    delay_us(5); // 短延时
    ADS1298_CS(1); // 使能ADS1298
    }

    我遇到的问题是 设置读取寄存器正常 但是读取转换数据不正确。应该是时序问题,但是不知道怎么结局啊。
    系统上电时读到的默认寄存器:
    92 06 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F 00 00 00 00 00 这里 92是编号
    然后我设置各寄存器后,重新读取寄存器数据:
    92 80 00 C0 00 81 81 81 81 81 81 81 81 00 00 00 00 00 00 00 A0 00 00 00 00 00 配置输入通道掉电 GPIO设置为输出A0(为了查看读取数据中状态寄存器值是否正确) 这样读取的转换数据应该都是000吧?
    结果我读取的数据如下:
    C0 00 0A 7F C0 00 0B 00 00 C0 00 0B 00 C0 00 0B 00 00 C0 00 0B 00 FF 80 00 16 00 这里已经读出了状态寄存器 C0 00 0A这个应该是正确的,可后边的数据应该都是00 00 00 啊。

    请问读取数据的时候是只要发送连续的24+8*24各SCLK就能将状态位和8通道转换数据都读出来吗?
    还是读取CS拉低读取24bits状态位CS拉高,CS拉低读取24bits通道1CS拉高,CS拉低读取24bits通道2CS拉高............直到读完第八个通道呢?
    我两种方法都试过了,读取的数据就是不正确。能告诉我到底哪里错了??谢谢

回帖(2)

苏丹

2024-12-26 15:24:47
    我觉得你得关注一下 DRDY 引脚的信号。看一下手册的图38的时序要求
举报

成尔秩

2024-12-26 18:15:21
根据您提供的源程序,ADS1298连续转换时读取到的数据异常,可能的原因有以下几点:

1. 硬件连接问题:请检查ADS1298与微控制器之间的连接是否正确,包括电源、地线、SPI接口等。确保所有连接都牢固且无短路现象。

2. SPI通信问题:请检查SPI通信是否正常工作。您可以使用示波器或逻辑分析仪检查SPI信号线上的数据传输是否正确。同时,确保SPI时钟频率、CPOL和CPHA设置正确。

3. ADS1298初始化问题:请检查ADS1298初始化程序中的寄存器设置是否正确。根据您的代码,您已经设置了一些寄存器,但可能还有其他寄存器需要设置。请参考ADS1298的数据手册,确保所有必要的寄存器都已正确配置。

4. 程序逻辑问题:请检查程序逻辑是否正确。例如,您在初始化程序中使用了`ADS1298_START(HIGH);`和`ADS1298_START(LOW);`,但实际上应该使用`ADS1298_START(LOW);`和`ADS1298_START(HIGH);`来启动和停止转换。请检查您的代码,确保所有操作都按照正确的顺序执行。

5. 调试代码问题:您提到了调试代码,但代码中缺少了部分内容。请确保调试代码完整且正确,以便在调试模式下正确读取寄存器值。

综上所述,您需要检查硬件连接、SPI通信、ADS1298初始化程序和程序逻辑,以找出导致数据异常的原因。同时,请确保调试代码完整且正确,以便在调试模式下正确读取寄存器值。
举报

更多回帖

×
20
完善资料,
赚取积分