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**** 2518320 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1118559/msp430fr2355-i2c-back-to-back-transmits-what-is-the-best-way-to-handle

器件型号:MSP430FR2355

我有一个主发送器、并发送以下内容:

    InitializeDisplay(&pI2Cdata, LCD_12C_ADDRESS);
    __delay_cycles(2000);
    InitializeDisplay(&pI2Cdata, RGB_12C_ADDRESS);

它工作正常,但如果我删除了许多本应传输的字节的延迟周期,那么不使用软件延迟周期,执行此操作的适当方法是什么??我尝试使用 UCSBUSY 标志,但这没有解决问题:

不起作用:

    InitializeDisplay(&pI2Cdata, LCD_12C_ADDRESS);
//    __delay_cycles(2000);
    while(pI2Cdata.pSysCommsB->UCB0STATW_L & UCBBUSY__BUSY);
    InitializeDisplay(&pI2Cdata, RGB_12C_ADDRESS);

我正在 ISR 中使用字节计数来触发停止条件。

谢谢

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

    从您的描述中、它听起来像是 InitializeDisplay 使用后写方案、它在操作完成之前返回。

    这实际上是可以的、但这意味着您需要一个"占线"指示器、并且随后的呼叫(即所有呼叫)会等待清除、然后才开始(新的)操作。 在最简单的形式中、这意味着您正在 InitializeDisplay 而不是在__delay_cycles 中旋转、但它可能比仅仅挑选2000个时钟作为完成时更可靠。

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

    我在 ISR 的字节计数部分创建了一个标志、并且使用 that...it 几乎可以正常工作...最后一个字节输出5个时钟、然后切换到 RGB 部分...然后我尝试使用 TXBIT9IFG 对其进行补充、但这并不起作用...我不确定我还能尝试什么... TI 似乎不能做到 以提供对低时钟、字节计数或 txbit9的良好代码示例支持

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

    如果您使用的是 UCASTP=2、UCSTPIFG 可能会很有用、因为 UCBCNTIFG 在(最终)字节的第二位期间被置位、即相当早的时候[参考 UG 第24.3.8]。

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

    谢谢!  是的,我使用的是 UCASTP=2,但我错误地使用了停止 ISR……结果我思考过度,并且有太多的代码……在将东西分频掉后,我意识到我的字节计数器 ISR 是禁用 TXIE0 ISR……在 ucbcntif 中,我发现它是禁用 TXIFE0的 只有在字节计数达到0 (或最大值)后才进入此部分,也许它仍然可以执行,但在该部分中删除 TXIFE0的禁用会清除所有内容....

    ISR 现在非常严格、并且仍然使用字节计数、当 UCASTP=2....时、就不需要在这个部分中有任何代码了

        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;
              LPM3_EXIT;
              break;
          case USCI_I2C_UCRXIFG3: break;
          case USCI_I2C_UCTXIFG3: break;
          case USCI_I2C_UCRXIFG2: break;
          case USCI_I2C_UCTXIFG2: break;
          case USCI_I2C_UCRXIFG1: break;
          case USCI_I2C_UCTXIFG1: break;
          case USCI_I2C_UCRXIFG0:
            break;
          case USCI_I2C_UCTXIFG0:
              applicationI2C.pSysCommsB->UCBxTXBUF = *pI2CStream;
              pI2CStream++;
              break;
          case USCI_I2C_UCBCNTIFG: break;
          case USCI_I2C_UCCLTOIFG: break;
          case USCI_I2C_UCBIT9IFG: break;
          default: break;