如何利用IIC扩展芯片(如tca9548)读写opt3001?

Other Parts Discussed in Thread: OPT3001

我最近购买了TI的TCA9548,OPT3001两个芯片,由arduino mega2560控制,目前不知道如何通过tca9548来配置和读取opt3001,我配置顺序如下:

发送tca9548地址:1110 000(A2-A0都为0),发送通道号:0x01,(第0通道);

接着就直接发送opt3001的配置寄存器地址:0x01,再发送配置数据0xc400.

但是这样不成功,调试发现没有写入到opt3001,不知道两块芯片写程序时如何连接,请问有谁用过tca9548或类似的IIC扩展吗?

另:单独使用opt3001没问题,能正常读写。

求帮忙解答,谢谢!

  • 在对TCA9548选择完通道之后,重新发送一个起始条件,再发送OPT3001的地址和数据。不要直接在后面继续写。

    帖子同

    http://www.deyisupport.com/question_answer/analog/interface_and_clocks/f/59/t/133894.aspx

  • 好的,谢谢!

  • 你好,请问可以分享一下arduino的代码么,我现在搞不懂

  • 好像找不到了,我记得是先配置下tca,然后按正常的顺序读取传感器就好,等于你原来读取单个传感器的程序,在配置传感器前加入一段配置tca(选择tca通道的代码)就行了

  • //STM32F103RC ADXL345 ADXL346

    //CH1============================================

    GS_IIC_Start();
    GS_IIC_Send_Byte(0XE0);//W
    GS_IIC_Wait_Ack();
    GS_IIC_Send_Byte(0X02);//CH1
    GS_IIC_Wait_Ack();
    GS_IIC_Stop();
    delay_ms(200);

    // GS_IIC_Start();
    // GS_IIC_Send_Byte(0XE1);
    // GS_IIC_Wait_Ack();
    // BYTE=GS_IIC_Read_Byte(0);//NACK
    // GS_IIC_Stop();
    // printf("RX=0X%02X\r\n",BYTE);
    // delay_ms(200);

    GS_IIC_Start();
    GS_IIC_Send_Byte(0XA6);//W ADXL
    GS_IIC_Wait_Ack();
    GS_IIC_Send_Byte(0X00);//REG_Address
    GS_IIC_Wait_Ack();

    GS_IIC_Start();
    GS_IIC_Send_Byte(0XA7);//R ADXL
    GS_IIC_Wait_Ack();
    BYTE=GS_IIC_Read_Byte(0);
    printf("ADXL=0X%02X\r\n",BYTE);
    GS_IIC_Stop();
    delay_ms(2000);


    ///CH2===============================================
    GS_IIC_Start();
    GS_IIC_Send_Byte(0XE0);//W
    GS_IIC_Wait_Ack();
    GS_IIC_Send_Byte(0X04);//CH3
    GS_IIC_Wait_Ack();
    GS_IIC_Stop();
    delay_ms(200);

    // GS_IIC_Start();
    // GS_IIC_Send_Byte(0XE1);
    // GS_IIC_Wait_Ack();
    // BYTE=GS_IIC_Read_Byte(0);//NACK
    // GS_IIC_Stop();
    // printf("RX=0X%02X\r\n",BYTE);
    // delay_ms(200);

    GS_IIC_Start();
    GS_IIC_Send_Byte(0XA6);//W ADXL
    GS_IIC_Wait_Ack();
    GS_IIC_Send_Byte(0X00);//REG_Address
    GS_IIC_Wait_Ack();

    GS_IIC_Start();
    GS_IIC_Send_Byte(0XA7);//R ADXL
    GS_IIC_Wait_Ack();
    BYTE=GS_IIC_Read_Byte(0);
    printf("ADXL346=0X%02X\r\n",BYTE);
    GS_IIC_Stop();
    delay_ms(200);