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.

[参考译文] ADS7924:使用I2C读取4通道时出现问题

Guru**** 2533870 points
Other Parts Discussed in Thread: TM4C129DNCPDT, ADS7924

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/650319/ads7924-problem-in-reading-4-channel-using-i2c

部件号:ADS7924
主题中讨论的其他部件:TM4C129DNCPDT

你好朋友

我正在我的项目中使用ads7924,i2c是我的tm4c129Dncpdt和ADS7924之间的链接,

根据我的说明,我已按照数据表进行配置。

现在的问题是我在i2c上正确获取第一个通道的值,它会因输入而异,但如果我对第二个通道执行相同的操作,它将无法正常工作。

当我将输入更改为信道1时,它也会影响信道2的值,因为我只读取四个信道中的两个,

下面是我 在i2c上的代码。 如果我做的任何事情出错,建议我。

/**** ADC初始化***/

ADC_Channel_init (0x48,0x00,0x80,1);//唤醒模式

ADC_Channel_init (0x48,0x12,0x1C,1);//创建的输入

ADC_Channel_init (0x48,0x00,0xC8,1);//手动扫描模式

它处于3秒循环函数中

ROM_I2CMasterSlaveAddrSet (I2C2_base,slave,false);

ROM_I2CMasterDataPut(I2C2_base, 0x82);

ROM_I2CMasterControl (I2C2_BASE,I2C_MASTER_CMD_STUSTREG_SEND_START);

while (!ROM_I2CMasterBusy (I2C2_BASE));
while (ROM_I2CMasterBusy (I2C2_BASE));


//指定我们将从从属设备读取
ROM_I2CMasterSlaveAddrSet (I2C2_base,slave,true);

//发送控制字节并从注册表读取我们
//指定
ROM_I2CMasterControl (I2C2_BASE,I2C_MASTER_CMD_STUSTREG_receive _START);

//等待MCU完成事务
while (!ROM_I2CMasterBusy (I2C2_BASE));
while (ROM_I2CMasterBusy (I2C2_BASE));

//返回从指定寄存器中提取的第一个字节
DATA[0]=(uint8_t)ROM_I2CMasterDataSet(I2C2_base);

while (ROM_I2CMasterBusy (I2C2_BASE));

ROM_I2CMasterControl (I2C2_BASE,I2C_MASTER_CMD_STUSTRE_receive _CONT);

//等待MCU完成事务
while (!ROM_I2CMasterBusy (I2C2_BASE));
while (ROM_I2CMasterBusy (I2C2_BASE));

//返回从指定寄存器中提取的第一个字节
Data[1]=(uint8_t) ROM_I2CMasterDataGet (I2C2_BASE);

while (ROM_I2CMasterBusy (I2C2_BASE));

// ROM_SysType.Delay(100);

ROM_I2CMasterControl (I2C2_BASE,I2C_MASTER_CMD_STUSTRE_receive _CONT);

//等待MCU完成事务
while (!ROM_I2CMasterBusy (I2C2_BASE));
while (ROM_I2CMasterBusy (I2C2_BASE));

//返回从指定寄存器中提取的第一个字节
Data[2]=(uint8_t)ROM_I2CMasterDataSet(I2C2_base);

while (ROM_I2CMasterBusy (I2C2_BASE));

ROM_I2CMasterControl (I2C2_BASE,I2C_MASTER_CMD_STUSTRE_receive _CONT);

//等待MCU完成事务
while (!ROM_I2CMasterBusy (I2C2_BASE));
while (ROM_I2CMasterBusy (I2C2_BASE));

//返回从指定寄存器中提取的第一个字节
Data[3]=(uint8_t)ROM_I2CMasterDataSet(I2C2_base);

while (ROM_I2CMasterBusy (I2C2_BASE));

ROM_I2CMasterControl (I2C2_BASE,I2C_MASTER_CMD_STUSTRE_receive _CONT);

//等待MCU完成事务
while (!ROM_I2CMasterBusy (I2C2_BASE));
while (ROM_I2CMasterBusy (I2C2_BASE));

//返回从指定寄存器中提取的第一个字节
DATA[4]=(uint8_t)ROM_I2CMasterDataSet(I2C2_base);


ROM_I2CMasterControl (I2C2_BASE,I2C_MASTER_CMD_STUSTRE_receive _CONT);

//等待MCU完成事务
while (!ROM_I2CMasterBusy (I2C2_BASE));
while (ROM_I2CMasterBusy (I2C2_BASE));

//返回从指定寄存器中提取的第一个字节
Data[5]=(uint8_t)ROM_I2CMasterDataSet(I2C2_base);

ROM_I2CMasterControl (I2C2_BASE,I2C_MASTER_CMD_STUSTRE_receive _CONT);

//等待MCU完成事务
while (!ROM_I2CMasterBusy (I2C2_BASE));
while (ROM_I2CMasterBusy (I2C2_BASE));

//返回从指定寄存器中提取的第一个字节
Data[6]=(uint8_t)ROM_I2CMasterDataSet(I2C2_base);


ROM_I2CMasterControl (I2C2_BASE,I2C_MASTER_CMD_STREBATE_receive);

//等待MCU完成事务
while (!ROM_I2CMasterBusy (I2C2_BASE));
while (ROM_I2CMasterBusy (I2C2_BASE));

//返回从指定寄存器中提取的第一个字节
Data[7]=(uint8_t)ROM_I2CMasterDataSet(I2C2_base);

UARTprintf ("CH1 MSB %x lsb %x - CH2 MSB %x lsb %x - ch3 MSB %x lsb %x lsb %x\r\n",data[0],data[1],data[2],data[3],

数据[3],数据[4],数据[5],数据[6],数据[7]);


ADC_Channel_init (0x48,0x00,0xC8,1);//用于多扫描

此致

哈里什

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

    我的问题是使用手动扫描模式只能读取2个信道吗??

    我正在进行如下初始化

    1)在地址0x00中写入0x80以保持唤醒模式

    2)在地址0x00中写入0xC8,用于手动扫描模式

    之后我每500毫秒读一次

    我读的是这样的

    用于通道1

    1)写入0x82并读取两个值  //因为我已递增第一位,所以我正在读取0x02和0x03

    2)在地址0x00中写入0xC8,用于手动扫描模式

    对于通道2

    1)正在写入0x84并读取两个值  //因为我已递增第一位,所以我正在读取0x02和0x03

    2)在地址0x00中写入0xC8,用于手动扫描模式

    在给通道1输入后,我正在从通道1正确读取数据,但同时如果我读取第二个通道,它也会给出值。

    如果我将输入提供给第二个通道,则它的读数不正确。

    如果我使用自动扫描单模式逐个读取信道,则可以正确读取。 但不在多扫描模式下。

    我已经检查了CRO I2C通信工作正常,但寄存器中的数据不正确或读取不正确。

    有人能帮我解决这个问题吗?

    此致

    哈里什

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

    感谢您的耐心等待。 我正在研究这件事,并将很快回复您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Harish,

    根据您最近发表的总结代码的文章,我有几个建议:

    1)将设备置于唤醒模式,然后发出手动扫描命令后,我建议直接读取两个通道。 数据表第26页的表3给出了通道的寄存器地址,第25页的图33显示了如何读取多个寄存器。

    2)在您对读取通道2的描述下,您将先写入0x84,然后写入0xC8。 没有用于0x84的有效命令(假定您正在将其写入模式控制寄存器),并且可能会将设备置于未知状态。

    3)手动扫描模式将所有信道转换一次,但您每次要读取单个信道时都提供命令。 您是否考虑过使用手动单通道模式仅转换单通道? 这将节省电源,因为ADC不会经常转换。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Evan
    很抱歉回复太晚

    我已将设备配置为手动扫描模式,要在读取扫描值后获得多个读数,我正在重新配置它。

    为了读取,我正在读取0x82,然后跟随和0x84并跟随寄存器,寄存器是通道1和通道2的寄存器,但数据在某种程度上,当我给通道1提供电压时,它会影响通道2,如果我给通道输入 2它没有更新我已经签入CRO,它看起来不错,除了我返回的数据和我签入的硬件和输入引脚看起来不错。

     
    如果我想读取2个通道,那么我如何在单模式 切换通道中使用ads7924使用唤醒模式对我不起作用????


    此致
    哈里什

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

    如果可能,请分享您的输入驱动器电路的示意图吗? 由于您在通道1有输入时看到通道2上的值,我怀疑这可能是硬件问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Evan

    输入来自连接至连接器的运算放大器。

    此致

    哈里什

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

    我有两个建议供您尝试:

    1)在R58处放置一个0欧姆电阻器(MUXOUT和ADCIN之间的电阻器),并拆下C64。

    2)如果#1不起作用,请尝试删除C51和C54 (除了1中建议的更改之外)。

    ADC的输入可能存在稳定问题,这是由RC对引起的,或者通过C51/54从一个通道耦合到另一个通道的切换引起的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Evan

    第一种方法本身有效。 我真的非常感谢你。

    此致

    哈里什