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.

[参考译文] CCS/MSP430F249:读取 I2C 通信中的多个字节

Guru**** 2595770 points
Other Parts Discussed in Thread: MSP430F249

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/922689/ccs-msp430f249-read-multiple-bytes-in-i2c-communication

器件型号:MSP430F249

工具/软件:Code Composer Studio

你好

我尝试使用 MSP430的温度传感器(PCT2075)

为了获得温度、我从该传感器获得2个字节。  

howerver、我得到了两个相同的值。 我认为它是 MSByte。

我从该链接中编写了一个代码。

https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/589712?MSP430FR5969-Read-multiple-bytes-of-data-i2c-with-repeated-start-and-without-interrupts

我使用的是 MSP430F249。 因此、我从 该链接修改了一个代码。

void i2c_read_multi(uint8_t SLV_addr、uint8_t reg_addr、uint8_t l、uint8_t *arr)
{
uint8_t i;

while (UCB0STAT 和 UCBBUSY);

UCB0I2CSA = SLV_addr; //设置从地址

UCB0CTL1 |= UCTR | UCTXSTT; //发送器模式和启动条件。

while (UCB0CTL1 & UCTXSTT);

UCB0TXBUF = reg_addr;

while (!(UCB0CTL1 & UCTXSTT));

UCB0CTL1 &=~UCTR; //接收器模式

UCB0CTL1 |= UCTXSTT; //起始条件

while (UCB0CTL1 & UCTXSTT); //确保已清除

(i = 0;i < l;i++){的启动

while (!(IFG2 & UCB0RXIFG));

if (i = l - 1){

UCB0CTL1 |= UCTXSTP; //停止条件

}

ARR[i]= UCB0RXBUF;

}

while (UCB0CTL1 & UCTXSTP);

} 

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

    > while(!(UCB0CTL1 & UCTXSTT));

    另一个线程在此处显示:

    > while(!(UCB0IFG & UCTXIFG0));

    查看 I2C 状态图[参考用户指南(SLAU144J)图17-12]我不确定如何通过之前的 UCTXSTT 测试、但我想我不会争辩说成功了。

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

    嘿、Jaeseo、

    您是否让 I2C 正常工作?  我还想指出的是、这里提供了几个 I2C 示例: https://dev.ti.com/tirex/explore/node?node=APbNbwzUDwYij82MW9a0-g__IOGqZri__LATEST

    谢谢、

    JD

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

    谢谢  

    我修改我的代码、如下所示

    void i2c_read_multi_2 (uint8_t SLV_addr、uint8_t reg_addr、uint8_t l、uint16_t * arr)
    {
    uint8_t i;
    uint8_t MSB;
    uint8_t lsb;
    uint16_t val16;
    
    while (UCB0STAT 和 UCBBUSY);
    
    //设置从器件地址
    UCB0I2CSA = SLV_addr;
    
    //发送器模式和启动条件。
    UCB0CTL1 |= UCTR | UCTXSTT;
    
    while (UCB0CTL1 & UCTXSTT);
    
    UCB0TXBUF = REG_addr;
    
    while (IFG2 & UCB0TXIFG = 0);
    
    //接收器模式
    UCB0CTL1 &=~UCTR;
    
    //起始条件
    UCB0CTL1 |= UCTXSTT;
    
    //确保已清除启动
    while (UCB0CTL1 & UCTXSTT);
    
    对于(i = 0;i < l;i++){
    while (!(IFG2 & UCB0RXIFG));
    MSB = UCB0RXBUF;
    
    // while (!(IFG2 & UCB0RXIFG));
    
    //停止条件
    如果(i = l - 1){
    UCB0CTL1 |= UCTXSTP;
    }
    
    LSB = UCB0RXBUF;
    
    val16 = MSB;
    val16 <<= 8;
    val16 |= lsb;
    
    
    }
    
    while (UCB0CTL1 & UCTXSTP);
    } 

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

    >        while(IFG2 & UCB0TXIFG == 0);

    这(显然)现在不会给您带来麻烦、但最终会给您带来麻烦。 尝试:

    >        while((IFG2 & UCB0TXIFG) == 0);