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.

[参考译文] MSP430FG4618:在低处理器时钟速率下运行 I2C 的 USCI 时序问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/910139/msp430fg4618-timing-issues-with-usci-running-i2c-at-low-processor-clock-rates

器件型号:MSP430FG4618

这与之前的查询(几个月前)有关、I2C 事务在处理器时钟速率降低时发生故障。 由于有一个简单的解决方法(不要太慢!),我把它放在卷边篮中,但它让我感到很困扰,最后有一些空闲时间来玩它,尝试并了解正在发生的情况。

简而言之、我在主接收器模式下以100K 运行基于 USCI 的 I2C、从传感器读取3个字节的数据(2个字节加一个 PEC)。 这在更高的时钟速率(高于4MHz)下工作正常、但在这种情况下尝试读取一个额外的杂散字节。 下面是我对当前情况的理解。

该文档指出、在读取最终字节时必须请求 STP。 在代码方面、这意味着需要立即请求 STP、以便为倒数第二个字节的 RXBUF 提供服务。 我曾假设我有时间读取最后一个字节来玩-在100K 时、这应该给我大约80uS。 这应该很容易就足够了、尤其是在为倒数第二个字节的 RXBUF 提供服务和请求 STP 之间没有发生任何事情。 但我仍然看到故障、即使是一些微不足道的测试逻辑、RXBUF 读取紧随 STP 之后。 逻辑分析仪的一个游戏、以及对文档的另一个阅读、终于让我们了解了这一点。

我忽略了 USCI 对传入字节的缓冲、并将在等待前一个 RXBUF 被处理时继续计时和读取数据。 如果 RXBUF 没有及时处理(这是在降低的时钟速率下发生的情况)、USCI 最终将在缓冲完除下一个字节的最后一位之外的所有位后停止 I2C 时钟。 一旦 RXBUF 被读取、它将立即为最后一个位计时。 这意味着、如果下一个字节已经被完全缓冲、则可用窗口仅是读取最后一位所需的时间(大约8us)、而不是读取整个字节以使 STP 就位所需的时间(~80us)。 在低 MSP 时钟速率(例如1MHz)下、在 USCI 完成接收当前字节并开始读取另一个杂散字节之前、根本没有足够的时间来请求 STP。

此声音是否有效?  除了对低 MSP 时钟速率和高 I2C 数据速率的组合非常谨慎之外、我看不到任何保护方法。

此致- Andrew

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

    您好、Andrew、  

    我认为您的分析是正确的。  

    在用户指南 slau056的 I2C 主接收器模式部分中、有说明"如果主器件只想接收单字节、则在接收字节时必须置位 UCTXSTP 位。" 代码示例 msp430xG46x_uscib0_i2c_10.c 也对其进行了演示  

    如果 MCLK 太慢、在最后一个字节被接收到 RXBUF 后 UCTXSTP 被置位、停止和 NACK 将不会正常生成。  

     msp430xG46x_uscib0_i2c_10.c 的 ISR:  

    _interrupt void USCIAB0TX_ISR (void)

      RXByteCtr --;//递减 RX 字节计数器
      IF (RXByteCtr)
      {
        * PRxData++= UCB0RXBUF;//将 RX 数据移动到地址 PRxData
        如果(RXByteCtr = 1)//只剩下一个字节?
          UCB0CTL1 |= UCTXSTP;//生成 I2C 停止条件
      }
      其他
      {
        * PRxData = UCB0RXBUF;//将最终的 RX 数据移动到 PRxData
        _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0
      }

    谢谢、

    Lixin

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

    谢谢!

    对于后续情况、我刚刚完成了几个测试、以便在开始显示之前了解 MSP 时钟速度和 I2C 时钟的组合限制。 该逻辑只是在读取倒数第二实字节之前放置一个输入延迟、以确保 USCI 已完全缓冲最终字节(通过观察时钟扩展在数据分析仪上进行验证)、然后执行 RXBUF 读取、紧接着执行 STP 请求。 结果有点令人惊讶! 4618 I 的运行时钟限制为8MHz、I2C 从设备是一款符合 SMBus 标准的器件、它将 I2C 时钟限制为100KHz。

    在8MHz 时钟下、一切都很顺利、高达100K、传输完成时 USCI 不会读取任何杂散数据。  在4MHz 时钟下、任何高于60K I2C 的内容都无法及时停止 USCI。 在2MHz 时、最大 I2C 为30K。 在1MHz 时、我开始遇到 I2C 从设备上时序的其他问题、并且在从设备放弃与我通信的情况下、不能将 I2C 时钟压降到足够大的程度以获得一个干净的事务。

    但是、这真的很重要吗? 虽然更巧妙地停止交易、但从站已经提供了我们需要的所有信息、因此实际上我们可以忽略任何虚假数据。 如果数据以另一种方式传输、并且我们依赖正确的终止来将事务提交到从站、则可能是一个问题。 但是、在这种情况下、USCI 不能在我们提供的数据之前进行写入、因此我们应该始终拥有完整字节窗口来正确终止事务(我认为!)。

    我将继续并关闭它。 我很有信心我了解正在发生的情况、并且可以轻松地解决这一问题。

    此致

    Andrew