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.

[参考译文] MSP430FR2355:在显示两个 i2c 总线事务时遇到问题?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1162918/msp430fr2355-having-trouble-displaying-both-i2c-bus-transactions

器件型号:MSP430FR2355

您好...

这是代码的"部分",似乎不会在 while (i2cstate……)停止 环块。  代码直接击穿了。。。 观察总线事务 RGB 部分所有数据看起来都很好、 但是在 LCD 区,我得到的数据传输中的所有零都是0,这对我来说是指指针没有被复位,这看起来我从来没有进入 ISR.I2CComplete 区……我尝试过各种各样的东西,但没有结果…

结束函数是在进入无限 while 循环之前配置 RGB 和 LCD。  如果我运行代码、我获得所有事务、并且位于 LPM3_BITS + GIE。

    __bis_SR_register(GIE);

    /*
     * initialize RGB
     */
    nonZeroBufDepth = I2C_TxArray_Builder((uint8_t *)InitializeRGB, sizeof(InitializeRGB), RGB_W);
    i2cstate = I2CWRITE;
    sendI2C_data(pI2CStream, nonZeroBufDepth, RGB_12C_ADDRESS);
    
    while(i2cstate != I2CIDLE);

    /*
     * initialize LCD
     */
    nonZeroBufDepth = I2C_TxArray_Builder((uint8_t *)initializeLCD, sizeof(initializeLCD), LCD_multiW);
    i2cstate = I2CWRITE;
    sendI2C_data(pI2CStream, nonZeroBufDepth, LCD_12C_ADDRESS);

    while(1)
    {
        __bis_SR_register(LPM3_bits + GIE);


        if (ISR.I2CComplete)
        {
            /*
             * house-keeping
             */
            ISR.I2CComplete = F;
            i2cstate = I2CIDLE;
            i2c_cnt = 0;
            memset((void *)lcd_rgb_data, 0, sizeof(lcd_rgb_data));
            pI2CStream = lcd_rgb_data;
        }

    }
}


#pragma vector = USCI_B0_VECTOR
__interrupt void I2C_ISR(void)
{
    uint8_t rcv;
    switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG))
    {
      case USCI_NONE: break;
      case USCI_I2C_UCALIFG: break;
      case USCI_I2C_UCNACKIFG: break;
      case USCI_I2C_UCSTTIFG: break;
      case USCI_I2C_UCSTPIFG:
          ISR.I2CComplete = T;
          i2cstate = I2CSTOP;
          LPM3_EXIT;
          break;

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

    我不是很确定你在描述什么--你是用示波器还是用调试器观看?

    i2cstate 是否声明为"volatile"? 此外、请记住、I2C 单元将在您处于断点时继续运行(无论如何会持续一小段时间);这会失真计时并使调试此类代码变得复杂。

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

    你好 Bruce。。。。

    我正在使用逻辑分析仪和调试器观看... ic2state 为(_vo 为易失性):  

    typedef __vo enum {I2CIDLE, I2CWRITE, I2CREAD, I2CRESTART, I2CSTOP, I2CNACK} i2cCause;
    

    以下是一张图片,显示了两个事务,即使有一个断点集也是如此:  

    这里是 main 中的所有代码、它可以让您更好地理解。 断点位于 memset 上。  我在 Forever while 循环之前执行两次写入(代码暂时未完成、因为此时会有更多的代码进入此循环)。   您可以看到我在事务处理之前设置了 GIE 位,以便它们发生...看起来 ISR.I2CComplete 永远不会被设置回 F ... 在我写这篇文章时、我认为我看到了答案的一部分...我想在 ISR.I2CComplete = T 之后(来自 ISR 内部) 我将在 while (1)中转到代码部分并将其解析为 F、但我想、鉴于代码已运行到目前为止、它绝不会也不会对该特定部分采取行动。  (ISR.I2CComplete 从不= F 这一事实向我表明了这一点)。    

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

    很抱歉、我无法清楚地理解您的问题。

    液晶屏配置似乎不成功。 正如您所说的" 但是、在 LCD 部分、数据事务上的所有零"。 但是、从数字分析器的结果中可以看出、它不是0x00。

    您能否检查发送到 LCD 的字节是否正确?