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 在100k 时工作异常、在400k 时工作正常?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1118558/msp430fr2355-i2c-acting-strange-at-100k-works-fine-at-400k

器件型号:MSP430FR2355

我将 MSP430设置为主发送器。  我没有收到任何消息。  我连接到 LCD/RGB 模块。  当我尝试以100kHz 的频率运行时、我注意到只有一些字节会输出、然后时钟会停止(见下面)。  它似乎抑制了第三个字节的确认(一致)。  如果我关闭为 LCD 供电的5V 电源并将代码更改为400kHz、所有操作都可以再次正常进行。   有人能不能告诉我、在 MSP 中可能会发生什么以及我必须做什么才能使其以100kHz 的频率工作???  从根本上说、我可能无法在 MSP 代码中正确执行创建麻烦的操作。 该代码设置为字节计数 、我启用 UCTXIE0和 UCBCNTIE (请参阅下面的 ISR)... TI 在 Resource Explorer 中没有关于如何处理忙位 wrt 至 ISR 或字节计数或时钟低电平处理此问题的好示例

100kHz

在400kHz 时也是如此...(工作正常)

ISR:

#pragma vector = USCI_B0_VECTOR
__interrupt void I2C_ISR(void)
{
    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: 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:
          applicationI2C.pSysCommsB->UCBxIFG &= ~UCTXIFG;
          ISR.I2CComplete = T;
          LPM3_EXIT;
          break;
      case USCI_I2C_UCCLTOIFG:
          //pI2Cdata.pSysCommsB->UCBxCTLW[0] |= UCSWRST;
          break;
      case USCI_I2C_UCBIT9IFG: break;
      default: break;
    }
}

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

    这是否与您的另一个线程有关(显然)在之前的操作仍在运行时发出(新)启动?

    说明显而易见:总线以较低的时钟速度运行较慢;这意味着如果代码在启动后以固定的延迟执行某些操作、那么更快的 I2C 时钟将同时完成更多操作(甚至可能完成)。