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.

[参考译文] MSP430F2272:I2C 故障

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/564902/msp430f2272-trouble-with-i2c

器件型号:MSP430F2272

如标题所示。 我正在尝试让 I2C 在 MSP430F2272上工作、并且在脱离接地时遇到一些问题。 从本质上重新格式化的示例代码开始、我只是尝试在主模式下发送一条消息。 微控制器正在发送某些数据、但数据远未达到 I2C 标准(请参阅屏幕截图)。 我怀疑我缺少一些简单的东西。 请提供任何帮助。

谢谢!


Jason

void Initialize( void )(空)


   WDTCTL = WDTPW + WDTHOLD;                //停止看门狗计时器
   
   P3SEL |= 0x06;                           //将 I2C 引脚分配给 USCI_B0
   UCB0CTL1 |= UCSWRST;                     //启用 SW 复位
   UCB0CTL0 = UCMST+UCMODE_3+UCSYNC;        // I2C 主器件、同步模式
   UCB0CTL1 = UCSSEL_2+UCSWRST;             //使用 SMCLK、保持软件复位
   UCB0BR0 = 12;                            // fSCL = SMCLK/12 =~100kHz
   UCB0BR1 = 0;
   


}//初始化



void SetSector (void)(空)


   UCB0I2CSA = 0x70;                 //将从器件地址设置为多路复用器    
   UCB0CTL1 &=~UCSWRST;                  //清除 SW 复位,恢复运行
   IE2 |= UCB0TXIE;                       //启用 TX 中断                   //我们是否需要这种情况发送????
   
   UCB0CTL1 |= UCTXSTT;                 // I2C TX、启动条件                //3.
   UCB0TXBUF = 0x01;                //写入 DAC 控制字节
   UCB0CTL1 |= UCTXSTP;                   // I2C 停止条件
   IFG2 &=~UCB0TXIFG;                    //清除 USCI_B0 TX 内部标志
   UCB0CTL1 |= UCSWRST;                   //启用 SW 复位


}//SetSector

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

    您好 Jason、

    您在这里似乎既不使用中断驱动型 I2C、也不应用正确的轮询 I2C 方法。

    如果您不想使用带有 ISR 的中断驱动方法来发送字节、则无需启用 TX 中断或清除标志。

    对于 I2C、如果您想使用轮询方法、为了确保在发送数据字节后正确发送停止条件、您应该轮询 TX 标志并等待该标志被触发、然后再发出 I2C 停止条件:

    while (!(IFG2 & UCB0TXIFG));
    UCB0CTL1 |= UCTXSTP;// I2C 停止条件

    您似乎也缺少 UCTR 标志来启动传输、除了 UCTXSTT 标志之外、还应使用该标志:

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

    查看这些修复是否有助于解决您的问题。

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

    您好、Ralph、

    这让我有了一个很好的开始字节(还有一个激动人心的客户,谢谢!) 但数据字节似乎仍在损坏。 我尝试过:

    -更早加载 Tx 缓冲器

    -在加载 Tx 缓冲器之前添加 Tx 标志延迟(请参阅注释掉的行)

    最新代码:



    void Initialize( void )(空)


       int StartupLoop = 0;


       WDTCTL = WDTPW + WDTHOLD;                //停止看门狗计时器
       
       for (StartupLoop = 10000;StartupLoop > 1;StartupLoop -)
       {
          _nop();
       }
       
       P3DIR |= 0x80;                      //set ~COMM_RESET 作为输出
       P3OUT |= P3_COMM_RESET_N;
       
       P3SEL |= 0x06;                           //将 I2C 引脚分配给 USCI_B0
       UCB0CTL1 |= UCSWRST;                     //启用 SW 复位
       UCB0CTL0 = UCMST+UCMODE_3+UCSYNC;        // I2C 主器件、同步模式
       UCB0CTL1 = UCSSEL_2+UCSWRST;             //使用 SMCLK、保持软件复位
       UCB0BR0 = 12;                            // fSCL = SMCLK/12 =~100kHz
       UCB0BR1 = 0;





    void SetSector (void)(空)


       UCB0I2CSA = 0x70;                    //将从器件地址设置为多路复用器    
       UCB0CTL1 &=~UCSWRST;                  //清除 SW 复位,恢复运行
       UCB0CTL1 |= UCTR + UCTXSTT;              // I2C TX、启动条件                //3.

    //   while (!(IFG2 & UCB0TXIFG));      //等待 Tx 标志。       这是需要的吗?
       
       UCB0TXBUF = 0x01;         //写入控制字节    

       while (!(IFG2 & UCB0TXIFG));      //等待 Tx 标志。
       
       UCB0CTL1 |= UCTXSTP;                   // I2C 停止条件
       UCB0CTL1 |= UCSWRST;                   //启用 SW 复位

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

    嗯、可能 SW 复位触发速度太快...

    尝试:

    UCB0CTL1 |= UCTXSTP; // I2C 停止条件
    while (UCB0CTL1 & UCTXSTP); //这是为了确保发送停止条件
    UCB0CTL1 |= UCSWRST; //启用 SW 复位

    此外、在本主题中、最好在启动 I2C TX 之前使用"while (UCB0CTL1 & UCTXSTP)"行、以确保其处于良好状态。