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:从器件在 i2c 中不响应

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/568765/ccs-slave-not-responding-in-i2c

工具/软件:Code Composer Studio

您好!


我正在使用 I2C 通信将 MAX30100 (脉动式血氧计传感器)与 MSP430连接。 我正在传输器件 ID 地址、但无法读取其值。 它在接收缓冲器中被存根。 当我们启动 I2C 条件时、NACKIFG 总是变为1。

#pragma vector = USCIAB0TX_vector
_interrupt void USCIAB0TX_ISR (void)

 if (rx = 1){                             //主机接收?
     PRxData[0]= UCB0RXBUF;                      //获取 RX 数据
     temp++;
     _BIC_SR_REGISTER_ON_EXIT (CPUOFF);       //退出 LPM0
    // UCB0CTL1 |= UCTXSTP;                   // I2C 停止条件
   // rx-;
               IFG2 &=~UCB0RXIFG;
 }

 else{                                    //主机发送
     if (TXByteCtr)                           //检查 TX 字节计数器
       {

         UCB0TXBUF = 0xFF;                    //加载 寄存器0xFF 的 TX 缓冲地址
         TXByteCtr -;                           //减量 TX 字节计数器
         标记----;
         UCB0CTL1 |= UCTXSTP;                   // I2C 停止条件
                   IFG2 &=~UCB0TXIFG;                    //清除 USCI_B0 TX 内部标志
                   _DELAY_CYCLES (112505);
                   _BIC_SR_REGISTER_ON_EXIT (CPUOFF);
       }

 }


void init_I2C (void){
     UCB0CTL1 |= UCSWRST;                     //启用 SW 复位
     UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;    // I2C 主器件、同步模式
     UCB0CTL1 = UCSSEL_2 + UCSWRST;           //使用 SMCLK、保持软件复位
     UCB0BR0 = 12;                            // fSCL = SMCLK/12 =~100kHz
     UCB0BR1 = 0;
     UCB0I2CSA = itgAddress;                        //从器件地址为069h
     UCB0CTL1 &=~UCSWRST;                    //清除 SW 复位,恢复运行
     IE2 |= UCB0RXIE + UCB0TXIE;              //启用 RX 和 TX 中断


void transmit (void){
   while (UCB0CTL1 & UCTXSTP);            //确保发送了 STOP 条件
   UCB0CTL1 |= UCTR + UCTXSTT;            // I2C TX、启动条件
   UCB0STAT &=~UCNACKIFG;
   _bis_SR_register (CPUOFF + GIE);       //输入 LPM0、带中断

void receive (void){
       while (UCB0CTL1 & UCTXSTP);            //确保发送了 STOP 条件
       UCB0CTL1 &=~UCTR;                    //清除 UCTR
       UCB0CTL1 |= UCTXSTT;                   // I2C 启动条件
       UCB0STAT &=~UCNACKIFG;
       while (UCB0CTL1 & UCTXSTT);            //起始条件是否发送?
       UCB0CTL1 |= UCTXSTP;                   // I2C 停止条件
       _bis_SR_register (CPUOFF + GIE);       //输入 LPM0、带中断
}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}}-->    >在这里停止

有人能告诉我们问题是什么以及如何解决。 提前感谢。

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

    在尝试启动通信序列时、您收到 NACK 的原因有多种:

    1:SDA 和 SCL 线路不会通过适当的电阻值(建议使用4.7kOhm)上拉至 Vcc、也不会连接至正确的 MSP 引脚。
    2.从地址不正确(根据 MAX30100数据表为57h)。
    3. PxSEL 寄存器未针对 I2C 引脚功能正确初始化(未在上面的代码摘录中显示)。
    USCI 寄存器未正确初始化(请参考 TI 提供的示例)。
    5.从器件未正确供电(MAX30100数据表中的1.7V 至2.0V)或 I2C 线路电压电平不匹配。

    请遵循这些建议、提供 MSP 器件衍生产品以及问题的示波器或逻辑分析仪屏幕截图。 e2e.ti.com/.../msp-i2c-getting-started-guide

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

    感谢您的回复。
    我们尝试使用4.7KOhm 上拉和1k 以上的电阻器、但我们已经了解了传输函数本身。因此我们使用1k 上拉、小于该值、那么它将在接收函数之后占用、如前所述。
    2.我们只提供了57h 作为地址
    3.P1SEL |= BIT6 + BIT7; //将 I2C 引脚分配给 USCI_B0
    P1SEL2|= BIT6 + BIT7; //将 I2C 引脚分配给 USCI_B0
    4. WDTCTL = WDTPW + WDTHOLD;
    UCB0CTL1 |= UCSWRST; //启用 SW 复位
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式
    UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位
    UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
    UCB0BR1 = 0;
    UCB0I2CSA = itgAddress; //从地址为069h
    UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作
    IE2 |= UCB0RXIE + UCB0TXIE;
    如数据表1.8至3.3V 中所述、我们提供了3.3V 电压。

    实际上、我们能够连接另一个传感器(bmp180)、我们按照相同的步骤操作。但是、在连接 max30100时、我们无法接收任何内容(与 bmp180相比、观察到的 NACKIFG 标志未被清除)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Swathi、

    由于您已经证明 USCI 初始化是正确的(通过之前与 bmp180的通信)并且从器件已通电、并且有时会做出响应(验证从器件地址)、 您应该特别关注硬件线路并使用示波器或逻辑分析仪来验证您的接收序列是否符合 MSP430和 MAX30100数据表的预期。

    此致、
    Ryan