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.

[参考译文] TCA9543A:TCA9543A:控制器件的软件代码 tca9543a

Guru**** 2387830 points
Other Parts Discussed in Thread: TCA9543A, TMP102
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1470726/tca9543a-tca9543a-software-code-controlling-the-device-tca9543a

器件型号:TCA9543A
主题中讨论的其他器件: TMP102

工具与软件:

你(们)好

在我的应用中、我使用的是 I2C 扩展器 TCA9543A 通过 I2C 通道与 MSP430FR-2475 MCU 连接、温度传感器也通过 TCA9543A 另一侧的 I2C 连接。 MSP430-FR-2475与 I2C 扩展器相连、该扩展器通过 I2C 与温度传感器进一步相连。 温度将数据提供给 I2C 扩展器、而 I2C 扩展器将该温度数据提供给 MCU。 我正在为此寻找示例代码、想要了解如何使用这个 TCA9543A 控制寄存器来读取温度。  

您能指导一下吗?

下图显示了我的连接、

   

此致、

Nitish

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

    您为何要使用 TCA9543A? 另一个通道是否连接了任何设备?

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

    你(们)好

    我们将使用相同的从器件 TMP102传感器、在硬件中、我们具有 I2C 通道限制以适应其他 I2C 外设。

    谢谢!

    Nitish

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

    我们有多个相同从地址器件、它们需要连接在 MSP430的同一 I2C 端口上。 由于只有2个端口、我们添加了该扩展器 IC 以将温度传感器和 EEPROM IC 连接到每个 I2C 端口、如下所示。  

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

    TCA9543A 在 SDA/SCL 和已启用的通道之间建立直接连接。

    要访问某个 TMP102器件、首先将正确的值写入  TCA9543A 的控制寄存器(1或2)、然后直接访问 TMP102。

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

    您好、Clemens:

    您可以参考如何配置该控制寄存器以进行写入、读取和中断检测、将会很有帮助。

    谢谢!

    Nitish

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

    关于如何配置控制寄存器以对 TMP102进行写入或读取访问、请参阅我的上一个答案。

    要检测中断、请将 TC9543A 的/INT 输出连接到 MCU 的 GPIO。 当 MCU 收到中断信号时、读取配置寄存器以检测哪个从器件的中断有效。

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

    你(们)好

    在不使用中断的情况下、我还可以读取/写入 TMP102、对吧? 或者需要中断来读取实际数据?

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

    TCA9543A 只通过(并组合)中断信号;它实际上并不关心它们的意义。

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

    你(们)好

    我在数据表中找不到控制寄存器的任何特定地址吗?

    I2C 驱动程序代码如下所示。 您能否提供建议、假设扩展器地址为0xE0、如何在以下函数参数中传递我的控制寄存器值?

    /**
    *@简介
    * I2C0的初始化
    *
    *@详细信息
    * I2C0的初始化
    *
    *@param[in]无
    *
    *@返回无
    */
    void initI2C (void)

    UCB0CTLW0 = UCSWRST;//启用软件复位
    UCB0CTLW0 |= UCMODE_3 | UCMST | UCSSEL__SMCLK | UCSYNC;// I2C 主模式、SMCLK

    #if I2C_SPEED_400KHZ
    UCB0BRW = 40;// fSCL = SMCLK/40 =~400kHz
    #else
    UCB0BRW = 160;// fSCL = SMCLK/160 =~100kHz
    #endif
    UCB0I2CSA = SLAVE_ADDR_TEMP_I2C0;//从器件地址
    UCB0CTLW0 &=~μ s UCSWRST;//清除软件复位、恢复操作
    UCB0IE |= UCNACKIE;
    }

    /*对于具有 dev_addr 的从器件、读取 I2C0的从器件 reg_addr 中指定的数据。
    *接收到的数据在 ReceiveBuffer 中可用
    *
    * dev_addr:从设备地址。
    *例子: SLAVE_ADDR
    * reg_addr :要发送到从器件的寄存器或命令。
    *示例: cmd_type_0_slave
    *计数:要读取的数据长度
    *示例: type_0_length
    *@返回:I2C 模式
    */
    I2C_Mode I2C_ADC (uint8_t dev_addr、uint8_t reg_addr、uint8_t Master_Read)

    delay(10);
    /*初始化状态机*/
    MasterMode = TX_REG_ADDRESS_MODE;
    TransmitRegAddr = reg_addr;
    RXByteCtr = count;
    TXByteCtr = 0;
    ReceiveIndex = 0;
    TransmitIndex = 0;

    /*初始化从机地址和中断*/
    UCB0I2CSA = dev_addr;
    UCB0IFG 并且=~(UCTXIFG + UCRXIFG);//清除任何挂起的中断
    UCB0IE &&~μ P UCRXIE;//禁用 RX 中断
    UCB0IE |= UCTXIE;//启用 TX 中断

    UCB0CTLW0 |= UCTR + UCTXSTT;// I2C TX、启动条件

    如果((DEV_addr == SLAVE_ADDR_PD)||(DEV_addr == SLAVE_ADDR_PD_PORT2)){

    ___ bis_SR_register (GIE);
    #if I2C_SPEED_400KHZ
    delay(5);
    #else
    delay(50);
    #endif

    其他{

    __bis_SR_register (LPM0_bits + GIE);

    }

    返回 MasterMode;
    }


    /*对于具有 dev_addr 的从器件、为 I2C0写入在* reg_data 中指定的数据。
    *
    * dev_addr:从设备地址。
    *例子: SLAVE_ADDR
    * reg_addr :要发送到从器件的寄存器或命令。
    *示例: cmd_type_0_master
    ** reg_data :要写入的缓冲区
    *示例: MasterType0
    *计数:* reg_data 的长度
    *示例: type_0_length
    *@返回:I2C 模式
    */
    I2C_Mode I2C_ADC Master_Write (uint8_t dev_addr、uint8_t reg_addr、uint8_t * reg_data、uint8_t count)

    delay(10);
    /*初始化状态机*/
    MasterMode = TX_REG_ADDRESS_MODE;
    TransmitRegAddr = reg_addr;

    //将寄存器数据复制到 TransmitBuffer
    #if enable_CopyArray_API
    CopyArray (reg_data、TransmitBuffer、count);
    #else
    memcpy (TransmitBuffer、reg_data、count);
    #endif // enable_CopyArray_API

    TXByteCtr = count;
    RXByteCtr = 0;
    ReceiveIndex = 0;
    TransmitIndex = 0;

    /*初始化从机地址和中断*/
    UCB0I2CSA = dev_addr;
    UCB0IFG 并且=~(UCTXIFG + UCRXIFG);//清除任何挂起的中断
    UCB0IE &&~μ P UCRXIE;//禁用 RX 中断
    UCB0IE |= UCTXIE;//启用 TX 中断

    UCB0CTLW0 |= UCTR + UCTXSTT;// I2C TX、启动条件

    如果((DEV_addr == SLAVE_ADDR_PD)||(DEV_addr == SLAVE_ADDR_PD_PORT2)){

    ___ bis_SR_register (GIE);
    #if I2C_SPEED_400KHZ
    delay(5);
    #else
    delay(50);
    #endif

    其他{

    __bis_SR_register (LPM0_bits + GIE);

    }

    返回 MasterMode;
    }

    //
    // I2C Interrupt (I2C 中断
    //

    #if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
    #pragma VECTOR = USCI_B0_VECTOR
    _interrupt void USCI_B0_ISR (void)
    #elif defined (_GNUC__)
    void __attribute__(((interrupt (USCI_B0_vector))) USCI_B0_ISR (void)
    #else
    错误编译器不受支持!
    #endif

    必须从 UCB0RXBUF 读取
    uint8_t rx_val = 0;
    开关(__EVEN_IN_RANGE (UCB0IV、USCI_I2C_UCBIT9IFG))

    case USCI_NONE:break;//向量0:无中断
    case USCI_I2C_UCALIFG:break;// Vector 2:ALIFG
    case USCI_I2C_UCNACKIFG:// Vector 4:NACKIFG

    UCB0IE &=~UCRXIE;
    MasterMode = NACK_MODE;
    FIRST_BYTE_RECEIVED = false;
    __BIC_SR_REGISTER_ON_EXIT (CPUOFF);
    休息;

    case USCI_I2C_UCSTTIFG:break;// Vector 6:STTIFG
    case USCI_I2C_UCSTPIFG:break;// Vector 8:STPIFG
    case USCI_I2C_UCRXIFG3:break;// Vector 10:RXIFG3
    case USCI_I2C_UCTXIFG3:break;// Vector 12:TXIFG3
    case USCI_I2C_UCRXIFG2:break;// Vector 14:RXIFG2
    case USCI_I2C_UCTXIFG2:break;// Vector 16:TXIFG2
    case USCI_I2C_UCRXIFG1:break;// Vector 18:RXIFG1
    case USCI_I2C_UCTXIFG1:break;// Vector 20:TXIFG1
    实例 USCI_I2C_UCRXIFG0://矢量22:RXIFG0
    Rx_val = UCB0RXBUF;
    #if 1.
    if ( PD_Communication == true ){
    PD_Communication = false;
    RXByteCtr = rx_val;/*在读取操作中、接收到的第一个字节将为长度*/
    }
    #endif
    if ( RXByteCtr ){
    ReceiveBuffer[ReceiveIndex++]= Rx_val;
    RXByteCtr --;
    }

    if ( RXByteCtr =1 ){
    UCB0CTLW0 |= UCTXSTP;
    } else if ( RXByteCtr == 0 ){
    UCB0IE &=~UCRXIE;
    MasterMode = IDLE_MODE;
    FIRST_BYTE_RECEIVED = false;
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
    }
    休息;

    case USCI_I2C_UCTXIFG0:// Vector 24:TXIFG0
    开关(MasterMode){
    实例 TX_REG_ADDRESS_MODE:
    UCB0TXBUF = TransmitRegAddr;
    IF (RXByteCtr)
    MasterMode = SWITCH_TO_RX_MODE;//现在需要开始接收
    设计
    MasterMode = TX_DATA_MODE;//继续传输发送缓冲器中的数据
    休息;

    案例 SWITCH_TO_RX_MODE:
    UCB0IE |= UCRXIE;//启用 RX 中断
    UCB0IE &&~μ P UCTXIE;//禁用 TX 中断
    UCB0CTLW0并且=~Ω UCTR;//切换到接收器
    MasterMode = RX_DATA_MODE;//状态状态是接收数据
    UCB0CTLW0 |= UCTXSTT;//发送重复启动
    if ( RXByteCtr =1 ){

    因为这是 N-1字节,所以必须发送 STOP
    while ((UCB0CTLW0和 UCTXSTT));
    UCB0CTLW0 |= UCTXSTP;//发送停止条件
    FIRST_BYTE_RECEIVED = false;
    }
    休息;

    实例 TX_DATA_MODE:
    if (TXByteCtr){
    UCB0TXBUF = TransmitBuffer[TransmitIndex++];
    TXByteCtr --;
    其他{
    //完成传输
    UCB0CTLW0 |= UCTXSTP;//发送停止条件
    MasterMode = IDLE_MODE;
    UCB0IE &&~μ P UCTXIE;//禁用 TX 中断
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
    }
    休息;

    默认值:
    ___ no_operation();
    休息;
    }
    休息;
    默认值:中断;
    }
    }

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

    大多数 μ I²C 器件都具有寄存器地址。 要向寄存器写入数据、请写入一个包含寄存器编号的字节、然后写入一个包含值的字节;若要读取寄存器、请写入一个包含寄存器编号的字节、然后读取包含值的字节。

    TCA9543A 只有一个没有地址的寄存器。  要向寄存器写入值、只需写入一个字节;要读取寄存器、只需读取带值的字节。

    您必须更改状态机、使其可以在不从 TX_REG_ADDRESS_MODE 开始的情况下正常工作。

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

    你(们)好

    您能否提供不使用 TX_REG_ADDRESS_MODE 的这些功能、并轻松使用此 TCA9543A。 所有其他 I2C 外设都具有其寄存器地址、如果更改了该状态机、这可能会影响其他功能。

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

    您好!

    您能否建议以下修改后的 I2C 驱动器是否可与此扩展器配合使用?

    void I2C_Write (uint8_t slaveAddress、uint8_t * data、uint8_t length)

    txBuffer =数据;
    txLength =长度;
    txIndex = 0;

    而(UCB1CTLW0 & UCTXSTP);//确保停止条件被清除
    UCB1I2CSA = slaveAddress;//设置从器件地址
    UCB1CTLW0 |= UCTR | UCTXSTT;//发送模式、启动条件
    }

    // EUSCI_B1的 I2C TX ISR
    #pragma vector = EUSCI_B1_VECTOR
    _interrupt void EUSCI_B1_ISR (void)

    开关(__EVEN_IN_RANGE (UCB1IV、0x1E))

    情况0x16:// UCTXIFG0 (发送缓冲器为空)
    if (txIndex < txLength){
    UCB1TXBUF = txBuffer[txIndex++];//发送下一个字节
    其他{
    UCB1CTLW0 |= UCTXSTP;//发送停止条件
    UCB1IFG 并且=~UCTXIFG0;//清除标志
    }
    休息;
    情况0x12:// UCSTPIFG (接收到停止条件)
    UCB1IFG 并且=~UCSTPIFG;//清除标志
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出低功耗模式
    休息;
    }
    }

    void I2C_read (uint8_t slaveAddress、uint8_t *缓冲区、uint8_t 长度)

    rxBuffer =缓冲区;
    rxLength =长度;
    rxIndex = 0;

    而(UCB1CTLW0 & UCTXSTP);//确保停止条件被清除
    UCB1I2CSA = slaveAddress;//设置从器件地址
    UCB1CTLW0 &=~μ s UCTR;//接收器模式
    UCB1CTLW0 |= UCTXSTT;//发送启动条件
    }

    // EUSCI_B1的 I2C RX ISR
    #pragma vector = EUSCI_B1_VECTOR
    _interrupt void EUSCI_B1_ISR (void)

    开关(__EVEN_IN_RANGE (UCB1IV、0x1E))

    案例0x18:// UCRXIFG0 (接收缓冲区已满)
    if (rxIndex < rxLength - 1){
    rxBuffer[rxIndex++]= UCB1RXBUF;//存储接收到的字节
    其他{
    UCB1CTLW0 |= UCTXSTP;//发送停止条件
    rxBuffer[rxIndex++]= UCB1RXBUF;//存储最后一个字节
    UCB1IFG 并且=~UCRXIFG0;//清除标志
    }
    休息;
    情况0x12:// UCSTPIFG (接收到停止条件)
    UCB1IFG 并且=~UCSTPIFG;//清除标志
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出低功耗模式
    休息;
    }
    }

    谢谢!

    Nitish

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

    尊敬的 Nitish:

    我认为克莱门斯可能会评论你的代码很快,但就我自己来说 ,我不是一个专家编写代码 i2c 和我不能给你的代码建议

    但是、对于您的原始问题、我找到了一些有用的资源供您查看、因为您的原始问题是的示例代码  TCA9543A

    https://e2e.ti.com/support/interface-group/interface/f/interface-forum/650316/tca9543a-software-code-controlling-the-device-tca9543a

    也许这个线可以帮助你的性高潮问题,但请让我和克莱门斯知道

    此致、

    Kameron

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

    你(们)好

    您能否建议如何将以下两个 I2C ISR 代码合并为一个代码? 因为我找到了一个 ISR 之间的比较 TX_REG_ADDRESS_MODE 第二个 ( TX_REG_ADDRESS_MODE) .  

     TX_REG_ADDRESS_MODE 的以下函数:

    #pragma vector = USCI_B1_VECTOR
    _interrupt void USCI_B1_ISR (void)

    必须从 UCB1RXBUF 读取
    uint8_t rx_val = 0;
    switch (__even_in_range (UCB1IV、USCI_I2C_UCBIT9IFG)){

    case USCI_NONE:break;//向量0:无中断
    case USCI_I2C_UCALIFG:break;// Vector 2:ALIFG
    case USCI_I2C_UCNACKIFG:// Vector 4:NACKIFG

    UCB1IE &=~UCRXIE;
    MasterMode = NACK_MODE;
    __BIC_SR_REGISTER_ON_EXIT (CPUOFF);
    休息;

    case USCI_I2C_UCSTTIFG:break;// Vector 6:STTIFG
    case USCI_I2C_UCSTPIFG:break;// Vector 8:STPIFG
    case USCI_I2C_UCRXIFG3:break;// Vector 10:RXIFG3
    case USCI_I2C_UCTXIFG3:break;// Vector 12:TXIFG3
    case USCI_I2C_UCRXIFG2:break;// Vector 14:RXIFG2
    case USCI_I2C_UCTXIFG2:break;// Vector 16:TXIFG2
    case USCI_I2C_UCRXIFG1:break;// Vector 18:RXIFG1
    case USCI_I2C_UCTXIFG1:break;// Vector 20:TXIFG1
    实例 USCI_I2C_UCRXIFG0://矢量22:RXIFG0
    Rx_val = UCB1RXBUF;
    #if 1.
    if ( PD_Communication == true ){
    PD_Communication = false;
    RXByteCtr = rx_val;/*在读取操作中、接收到的第一个字节将为长度*/
    }
    #endif
    if ( RXByteCtr ){

    ReceiveBuffer[ReceiveIndex++]= Rx_val;
    RXByteCtr --;
    }

    if ( RXByteCtr =1 ){

    UCB1CTLW0 |= UCTXSTP;
    } else if ( RXByteCtr == 0 ){
    UCB1IE &=~UCRXIE;
    MasterMode = IDLE_MODE;
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
    }
    休息;
    case USCI_I2C_UCTXIFG0:// Vector 24:TXIFG0
    开关(MasterMode){

    实例 TX_REG_ADDRESS_MODE:
    UCB1TXBUF = TransmitRegAddr;
    IF (RXByteCtr)
    MasterMode = SWITCH_TO_RX_MODE;//现在需要开始接收
    设计
    MasterMode = TX_DATA_MODE;//继续传输发送缓冲器中的数据
    休息;

    案例 SWITCH_TO_RX_MODE:
    UCB1IE |= UCRXIE;//启用 RX 中断
    UCB1IE &&~μ P UCTXIE;//禁用 TX 中断
    UCB1CTLW0并且=~Ω UCTR;//切换到接收器
    MasterMode = RX_DATA_MODE;//状态状态是接收数据
    UCB1CTLW0 |= UCTXSTT;//发送重复启动
    if ( RXByteCtr =1 ){

    因为这是 N-1字节,所以必须发送 STOP
    while ((UCB1CTLW0和 UCTXSTT));
    UCB1CTLW0 |= UCTXSTP;//发送停止条件
    }
    休息;

    实例 TX_DATA_MODE:
    if ( TXByteCtr ){

    UCB1TXBUF = TransmitBuffer[TransmitIndex++];
    TXByteCtr --;
    其他{

    //完成传输
    UCB1CTLW0 |= UCTXSTP;//发送停止条件
    MasterMode = IDLE_MODE;
    UCB1IE &&~μ P UCTXIE;//禁用 TX 中断
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
    }
    休息;

    默认值:
    ___ no_operation();
    休息;
    }
    休息;
    默认值:中断;
    }
    }

    在下方不显示 TX_REG_ADDRESS_MODE:

    #pragma vector = EUSCI_B1_VECTOR
    _interrupt void EUSCI_B1_ISR (void)

    开关(__EVEN_IN_RANGE (UCB1IV、0x1E))

    情况0x16:// UCTXIFG0 (发送缓冲器为空)
    if (txIndex < txLength){
    UCB1TXBUF = txBuffer[txIndex++];//发送下一个字节
    其他{
    UCB1CTLW0 |= UCTXSTP;//发送停止条件
    UCB1IFG 并且=~UCTXIFG0;//清除标志
    }
    休息;
    情况0x12:// UCSTPIFG (接收到停止条件)
    UCB1IFG 并且=~UCSTPIFG;//清除标志
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出低功耗模式
    休息;
    }
    }

    谢谢!

    Nitish

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

    尊敬的 Nitish:

    我不是 i2c 驱动程序和它们的代码方面的专家、

    我还同意 Clemens 的意见、即更改状态机 时、无需从 TX_REG_ADDRESS_MODE 开始即可正常工作、这是我们的最佳解决方案。

    不过、我可以为 TCA9543A 提供原始帮助、如果您有任何其他有关该器件的问题、请特别告知我。

    此致、

    Kameron

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

    你(们)好

     在我们被困在这里的时候、Clemens 可以有机会查看一下这个代码状态机吗? 对此表示高度赞赏。

     

    谢谢!

    Nitish

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

    尊敬的 Nitish:

    我认为 Clemens 可能会研究这个问题、但也可以将这个线程内部迁移到 TI 团队、该团队对 MSP430及其内部状态机有更多了解、并且他们可能有助于查看您编写的软件。

    此致、

    Kameron

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

    将中断处理程序和其他函数保持不变。 以下功能应该可以正常工作(但尚未测试):

    /*
     * Writes one byte without writing a register number.
     */
    I2C_Mode I2C_Master_WriteDirect(uint8_t dev_addr, uint8_t data)
    {
    	delay(10);
    	/* Initialize state machine */
    	MasterMode = TX_DATA_MODE;
    	
    	TransmitBuffer[0] = data;
    	TXByteCtr = 1;
    	RXByteCtr = 0;
    	ReceiveIndex = 0;
    	TransmitIndex = 0;
    	
    	/* Initialize slave address and interrupts */
    	UCB0I2CSA = dev_addr;
    	UCB0IFG &= ~(UCTXIFG + UCRXIFG); // Clear any pending interrupts
    	UCB0IE &= ~UCRXIE; // Disable RX interrupt
    	UCB0IE |= UCTXIE; // Enable TX interrupt
    
    	UCB0CTLW0 |= UCTR + UCTXSTT; // I2C TX, start condition
    
    	__bis_SR_register(LPM0_bits + GIE);
    	
    	return MasterMode;
    }
    
    /*
     * Reads one byte without writing a register number.
     * The result is in ReceiveBuffer[0] if ReceiveIndex==1.
     */
    I2C_Mode I2C_Master_ReadDirect(uint8_t dev_addr)
    {
    	delay(10);
    	/* Initialize state machine */
    	MasterMode = RX_DATA_MODE;
    	RXByteCtr = 1;
    	TXByteCtr = 0;
    	ReceiveIndex = 0;
    	TransmitIndex = 0;
    
    	/* Initialize slave address and interrupts */
    	UCB0I2CSA = dev_addr;
    	UCB0IFG &= ~(UCTXIFG + UCRXIFG); // Clear any pending interrupts
    	UCB0IE |= UCRXIE; // Enable RX interrupt
    	UCB0IE &= ~UCTXIE; // Disable TX interrupt
    
    	UCB0CTLW0 &= ~UCTR; // I2C RX
    	UCB0CTLW0 |= UCTXSTT; // start condition
    
    	while((UCB0CTLW0 & UCTXSTT));
    	if (MasterMode != NACK_MODE)
    	{
    		//Must send stop since this is the last byte
    		UCB0CTLW0 |= UCTXSTP; // Send stop condition
    		first_byte_received = FALSE;
    
    		__bis_SR_register(LPM0_bits + GIE);
    	}
    
    	return MasterMode;
    }

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

    你(们)好

    感谢你的评分

    只是想确认以下读取 TMP102的正确顺序、

    I2C_4.54 Master_Write (扩展器地址、0x1); // 0x1 =通道选择值

    I2C_I2C Master_Read (扩展器地址);

    或者我是否应该遵循以下顺序、

    I2C_4.54 Master_Write (扩展器地址、0x1);

    Master_Read 4.0.1 (TMP102从器件地址、TEMP_READ_REG、2 * sizeof (uint8_t));

    Thnaks,

    Nitish

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

    您只能访问交换机本身来重新配置连接。 启用连接后、您可以直接访问该通道上的设备。 使用第二个序列。

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

    你(们)好

    我们正在使用以下驱动程序(您在上面共享了未测试的驱动程序)与 I2C 扩展器配合使用。 当我们在启用通道时检查 I2C 响应时、我们会从从器件 I2C 扩展器获得 NACK (无确认)。 您能否建议以下驱动程序是否存在任何问题?

    仅供确认、我们检查了 I2C 扩展器、该扩展器与 STM32 MCU EVK 的 TMP102温度传感器进一步连接、并提供正确的温度读数和正常工作。

    我们唯一停留在使用这些 MSP430驱动器方面的阶段。

    /*
    *写入一个字节而不写入寄存器编号。
    */
    I2C_Mode I2C_ADC Master_Write (uint8_t dev_addr、uint8_t 数据)

    delay(10);
    /*初始化状态机*/
    MasterMode = TX_DATA_MODE;

    TransmitBuffer[0]=数据;
    TXByteCtr = 1;
    RXByteCtr = 0;
    ReceiveIndex = 0;
    TransmitIndex = 0;

    /*初始化从机地址和中断*/
    UCB0I2CSA = dev_addr;
    UCB0IFG 并且=~(UCTXIFG + UCRXIFG);//清除任何挂起的中断
    UCB0IE &&~μ P UCRXIE;//禁用 RX 中断
    UCB0IE |= UCTXIE;//启用 TX 中断

    UCB0CTLW0 |= UCTR + UCTXSTT;// I2C TX、启动条件

    __bis_SR_register (LPM0_bits + GIE);

    返回 MasterMode;
    }

    /*
    *读取一个字节而不写入寄存器编号。
    *如果 ReceiveIndex=1、则结果位于 ReceiveBuffer[0]中。
    */
    I2C_Mode I2C_ADC Master_Read (uint8_t dev_addr)

    delay(10);
    /*初始化状态机*/
    MasterMode = RX_DATA_MODE;
    RXByteCtr = 1;
    TXByteCtr = 0;
    ReceiveIndex = 0;
    TransmitIndex = 0;

    /*初始化从机地址和中断*/
    UCB0I2CSA = dev_addr;
    UCB0IFG 并且=~(UCTXIFG + UCRXIFG);//清除任何挂起的中断
    UCB0IE |= UCRXIE;//启用 RX 中断
    UCB0IE &&~μ P UCTXIE;//禁用 TX 中断

    UCB0CTLW0并且=~μ F UCTR;// I2C RX
    UCB0CTLW0 |= UCTXSTT;//启动条件

    while ((UCB0CTLW0和 UCTXSTT));
    if (MasterMode!= nack_mode)

    //由于这是最后一个字节、因此必须发送 stop
    UCB0CTLW0 |= UCTXSTP;//发送停止条件
    FIRST_BYTE_RECEIVED = false;

    __bis_SR_register (LPM0_bits + GIE);
    }

    返回 MasterMode;
    }

    谢谢!

    Nitish

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

    我没有这样的 MSP430器件可供测试。

    使用示波器检查这些读取/写入访问是否正确。

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

    您好、Clemens:

    您上面建议的修改后的 I2C 驱动程序(未在 TX_REG_ADDRESS_MODE 中开始正在正常工作、现在可以视为经过测试。

    感谢您的支持!!!  

    此致、

    Nitish