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.

PCA9546A数据总线I2C连接问题

Other Parts Discussed in Thread: PCA9546A

使用C8051通过I2C总线连接PCA9546A芯片,通过查看芯片手册设置的寄存器地址,但是现在无论如何都不能通过i2c总线连接到PCA9546A芯片上,比如说写入读取数据,开启通道1的I2C总线,都不能完成

  • 有没有连接成功的I2C驱动可以读写PCA9546或者控制芯片上i2c通道工作的代码呢?
  • 您好,首先很抱歉没有I2C程序可以参考。

    对于您的问题,应该是时序不对,造成读写不成功。 参考Figure 7 和Figure8的时序,起始条件之后,是7bit PCA9546A的从机地址,这个地址由A2,A1,A0三个引脚来决定的,第八位是读写位,其次在收到ACK信号之后,就是PCA9546A的控制寄存器,控制寄存器的作用就是使能哪个通道。 所以需要按照这个时序来:

  • 你好,你说的这个从机地址是7bit的,比如说我A0-1 A1-0 A2-0,此时如果是写信号的话从机地址是 0xE2 如果是读信号的话PCA9546的从机地址是0XE3是吗?

  • 你好,你说的这个从机地址是7bit的,比如说我A0-1 A1-0 A2-0,此时如果是写信号的话从机地址是 0xE2 如果是读信号的话PCA9546的从机地址是0XE3是吗?
  • 你好,我A0-1 A1-0 A2-0 同时我参考的是个文档中的I2C数据总线的通信,所以比如说我现在如果想给芯片的地址写数据的话  代码如下,我这么设置可以吗?

    //A0--1  A1--0  A2--0
    #define PAC9546_W_ADDRES 0XE2
    #define PCA_REG0_EN		0xE1//这是参考的芯片手册上说的如果需要通道1使能的话这么设置
    /*******************************************************************
                     字节数据读取函数
    函数原型: void  Pcf_RecByte();
    功能:     从寄存器中读取数据
              此状态位进行操作.(不应答或非应答都使ack=0)
         	  发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
    ********************************************************************/
    unsigned char  Pcf_RecByte(void)           
    {
    	  uchar i;
        uchar dat = 0;
        I2C_SDA = 1;                   //使能内部上拉,准备读取数据,
        for (i=0; i<8; i++)        //8位计数器
        {
           dat <<= 1;
           I2C_SCL = 1;               //拉高时钟线
           ic_delay(20);            //延时
           dat |= I2C_SDA;            //读数据              
           I2C_SCL = 0;               //拉低时钟线
           ic_delay(20);            //延时
        }
        return dat;
    }
    
    /*******************************************************************
                        向有子地址器件发送多字节数据函数
    函数原型: int pca9546_w_register(unsigned char pca_w_address,unsigned char channel_mode,unsigned char w_data)
    功能:     通过I2C向PCA9546A芯片中指定的地址位写入数据
    参数:		pca_w_address:从机地址
    					channel_mode:从机寄存器地址 通过B0 B1 B2 B3设置决定
    					w_data:目标数据
              如果返回1表示操作成功,否则操作有误。
    注意:    使用前必须已结束总线。
    ********************************************************************/
    void pca9546_w_register(unsigned char pca_address,unsigned char REG_ADDRESS,unsigned char w_data)
    {
    	 Pca_Start_I2c();               //启动总线
       Pcf_SendByte(pca_address);      //发送器件地址
       Pcf_SendByte(REG_ADDRESS);     //发送器件子地址
       Pcf_SendByte(w_data);            //数据高字节s
    	 ic_delay(20);
       Pca_Stop_I2c();                //结束总线
    //   return(1);
    }
    
    /*******************************************************************
                        向有子地址器件发送多字节数据函数
    函数原型: int pca9546_r_register(unsigned char pca_r_address,unsigned char channel_mode,unsigned char r_data)
    功能:     通过I2C向PCA9546A芯片中指定的地址位写入数据
    参数:		pca_r_address:从机地址
    					channel_mode:从机寄存器地址 通过B0 B1 B2 B3设置决定
    					r_data:读取到的目标数据存放地址
              如果返回1表示操作成功,否则操作有误。
    注意:    使用前必须已结束总线。
    ********************************************************************/
    uchar pca9546_r_register(unsigned char pca_address,unsigned char REG_Address)
    {
    	uchar REG_data;
    	uchar i;
      uchar dat = 0;
    	Start_I2c();               //启动总线
      Pcf_SendByte(pca_address);  
      Pcf_SendByte(REG_Address);  
    	Pca_Start_I2c();     //启动总线
    	Pcf_SendByte(pca_address+1); 
      REG_data=Pcf_RecByte();
    	ic_delay(100);
      Pca_Stop_I2c();                //结束总线
       return REG_data;
    }

  • 您好,是的,A0-1 A1-0 A2-0的话,写地址为0XE2,读地址为0XE3.