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.

[参考译文] msp432p401r:复位后的 eUSCI I2C 为 UCBBUSY

Guru**** 2529160 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/602698/msp432p401r-eusci-i2c-when-taken-out-of-reset-is-ucbbusy

器件型号:MSP432P401R

我在定制设计中使用当前的工厂部件(而不是实验板)。

当我将 B3 eUSCI 配置为 I2C 器件时、当我将其从复位状态中取出时、它立即提示总线忙

这似乎不正确。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    根据 TRM、该位的复位状态为"0"。
    您能否验证在运行应用程序代码之前它确实是"0"(启动时)。

    此外,在您退出重置后,如何通过调试或代码检查该值?

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

    [报价用户="Priya Thanigai]Hi、
    根据 TRM、该位的复位状态为"0"。
    您能否验证在运行应用程序代码之前它确实是"0"(启动时)。

    [/报价]

    当我将 eUSCI 复位时、UCBBUSY 为0。  复位时、我有时会这么做
    它会进入 UCBBUSY 1、有时甚至不会。  这是个很棒的地方。
    现在、我将 SCL 保持在逻辑0处的相关端口上。  有一个上拉至1v8的电压、但
    在这种情况下、电源关闭、因此 SCL 线路 实际上被拉至接地。
    行为不一致似乎仍然很奇怪。


    [报价用户="Priya Thanigai]Hi、
    此外,在您退出重置后,如何通过调试或代码检查该值?

    -Priya

    [/报价]

    调试器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Eric、
    很抱歉、我没有机会再看一下这个问题。

    当您读取它时-您可以在复位后尝试使用代码来读取它吗?
    我想到的其中一件事是、在"真正"上电复位后、它应该始终按照 UG 读取、即"0"。
    也许调试器正在模拟软复位-这不会清除该位?

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

    尊敬的 Eric:

     我会看到类似的行为、在大多数情况 下、如果我没有 SCL/SDA 上拉电阻器、我会看到 UCBBUSY 为1、而当我有上拉电阻器时、UCBBUSY 为0。

    此外、 当将这些线路接地时、我始终会看到 USBBUSY 为1、因此我不会看到与您在帖子中描述的相同行为。 这是您可以使用 Launchpad 尝试的吗??

    这是我要使用的代码:

    P10->SEL0 |= BIT2 | BIT3; // I2C 引脚
    
    EUSCI_B3->CTLW0 |= EUSCI_A_CTLW0_SWRST;//启用软件复位
    EUSCI_B3->CTLW0 = EUSCI_A_CTLW0_SWRST |//在复位模式下保持 eUSCI
    EUSCI_B_CTLW0_MODE_3 | // I2C 模式
    EUSCI_B_CTLW0_MST | //主模式
    EUSCI_B_CTLW0_SYNC | //同步模式
    EUSCI_B_CTLW0_ssel_SMCLK; // SMCLK
    EUSCI_B3->CTLW1 |= EUSCI_B_CTLW1_ASTP_2;//生成自动停止
    //达到 EUSCI_B0->TBCNT 后
    EUSCI_B3->BRW = 30; //波特率= SMCLK / 30 = 100kHz
    EUSCI_B3->TBCNT = 0x0005; //要接收的字节数
    EUSCI_B3->I2CSA = 0x0048; //从器件地址
    EUSCI_B3->CTLW0 &=~EUSCI_A_CTLW0_SWRST;//从复位中释放 eUSCI
    
    IF (EUSCI_B3->STATW && UCBBUSY)
    {
    P1->DIR |= BIT0;
    while (1)
    {
    P1->OUT ^= BIT0;
    对于(i = 20000;i > 0;i-);
    }
    } 

    还可以在不配置 SEL0寄存器的情况下运行相同的测试(在您的定制板上)吗?

    谢谢、

     David

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

    能够在 LP 上运行您的代码?? 您是否得到了相同的行为?

    请告诉我们。

    谢谢、

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

    [引用用户="Davidl">您好 Eric,

    能够在 LP 上运行您的代码?? 您是否得到了相同的行为?

    请告诉我们。

    谢谢、

    David

    [/报价]

    在 Launch Pad 上执行相同的操作。  关键是让 I2C 总线不会在其上拉电阻上接通电源。  如果您在第一次打开总线时将 SCL 拉至低电平、UCBUSY 是间歇性的。  这很奇怪。  有时会抛出 UCBUSY、有时不会。  我没有见过 SCLLOW、我认为应该这么做。

    但我们正在对 I2C 总线进行错误处理、即它超出规格。   但我们断电以节省能源。  它是一个超低功耗应用、我们将针对每一小部分进行介绍。

    我不喜欢 TI h/w eUSCI 如何处理这种情况、但我可以解决它。