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.

[参考译文] MSP430FR2433:I2C 时钟低电平超时中断

Guru**** 2390745 points
Other Parts Discussed in Thread: MSP430FR2476

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/869750/msp430fr2433-i2c-clock-low-timeout-interrupt

器件型号:MSP430FR2433
主题中讨论的其他器件:MSP430FR2476

您好!  

我将 MSP430作为具有多个读取/写入寄存器的 I2C 从器件来实现。 出于某种原因、I2C 时钟保持低电平、主器件无法再与从器件通信。  

为了处理这个问题、我启用了 I2C 时钟低电平超时中断。 正在触发中断、可以在切换 LED 上看到这种情况。  

现在、我要重置中断处理程序内的 I2C 模块。 参考  

24.3.7.3时钟低电平超时
UCCLTOIFG 中断允许软件在时钟低电平时间超过定义的时间时做出反应。 是的
当一个时钟被一个主器件或从器件扩展了太长的时间时、有可能检测到这种情况。 。
例如、用户可以通过使用 UCSWRST 位来复位 eUSCI_B 模块。
使用 UCCLTO 位启用时钟低电平超时功能。 可以从三个选项中选择一个
时钟低电平超时的预定义时间。 如果时钟处于低电平的时间长于中定义的时间
UCCLTO 位和 eUSCI_B 主动接收或发送、UCCLTOIFG 置1、然后是
如果 UCCLTOIE 和 GIE 也被置位、就会产生中断请求。 UCCLTOIFG 只设置一次、
即使时钟扩展了 UCCLTO 中定义的时间的倍数。

 

我将在中断处理程序中添加以下行  

UCB0CTLW0 = UCSWRST;  

UCB0CTLW0 &=~UCSWRST;  

它不会复位 I2C 模块。

在中断处理程序内可以执行什么操作来重新启动 I2C 模块?  

 

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

    您是否相当确定是您的从器件将 SCL 保持在低电平? (如果您复位(RST 按钮)从机、会发生什么情况?)

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

    是的、如果我复位从器件、通信再次开始。 另一方面、如果我重置主器件、相同的错误仍然存在。  

    谢谢。  

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

    您好!

    I2C 总线上是否有其他东西可能会导致 MSP I2C 从设备卡在奇怪的状态? 我搜索了类似的现象,这篇 E2E 文章( https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/301670 )似乎也有一个 I2C 线路被保持低电平的问题,这是由 I2C 总线上的另一个器件影响 MSP430引起的。

    您是否能够始终如一地重现问题或是否是零星的问题?

    此致、

    Matt

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

    事实证明、"复位"序列还有更多的作用。 SWRST 本身确实释放了总线、但不会使从器件保持运行状态。

    我的平台是一款 MSP430FR2476 Launchpad、其固件可同时用作主器件(UCB0)和从器件(UCB1)、并通过接插线进行连接。 FR2476与 FR2433相当接近、但具有2个 EUSCI_B 器件。 我在从器件中添加了一个 CLTO 和一个挂钩来触发总线挂起(通过忽略 RXIFG)。

    1) 1) UCSWRST 会清除 IE 寄存器、因此您需要将 IE 位放回。 [参考用户指南(SLAU445I)第24.3.1节]

    2) 2)在我的平台中、使用 SWRST 释放总线似乎会给主器件带来问题。 观察到的行为是、它开始尽快发送启动条件。 (我不知道这是 I2C 规则还是 MSP430 I2C 规则。) 我怀疑它与 SDA 和 SCL 同时释放有关、因为我能够通过按特定顺序单独释放它们来避免这种情况。

    下面是我最终得到的序列:

    R = UCB1IE; //保存当前 IE 位
    P4SEL0 &=~(BIT3); //通过断开与 I2C 的连接来释放 SCL
    P4SEL0 &=~(BIT4); //然后是 SDA
    UCB1CTLW0 |= UCSWRST;//复位
    UCB1CTLW0 &=~UCSWRST;
    P4SEL0 |=(BIT3|BIT4);//将引脚重新连接到 I2C
    UCB1IE = r; //将 IE 放回
    

    [编辑:回想一下、该序列的作用是生成 ACK。 看来,一个否定(相反的顺序)会更好,但师父似乎不接受。]

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

    回顾一下:通过生成一个 ACK、总线释放序列成功。 若要立即结束事务、最好使用 NACK。 该命令失败、因为我的主设备不正确(我在读取时忘记启用 UCNACKIE)。 以下是更新后的序列:

    R = UCB1IE; //保存当前 IE 位
    P4SEL0 &=~(BIT4); //通过释放 SDA 生成 NACK
    P4SEL0 &=~(BIT3); //然后通过断开与 I2C 的连接来选择 SCL
    UCB1CTLW0 |= UCSWRST;//复位
    UCB1CTLW0 &=~UCSWRST;
    P4SEL0 |=(BIT3|BIT4);//将引脚重新连接到 I2C
    UCB1IE = r; //将 IE 放回
    

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

    您好!  

    非常感谢您的努力。 此序列可解决问题。