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.

[参考译文] ADS1115:ADS1115未响应地址0x48

Guru**** 2534540 points
Other Parts Discussed in Thread: ADS1115

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/847135/ads1115-ads1115-not-responding-for-the-address-0x48

器件型号:ADS1115

大家好、

我正在使用 I2C 将 ADS1115与 Nuvoton N76E003连接。

我使用的是 ADC 通道 A0和5V 电源电压。

我已将 ADS1115的 ADDR 引脚连接到 GND。

当我通过主器件提供地址0x48时、它会给出0x20即主机发送地址 NACK 作为应答。

我被困在这里。 请找到我的附件代码并建议解决方案。

#define EEPROM_SLA 0x48
#defineEEPROM_WR 0
#define EEPROM_RD 1
#define SET_BIT3 0x08
#define SET_BIT4 0x10
#define P13_OpenDrain_ModeP1M1|=SET_BIT3;P1M2|=SET_BIT3
#define P14_OpenDrain_ModeP1M1|=SET_BIT4;P1M2|=SET_BIT4


#define I2C_ACK
1 #define I2C_NACK 1
#define TIMEOUT_START
I2C_START (

ADS1115)(void I2C_START);void I2C_START)(void I2C_START)(ADS1115)(void I2C (void I2C)(void I2C)(void I2C)(void I


void I2C_Master_Write (unsigned char value);
unsigned int I2C_Master_read (unsigned short a);
void main ()
{
//modify_HIRC_166 ();
//----------- I/O 定义--------------------------------------------------------

//P1M1 = 0x80;//对于正常程序


//--- 函数调用-------------------------------------------------------

init_I2C ();
I2C_start();
ADS1115_config();
ADS1115_read();
I2C_stop();
while (1)
{
}
}//-----------------

用于显示的 I2C 通信-------------------------------------------------------
void init_I2C (void)
{
P13_OpenDrain_Mode;
P14_OpenDrain_Mode;
SDA = 1;
SCL = 1;
I2CPX=0; //SCL= P1.3、SDA=P1.4
I2CEN = 1;
I2CLK=42;// 16MHz 时钟的400KBPS
}
//____________ ADS1115配置和数据块_________________________ //

void I2C_start (void)
{
signed int t = timeout_count;

STA = 1;
Si = 0;

}

void I2C_stop (void)
{
signed int t = timeout_count;

SI = 0;
STO = 1;
}
void ADS1115_config ()
{
I2DAT =(EEPROM_SLA | EEPROM_WR);

IF (I2STAT = 0x18)
{
LED = 1;
}
I2C_Master_Write (0x01);//命令到配置寄存器0x01
I2C_Master_Write (0x80);// PGA:+-6.144V、I2C_Master_Write (0x83)、非
锁存、默认值、0xA0、非锁存模式、I2C_CONDIM (0x80)。 ALERT/RDY0x83

}
void I2C_Master_Write (unsigned char value)
{
I2DAT = value;//将数据写入 SSPBUF
}
void ADS1115_read ()
{
unsigned int datah;
unsigned int datal;

//float data;
I2C_Master_Write (0x90);// 0x90
I2C_Master_Write (0x00);//0x00
I2C_Master_Write (0x91);/0x91
datah = I2C_Master_Read (1);
datal = I2C_Master_Read (0);

}

unsigned int I2C_Master_Read (unsigned char ack_mode)
{
signed int t = timeout_count;
unsigned char 值= 0x00;
I2DAT =(EEPROM_SLA |= EEPROM =

1);t = rd_timeout;t = rd = 1;t = rd_rd
Si = 0;
while ((SI = 0)&&(t>0)
{
t-;
};

value = I2DAT;

if (ack_mode = I2C_NACK)
{
t = TIMEOUT_COUNT;
AA = 0;
SI = 0;
while (SI = 0)&&(t>0))
{
t-;
};
}

return value;

}

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

    您好!

    您能否使用示波器共享 I2C 通信波形的捕捉?  我们的 ADS111x 专家将在下周早些时候与您联系。

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

    Gandhali、


    我同意 Collin 的说法、您应该使用逻辑分析仪或示波器来查看器件与微控制器之间的通信。 请注意、通信应与数据表中图30和31所示的通信完全相同。

    此外、该器件中的寄存器、包括配置寄存器和转换寄存器、都是16位的、并按顺序发送、而您的写入似乎使用8位事务。 同样、使用逻辑分析仪或示波器查看 I2C 通信。


    吴约瑟

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

    Gandhali、


    一位同事刚刚注意到、您对地址的读/写操作有误。 I2C 地址为48h、但这是写操作的高7位。 在您的地址中、您使用48h 作为字节、然后使用 AND 或 AND 与0或1进行写操作或读操作。 对于 I2C 地址、您应该为90h、然后使用0或1进行写入或读取。 在时序图中、您可以在此处看到:




    吴约瑟

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

    您好、Joseph、

    感谢您的建议。

    我已根据您的建议写入从机 ID 0x90、但它仍然没有响应。

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

    Gandhali

    在这种情况下、我认为我们需要从示波器或逻辑分析仪上看到 SDA 和 SCL 信号。 这是确定微控制器发出什么信号以及器件响应什么信号的最佳方法。

    获取示波器快照并将其发布回此处。 确保有足够的详细信息来查看地址和数据中的各个位。

    吴约瑟

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

    Gandhali、

    我一段时间没有听到您的声音、因此我想我会检查您是否已经解决了您的通信问题。 在我的上一篇文章中、我建议您查看与示波器或逻辑分析仪的通信、我认为这是帮助调试这些问题的最佳方法。

    我现在将关闭此帖子、但如果您仍有问题、请发帖、我们可以再次对此进行处理。

    吴约瑟

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

    您好、先生、

    实际上、我没有逻辑分析仪、无法在 CRO 上捕获波形的图像。

    问题仍然存在。

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

    Gandhali、

    我认为查看 ADC 通信的示波器截图非常重要。 如果没有这一点、就无法知道微处理器是否甚至向任何地方发送通信或命令。 如果没有这种视图、调试这些问题将非常困难。

    吴约瑟

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

    您好、Joseph、

    我们有 Tektronix TBS 1072B 70MHz 数字示波器、很难在其上捕获快照。

    那么、我们应该在循环中运行该程序、然后再对其执行一个操作吗?

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

    Gandhali、


    使用该范围应该是可以的。 只需使用示波器来监控 ADS1115上的 SDA 和 SCL 线路。 在 SCL 线路的第一个下降边沿触发、并看到以下字节输出。

    确保能够直接读取位。 我希望看到足够详细的信息、以便能够完全读取字节事务。


    吴约瑟

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

    您好、Joseph、

    我已附上我的屏幕截图、其中黄色波形显示 SCL、蓝色波形显示 SDA 线。 现在我在 N76E003的 I2STAT 寄存器中获得0x18、这表明从器件的启动条件和地址、即 ADS115、根据 N76E003的数据表是正确的。

    现在、当我发送数据时、N76E003的 I2STAT 寄存器中应该有0x28、但它不是这样回复。

    那么、发送数据是否存在任何问题、或者您能否根据上述线程中提到的规范为数据建议我的命令。

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

    Gandhali、


    很抱歉、我以为我在周五对此做出了回应、但我必须在浏览器的回复中将其丢失。

    首先、我希望看到更多的事务。 写入和读取器件需要4或5个字节、我基本上可以看到1个字节和另外两个字节的一部分、因此我不知道事务在做什么。 我会注意到、器件确实会 ACK 第9位、因此器件会响应 I2C 总线。

    在 I2C 事务中、您是否连续写入和读取器件? 我会为通信留出空间、以便在启动转换和从器件读回数据之间存在一定的延迟。 您发送命令的顺序是什么。 通常情况下、我会期望这样的结果:

     配置器件/开始转换-单次转换模式
     等待转换完成
     读取转换
     对新配置重复此步骤

    为了等待转换完成、时间取决于数据速率。 因为该器件具有内部振荡器、并且该振荡器有一些变化。 要完成转换、您需要为变体添加10%、为转换启动器件添加20us。 对于128SPS、数据周期为7.82ms。 等待时间增加10%和20us 将是8.62ms 的周期。



    吴约瑟

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

    您好、Joseph、

    很抱歉 Joseph、由于 Dewali 假期、我迟到了。

    在 I2C 通信中、我现在能够写入数据、但无法读取 ADC 转换结果。

    可能的原因是什么?

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

    您好、Joseph、

    我正在上传更新的代码、现在我能够在逻辑分析仪上捕获波形、但我仍然无法通过 ADC 获取 ADC 值。

    我已连接 AIN0和 GND 之间的输入。

    因此、请仔细查看我的代码以及逻辑分析仪的屏幕截图、并提出一些解决方案。

    #include 
    #include 
    #define EEPROM_SLA 0x90
    #defineEEPROM_WR 0
    #define EEPROM_RD 1
    #define SET_BIT3 0x08
    #define SET_BIT4 0x10
    #define P13_OpenDrain_ModeP1M1|=SET_BIT3;P1M2|=SET_BIT3
    #define P14_OpenDrain_ModeP1M1|=SET_BIT4;P1M2|=SET_BIT4
    
    unsigned int adval;
    unsigned int int adval1;#define
    
    I2C_ACK(
    #define I2C_ACK)
    void
    
    
    (#define I2C_START);#define I2C_RETO_START)
    
    
    void I2C_Master_Write (unsigned char value);
    unsigned int I2C_Master_read (unsigned short a);
    void I2C_Master_wait ();
    void delay (unsigned int t);
    void main ()
    {
    
    init_I2C ();
    //I2C_start ();
    ads_config ();
    
    while (1)
    {
    
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();_nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();_nop_();
    _nop_();
    _nop_();
    
    
    //delay (10);
    ads_read ();
    // I2C_stop ();
    //延迟(10);
    }
    }//-----------------
    
    用于显示的 I2C 通信-------------------------------------------------------
    void init_I2C (void)
    {
    P13_OpenDrain_Mode;
    P14_OpenDrain_Mode;
    SDA = 1;
    SCL = 1;
    I2CPX=0; //SCL= P1.3、SDA=P1.4
    I2CEN = 1;
    I2CLK=39;// 16MHz 时钟的400KBPS
    }
    //____________ ADS1115配置和数据块_________________________ //
    
    void I2C_start (void)
    {
    signed int t = timeout_count;
    
    STA = 1;
    SI = 0;
    //delay (10);
    
    _nop_();
    _nop_();
    _nop_();
    
    sta=0;
    
    }
    
    void I2C_stop (void)
    {
    signed int t = timeout_count;
    
    SI = 0;
    STO = 1;
    }
    void ADS_config()
    {
    EA=0;
    I2C_START();
    I2C_Master_WAIT ();
    I2DAT = EEPROM_SLA;
    I2C_Master_WAIT ();
    if (I2STAT = 0x18)
    {
    LED = 1;
    }
    STA=0;//添加并且它正常工作
    //delay (10);
    
    _nop_();
    _nop_();
    _nop_();_nop_();
    _nop_();_nop_();
    _nop_();
    I2DAT = 0x01;//命令到配置寄存器指向 config reg r 0x01
    I2C_Master_wait();
    //I2C_Master_Write (0x01);//命令到配置寄存器指向 config reg ykr 0x01
    _nop_();
    _nop_();
    _nop_();_nop_();
    
    
    //I2C_Master_Wait ();
    I2DAT = 0xC4;// PGA:_2.048V,输入:AIN0 & GND,连续转换模式0xC4
    I2C_Master_Wait ();
    _nop_();
    _nop_();
    _nop_();
    _nop_();_nop_();_nop_();;;;
    nop_();
    I2DAT = 0xE0;//860SPS,传统比较器,低电平有效,非锁存,在一个转换器0xE0
    I2C_Master_WAIT ();
    _nop_();
    _nop_();
    _nop_();
    _nop_();_nop_();
    _nop_();
    //I2C_stop ();
    
    }
    void I2C_Master_Write (unsigned char value)
    {
    I2DAT = value;//将数据写入 SSPBUF
    if (I2STAT = 0x28)
    {
    LED = 1;
    }
    
    void ADS_read ()
    {
    I2C_START();
    I2C_Master_WAIT
    
    ();I2C_Master_WAIT ();I2C_RATA/SLA = 90;I2C_Wait ()
    
    
    I2DAT = 0x00;//地址指针
    I2C_Master_WAIT ();
    
    
    
    I2DAT = EEPROM_SLA | EEPROM_RD;// 0x91
    I2C_Master_WAIT ();
    //地址
    
    
    
    
    指针 I2DAT = 0x00;//地址指针 I2C_Master_WAIT ();I2DAT = 0x01;//地址指针
    I2C_Master_0;
    
    
    STA=0;STA=0;STA=0
    
    
    
    
    I2C_Master_WAIT ();
    adval=I2DAT;
    
    I2C_Master_WAIT ();
    adval1=I2DAT;
    
    }
    void I2C_Master_WAIT ()
    {
    SI=0;
    while (!SI);
    {
    } //transmit is in progress
    }
    
    //********
    void delay (unsigned long t)
    {
    unsigned long i、j;
    for (j=0)<t;j++) for(i=0;i<7500;i++); }
    
    
    

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

    Gandhali



    感谢您提供的逻辑分析仪照片、我认为它们可以提供很大帮助。 因为我还有一个 Saleae 分析器、所以您可以保存.logicdata 文件吗? 如果不是太大、您应该能够将其发布回这里。

    看一下 I2C 交换、我认为您设置了读取错误。 它从90次写入开始、然后转换寄存器指针为00、最后两个字节为91次读取。



    吴约瑟

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

    Joseph、

    我们已使用 Arduino 中的代码在逻辑分析仪上观察到波形。

    在我的启动和停止条件中出现了问题。

    因此我的问题得到了解决。

    感谢您的支持。