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.

[参考译文] MSP430F5524:UCBBUSY 被持续置位

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/841538/msp430f5524-ucbbusy-being-continuously-set

器件型号:MSP430F5524

我正在使用 I2C 模块0 (UCB0)与两个从器件(EEPROM (24LC64)和一个温度传感器(Si7060))进行通信。 正在持续执行温度传感器的 I2C 写入和读取。 偶尔的 I2C 读取失败、因为它们不及时响应、但我认为下次读取正常。

但在10-15分钟(10000次或更多次读取)后、UCBBUSY 位会被置位。 SDA 线持续保持低电平。 我的代码在 while 循环中等待位被清除、而这种情况并未发生、因此代码会卡住。 写入操作正常。 我使用的代码与用于 I2C 模块1 (UCB1)的代码相同、没有问题。

(1)为什么会发生这种情况? 我在 CRO 上观察到 CLK 信号看起来像正弦波。 保持时间是否不足、导致从器件将数据线拉低以向 ACK 发出信号、而不会将其释放? 在本例中、更改 I2C 时钟频率可解决该问题、对吧? 当前时钟频率约为133KHz (16MHz/120)

(2)当 UCBBUSY 被置位时、我尝试通过执行来复位 I2C 模块  

UCB0CTL1 = UCSWRST;

_DELAY_CYCLES (1000);

UCB0CTL1 &=~UCSWRST;

尽管这会将模块和 SDA 线重置为高电压电平、但这会导致在某些情况下连续读取 I2C 失败。 我是否已尝试更正? 如果不是、我还能如何解决这个问题?

我们在生产过程中处于关键阶段。 任何帮助都将受到衷心感谢。 请查找随附的代码。

谢谢

Abhisheke2e.ti.com/.../i2cCode.c

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

    您会说时钟信号看起来像正弦信号。 上升时间由您的电阻器上拉控制。 下降时间取决于 MSP430输出将其拉至低电平的能力。 如果上升和下降时间都很长、则线路上的电容过大。

    您的代码中缺失的是 I/O 引脚的初始化。 您可能需要再次检查它。

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

    你(们)好、David

    您是否认为保持时间与其说是上升或下降时间、不如说是问题? 是否知道保持时间为何更短?

    这是我在 main.c 中执行的初始化:

    P3SEL |= (MCU_UCB0_SDA|MCU_UCB0_SCL);  //其中 MCU_UCB0_SDA = 0x1、 MCU_UCB0_SCL=0x2

    鉴于我们现在无法更改硬件设计、您能想到我可以通过什么其他固件攻击来解决问题吗? I2C 读取失败正常。 我不希望 SDA 线持续保持低电平。

    谢谢

    Abhishek

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

    我建议您阅读 TI 的 slva689、并验证您是否满足 I2C 信号上升和下降时间规格。 如果不是、您将不得不更改某些内容。 (上拉电阻器和/或 F5524输出驱动强度。)

    也许较慢的时钟就足够了。

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

    你(们)好、David

    我将尝试读出它。 更改 FF24输出驱动强度意味着什么?

    我想报告我今天观察到的情况。 我尝试通过读取 、写入函数中的 UART 向 PuTTY 输出一系列日志语句。 例如:发送开始、收到 ACK、写入成功等 这样、我就成功地在一段时间内运行代码2-3个小时。 现在,我要得出结论,通过__delay_cycles ()添加延迟可能是 解决我所面临问题的适当变通办法。 CPU 时钟速度为16MHz。 这可能太快、以至于从器件无法响应、对吧? I2C 时钟速度约为133KHz,因此应该可以。 我可以就此征求您的意见吗? 在有关速度较慢的时钟执行诀窍的评论中、您是指 CPU 时钟还是 I2C 时钟?

    谢谢

    Abhishek

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

    请参阅驱动强度寄存器手册中的说明。 (PxDS)

    我不能很好地遵循这中间部分。 听起来好像您暂停在 I2C 事务的中间、以便通过单独的串行端口发送数据。 这会改变字符间时序、但不会对每个字节内的时序执行任何操作。

    我当然是指 I2C 时钟。 如果您的信号上升和下降时间确实如描述的那样糟糕、则需要降低时钟速度。  使用133Khz 时钟时、您应该满足快速模式规格。

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

    您好、 Abhishek、  

    我同意 David 的说法、即降低 I2C 时钟速度以减少计时。 这是您可以尝试的软件解决方法。 您是否已经尝试过这种方法、如果它运行良好?  

    如果您认为 David Recommendation 有助于 解决您的问题、 请单击 此已解决我的问题  按钮以关闭此主题。   

    此致、  

    Lixin  

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

    大家好、David、Lixin

    首先,对拖延答复表示歉意。 我在工作中非常忙。  

    在 I2C 事务的中间暂停以通过单独的串行端口发送数据、有助于解决我一直这样做的问题。 但我在 I2C 代码方面面临另一个问题。 我们现在处于生产模式、对于某些 MSP430、我无法在2-3小时后使用编程器暂停代码。 代码停止运行、暂停时、我收到消息"break at address "0xd00c4"、no debug information available、or outside of program code"。 对于某些其他 IC、代码运行良好超过8小时。 另一方面、对于某些人来说、它在一分钟内就会失败。

    请查看我的代码、看看我是否有什么问题?  可能在写入寄存器的顺序上存在问题、或者由于代码提供了不一致的行为、因此存在可接受但不完美的问题。

    谢谢、Regardse2e.ti.com/.../1513.i2cCode.c

    Abhishek

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

    禁用全局中断、但随后启用模块中断。 更简单的方法是不启用模块中断! (中断标志将被置位、与 IE 位的状态无关。) 如果其他一些器件不喜欢延迟其中断服务、则可能会导致问题。

    大多数 i2cUcb0Cleanup()都是无用的。 如果您从未启用模块中断、则无需禁用它们。 置位 UCSWRST 会自动清零 IE 和 IFG 寄存器。

    我通常使用中断驱动方法、因此这个轮询的东西对我来说看起来很奇怪。

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

    尊敬的 David:

    感谢您浏览代码。 这是我加入工作场所时的现有代码、因为它在工作、我让它成为现实。 我也一直在想改变它。 虽然它可以得到改进、但它没有明显的错误会导致这种行为、对吧?

    我可能已经诊断了这种情况的原因。 MCLK 频率为16MHz (通过内部 DCO)。 在增加或降低该频率时、代码在几秒钟内就损坏了的 MCU 中运行正常。 据我所知、MSP430F5524的最大频率为25MHz。 那么、有什么想法呢? 这是否仅仅是由于不当处理、ESD 事件等导致的 IC 本身的问题?

    这里是我要设置 MCLK 频率的代码。 如果可以、您可以告诉我吗?

    UCSCTL3 |= SELREF_2;         //设置 DCO FLL 基准= REFO
    UCSCTL4 |= SE拉美 经济体系2;           //设置 ACLK = REFO
    UCSCTL0 = 0x0000;           //设置可能的最低 DCOx、MODx
    //循环直到 XT1、XT2和 DCO 稳定-在这种情况下、只有 DCO 必须稳定
    操作

    UCSCTL7 &=~(XT2OFFG | XT1LFOFFG | DCOFFG);
    //清除 XT2、XT1、DCO 故障标志
    SFRIFG1 &=~OFIFG;//清除故障标志

    while (SFRIFG1&OFIFG);//测试振荡器故障标志

    _bis_SR_register (SCG0);//禁用 FLL 控制循环
    UCSCTL1 = DCORSEL_5;//选择 DCO 范围16MHz 运行
    UCSCTL2 = FLLD_0 + 487;//将 DCO 乘法器设置为16MHz //(487 + 1)* 32768 = 16MHz
    _BIC_SR_register (SCG0);//启用 FLL 控制环路

    // DCO 范围位已经存在时、DCO 的最坏情况稳定时间
    //已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
    // UG 进行优化。
    // 32 x 32 x 16 MHz/32、768Hz = 500000 = DCO 稳定的 MCLK 周期

    _DELAY_CYCLES (50000);

    谢谢、此致

    Abhishek

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

    您好、Abhishek、  

    我认为  、在数秒内 MCU 中增加或降低此频率时、代码运行正常并不是 ESD 问题。 这应该与频率设置和 I2C 通信速度设置相关。 如果删除了 I2C 代码并且代码运行良好、则可以通过 I2C 代码解决该问题。 然后、您可以逐步调试它。  

    关于 MCLK 16MHz 设置、我没有看到任何不正确的地方。  

    此致、  

    Lixin  

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

    您好、Lixin、

    这是您提出的一个好问题。 当我将时钟速度从16MHz 降低到12MHz 时、I2C 时钟速度也从133KHz 降低到100KHz。 为了深入探究、我将 I2C 时钟速度降低至100KHz、同时将 MCLK 速度保持在16MHz。 它立即失败。 当时钟速度为16MHz 时、我会逐行调试 I2C 代码、但它没有失败、我遇到了时钟速度问题。 如果在降低时钟速度时问题不再发生,我计划进一步将其降低到8MHz,如果这不起作用,则尝试发出软件复位(使用看门狗计时器),最好是从 ISR。

    谢谢

    Abhishek

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

    您好、Abhishek、

    对于" 、我将 I2C 时钟速度降低至100KHz、同时将 MCLK 速度保持在16MHz。 它立即失败"、您知道失败的地方在哪里吗? 代码是否在某个位置挂起或 I2C 通信失败而没有 ACK 或接收/写入错误数据? 如果可以解决该问题、我们可以知道 MCLK 是否有问题或 I2C 通信是否有问题。 您还可以尝试另一种情况:MCLK 设置为16MHz、I2C 时钟设置为100KHz、降低 I2C SCL 和 SDA 线路的上拉电阻。 如果 I2C 通信错误、这有助于解决问题。  

    此致、  

    Lixin