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.

[参考译文] TCA9548A:I2C错误:从属地址nack

Guru**** 2394875 points
Other Parts Discussed in Thread: TCA9548A

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/605284/tca9548a-i2c-error-slave-address-nack

部件号:TCA9548A

是否有其他人在使用TCA9548A I2C多路复用器连接从属设备时遇到问题? 当我直接从微控制器连接到我正在使用的AD7746传感器时,我的代码工作正常,但如果我使用多路复用器,我会收到"I2C Error 2"(I2C错误2)错误。 我的代码和示例输出如下:

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
示例输出
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

I2C错误:2-地址接收nack
0

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
代码
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

#include <i2c_T3.h>

void setup(){
 //在此处输入您的设置代码,以便运行一次:
 Wire.begin(I2C_MASTER,0x00,I2C_PINS_18_19,I2C_Pullup _EXT,10万);
 Serial.begin(9600);
 MUX_SELECT(7);//在i2c多路复用器上选择通道
 Wire.beginTransmission(0x48);//准备i2c到ad7746设备的传输
 wire.write (0x0A);//选择要读取的配置寄存器
 wire.endTransmission (I2C_NOSTOP);//发送停止条件将重置ad7746上的地址指针,因此不要这样做
 IF (Wire.getError()!= 0)//检查是否有i2c错误
 {
   Switch(Wire.getError()){
     案例1:
       serial.println ("I2C错误:1 --数据太长");
       中断;
     案例2:
       serial.println ("I2C错误:2 --地址接收nack");
       中断;
     案例3:
       serial.println ("I2C错误;3 --数据接收nack");
       中断;
     案例4:
       serial.println ("I2C错误:4 --其他错误");
       中断;
   }
 }
 wire.requestFrom (0x48,1,I2C_NOSTOP);
 UINT8_t数据;
 数据= Wire.readByte();
 serial.println (数据,bin);
 MUX_DESelect ();
 
}

void loop(){
 //将主代码放在此处,重复运行:

}

void mix_select (uint8_t i){
 如果(i > 7)返回;
 
 Wire.beginTransmission(0x70);
 wire.write (1 << i);
// 上一行使用"位移"。实际上,我们将1乘以2^I,然后使用该值选择多路复用器上的输入
// 例如,I<0选择sda0和scl0等
 wire.endTransmission (I2C_STOP);  
}

void mix_Deselect (){
 Wire.beginTransmission(0x70);
 wire.write (B0万);
 wire.endTransmission (I2C_STOP);
}

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

    就像您最近的另一个问题一样,我认为查看交换机两端的实际I2C波形是很有用的。 这有助于检查您的代码是否在执行您所期望的操作,还有助于诊断交换机可能引起的任何"模拟"问题(电压电平不兼容,定时问题等)。 您是否能够使用示波器探测I2C线路?

    此致,
    最大