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.

[参考译文] MSP430F5418A:LP5036 - LED -仍然无法对它们进行编程

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/991631/msp430f5418a-lp5036---leds---still-having-trouble-programming-them

器件型号:MSP430F5418A
主题中讨论的其他器件:LP5036MSP430F247TMS320F28035LP5569

最后、我在没有库函数的情况下对 I2C 进行编程-虽然有时会"卡住"、但一切看起来都正常。

这适用于全天候设备-非常简单-主要功能之一是闪烁的 LED。

我检查一下、如果 I2C 超时、I2C 应该被复位。 这在大部分时间都很有帮助-几乎是无法察觉的。

但在运行几个小时后、LED 停止闪烁并持续亮起、即使器件的其余功能正常工作-通过 RS485等进行通信

原因可能是什么? 我如何诊断 LED 是否持续亮起-是否有一个寄存器可以读取、以确保 LED 何时应亮起以及何时应亮起?

bool LP5036_bankColor(BYTE red, BYTE green, BYTE blue)
{
    bool ret = 1;

    ret =  LP5036_write2_Byte( LP5036_BANK_A_COLOR, red, green);

    if (ret != STATUS_SUCCESS)
    {
       Reset_I2C();
    }
    return ret;
}

bool LP5036_write2_Byte(BYTE reg, BYTE data1, BYTE data2) //, BYTE data3)
{
    WORD timeout = 1000;

        //Transmit Data to slave
    // UCB1I2CSA = LED_I2C_SLAVE_ADDR;  // don't need - this is default

    UCB1IFG &= ~(UCTXIFG + UCRXIFG);       // Clear any pending interrupts

    UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition

    while(!(UCB1IFG & UCTXIFG) && --timeout);       //Poll for transmit interrupt flag.

    if(timeout == 0)                   //Check if transfer timed out
    {
        return (STATUS_FAIL);
    }

    UCB1TXBUF = reg;

    while(!(UCB1IFG & UCTXIFG) && --timeout);       //Poll for transmit interrupt flag.

    if(timeout == 0)                   //Check if transfer timed out
    {
        return (STATUS_FAIL);
    }

    UCB1TXBUF = data1;

    while(!(UCB1IFG & UCTXIFG) && --timeout);       //Poll for transmit interrupt flag.

    if(timeout == 0)                   //Check if transfer timed out
    {
        return (STATUS_FAIL);
    }

    UCB1TXBUF = data2;

    while(!(UCB1IFG & UCTXIFG) && --timeout);       //Poll for transmit interrupt flag.

    if(timeout == 0)                   //Check if transfer timed out
    {
        return (STATUS_FAIL);
    }

    UCB1CTL1 |= UCTXSTP;     // Send stop condition

    return STATUS_SUCCESS;
}



void Reset_I2C(void)
{
    UCB1CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, Enable SW reset
    UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
    UCB1CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
}

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

    你(们)好

    MSP430F5418A 上的 I2C 应用上、请参考 MSP430F543xA 、MSP430F541xA 代码示例上的 msp430x54xA_USCI_I2c_standard_slave.c 和 msp430F541xA 代码示例(修订版 K)。 谢谢!

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

    我确实这么做了-这就是 我从中获得代码的地方。

    问题是在几个小时的工作正常后、LED 会保持亮起或熄灭状态。

    我使用示波器检查了 I2C 流量-从 MSP430到 LED 板-命令仍以相同的2Hz 速率发送-但 LED 冻结。

    这是什么原因?

    由于 LP5036是 TI 外设、我想问是否有某种方法可以"读取" LED 的状态、如果 LED 卡死、可以通过某种方式将其复位、以便它们能够再次工作?

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

    Monet、在本例中、您能帮助 Fendel

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

    感谢你的任何帮助。

    谢谢、

    梅希

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

    您好、Mechi、

    我想您可以尝试以下方法:

    1.please 捕获 LED 停止闪烁时 SCL 和 SDA 的波形、检查器件是否成功通信。 如果您方便、您可以为我提供波形、我将帮助您进行检查。

    读取 LEDx 亮度和 OUTx 颜色寄存器数据以检查那里的状态。

    此外、当 LED 停止闪烁并持续闪烁时、它们的亮度和颜色是否相同?

    最恰当的考虑

    徐美奈

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

    如果没有进一步的反馈、我将关闭此主题。

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

    很抱歉我没有回答。 我们在纪念和独立日度假。

    先前帖子中描述的情况发生在器件运行数小时后。 为了进行调试、我必须添加您建议的检查、并持续监控器件、直到出现这种情况。

    完成此操作后、我将返回给您。

    谢谢、

    梅希

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

    您好、Mechi、

    我将继续支持此问题、如果有任何进展、请联系我~

    徐美奈

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

    我想我发现它在哪里卡住了-仍然想知道为什么...

    bool LP5036_write2_Byte(BYTE reg, BYTE data1, BYTE data2) //, BYTE data3)
    {
        WORD timeout = 1000;
    
            //Transmit Data to slave
        UCB1I2CSA = LED_I2C_SLAVE_ADDR;  // don't really need - this is default
    
        UCB1IFG &= ~(UCTXIFG + UCRXIFG);       // Clear any pending interrupts
    
        UCB1CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition
    
        while(!(UCB1IFG & UCTXIFG) && --timeout);       //Poll for transmit interrupt flag.
    
        if(timeout == 0)                   //Check if transfer timed out
        {
            return (STATUS_FAIL);
        }
    
        timeout = 1000;
        UCB1TXBUF = reg;
    
        while(!(UCB1IFG & UCTXIFG) && --timeout);       //Poll for transmit interrupt flag.
    
        if(timeout == 0)                   //Check if transfer timed out
        {
            return (STATUS_FAIL);
        }
    
        timeout = 1000;
        UCB1TXBUF = data1;
    
        while(!(UCB1IFG & UCTXIFG) && --timeout);       //Poll for transmit interrupt flag.
    
        if(timeout == 0)                   //Check if transfer timed out
        {
            return (STATUS_FAIL);
        }
    
        timeout = 1000;
        UCB1TXBUF = data2;
    
        while(!(UCB1IFG & UCTXIFG) && --timeout);       //Poll for transmit interrupt flag.
    
        if(timeout == 0)                   //Check if transfer timed out
        {
            return (STATUS_FAIL);
        }
    
        UCB1CTL1 |= UCTXSTP;     // Send stop condition
    
        return STATUS_SUCCESS;
    }

    当 LED 不闪烁时、原因如下:

    timeout = 1000;
    UCB1TXBUF = reg;
    
    while(!(UCB1IFG & UCTXIFG) && --timeout); //Poll for transmit interrupt flag.
    
    if(timeout == 0) //Check if transfer timed out
    {
       return (STATUS_FAIL);
    }

    由于该函数返回故障、I2C 被复位。

    我不知道为什么突然发生这种情况、也不知道如何恢复正确的 I2C 和 LED 功能。

    可能是 Reset_I2C 未正确写入?

    void Reset_I2C(void)
    {
        UCB1CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, Enable SW reset
        UCB1CTL1 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
        UCB1CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
    }

    此外、一旦 I2C 卡死、器件必须再次通电才能继续工作(仅使用调试器复位是不够的)。

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

    Monet、您好、请继续关注此案例。

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

    我需要帮助重置 I2C -这似乎是主要问题所在。

    当它"卡住"时、我无法重置它并继续向 LED 驱动器发送消息。

    对此有什么想法吗?

    甚至在 CCS 中重新启动新的调试器会话也没有帮助。 只有实际关闭器件电源似乎会复位 I2C。 我必须有一种编程方式来执行此操作。

    谢谢、

    梅希

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

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

    您好、Mechi、

    请参阅您的描述和仿真、当卡滞时、MSP430似乎无法向 LED 器件发送任何 I2C 信号。 我建议您在 E2E 上向 MPS430团队重新创建此问题。 他们对 MCU 将更加专业。

    如果对 LED 驱动器有任何疑问、我将提供支持~

    徐美奈

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

    我同意您的意见...

    目前这是一个 MSP430问题

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

    如果您已找到问题。 我将关闭此主题、请向430团队寻求帮助。

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

    但这是 MSP430论坛...

    这不是有关 LED 板的问题-而是 I2C 问题-为什么我必须打开新的帖子?

    请-让430团队继续支持-直到我们解决该问题。

    谢谢、

    梅希

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

    您好、Xiaodong、

    请在这个问题上提供帮助? 谢谢!

    徐美奈

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

    我注意到的另一个有趣的问题是:这怎么会发生?

    使用我上面提供的代码、我将关闭 LED 的良好 I2C 消息与 I2C 卡死的消息进行比较(请参阅随附的屏幕截图)

    这是否由硬件引起? 这通常在几个小时的工作后发生。

    再说一次、一旦发生这种情况、如何复位 I2C?

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

    您好、Mechi、

    让我一起帮助您解决这个问题。

    我对这个问题做了总结、如果有一些错误、请纠正我的问题。

    1.您使用 MSP430F247通过 I2C ia normal 驱动 LP5036、并且在将 MCU 更改为 F5418A 时会出现 I2C 挂起问题、对吧?
    2、我看了 I2C 波形、您向 LP5036 (0x05 0x00 0x00)写入了3个字节的数据、我想0x05应该是寄存器地址、0x00是要加载到该寄存器(或寄存器0x05和0x06)中的数据、对吧?

    3.如您的描述所示,I2C 挂起问题在 运行一段时间后出现。 您意味着只有下电上电才能解决此问题?F5418A 和 LP5036的下电上电是否都可以解决? 由于从您的波形、从器件可能会拉高 SDA 以进行复位、即使 Mater I2C 正在重新配置、也会导致挂起问题。

    我想、如果您能够重现此问题、您可能只能尝试对 LP5036进行下电上电以检查此问题是否可以解决。

    谢谢!

    此致

    Johnson

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

    我们从未使用过不同的 MSP430 -仅 使用 F5418A。 我在另一个使用 TMS320F28035的项目中成功地集成了 LP5036。

    2.正确-我只想写入寄存器5和6 (红色和绿色)。

    直到现在、我才尝试重置 I2C。 我一定会尝试重置 LP5036 -这是个好主意。

    出现此问题的原因似乎是存在非常强的 EMI 磁场、该磁场会以某种方式干扰 I2C 或 LP5036。 当我们关闭产生强 EMI 的外设时、LED 会连续整夜成功闪烁。 由于这可能在现场发生、并且不能断电、因此我将重现此问题并尝试重置 LP5036。

    感谢你的帮助。

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

    您好、Mechi、

    得到它、等待您的测试结果。

    谢谢!

    此致

    Johnson

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

    /////////////////////////////////////////////////////////////////////
    // If I2C gets stuck (happens because of EMI) - reset I2C and LP5036
    /////////////////////////////////////////////////////////////////////
    void Reset_I2C(void)
    {
        UCB1CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, Enable SW reset
        UCB1CTL1 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
        UCB1CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
    
        LP5036_powerDown();
        LP5036_init();
    
        TotalErrors += 10;
    }
    
    // functions from LP5036 library
    
    void LP5036_powerDown()
    {
    	LP5036_writeByte( LP5036_DEVICE_CONFIG0, 0x00); //clear bit 6 to shut down
    }
    
    
    void LP5036_powerUp()
    {
    	LP5036_writeByte( LP5036_DEVICE_CONFIG0, 0x40); //set bit 6 to enable
    }
    
    
    void LP5036_init()
    {
        LP5036_powerUp();
        LP5036_powerUp();
    	LP5036_writeByte( LP5036_DEVICE_CONFIG1, 0x20 | 0x10 | 0x08 | 0x04);
    
        LP5036_setRunMode();
    
        LP5036_bankControlOn();   //control banks
    
        LP5036_bankBrightness(0xC0); // mid bright
    
        LEDS_initialized = TRUE;
    
        LP5036_write2_Byte( LP5036_BANK_A_COLOR, 0, 0);   // red & green
    
        SttCtrl.LED_R_state = OFF;
        SttCtrl.LED_G_state = OFF;
    }
    

    我刚才意识到 LP5036也依赖于 I2C 通信。 因此、如果 I2C 线路尚不可以进行消息收发、则重置 LP5036将不起作用。

    也许我应该尝试对用于 I2C 的 GPIO 引脚进行调线。

    上述复位函数会反复调用-但无结果-请参阅下面的屏幕截图。  

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

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

    BTW -当器件继续运行时、我们尝试断开 LP5036板并重新连接-但这未重置 I2C 通信

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

    您好、Mechi、

    您意味着断开连接并重启 LP5036、然后再次连接、MSP430 I2C 直至保持挂起? 超时功能无法 重置 I2C? 对吧?

    谢谢!

    此致

    Johnson

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

    是的。 正确。

    拔下 LP5036板并将其插回-器件继续工作时未重置 I2C。

    此外、我写的复位函数也不会复位 I2C。

    还有其他想法吗?

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

    您好、Mechi、

    我发现您的代码存在一些错误:
    UCB1CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、启用软件复位
    UCB1CTL1 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
    UCB1CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行

    这应该是 UCB1CTL0。

    您可以共享 I2C 配置代码吗?

    我想、如果触发了该输出、I2C 应该能够复位。

    谢谢!

    此致

    约翰森

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

    感谢您指出这一点。 它在代码中被正确写入-由于某种原因我更改了它...

    仍然不起作用。

    I2C 配置代码:

    // Initializes the I/O devices (I/O ports' direction and output values, 4-20mA output and A2D conversion)
    void InitDev()
    {
    
    //  USCI_B_I2C_initMasterParam i2c_param;
    
      /// Initialize to ports' status
    
      P1DIR = 0xFF; // Port P1 - set all bits for output.
      P1SEL = HEATER_BIT; // Port P1 - Set all bits for I/O - except P1.4 heater PWM
      P1OUT = 0x00; // Port P1- All outputs are low.
    
      P2SEL = 0x00; // Port P2 - Set all bits for I/O.
      P2DIR = 0xF3; // Port P2 - Set  bits for output - except for MEMS - P2.2, P2.3
      P2OUT = 0x01; // Port P1- All outputs are low - except for CS for Temp P2.0 -not connected
      
    
      P3SEL = 0xBE; // Port P3 - Set  bits 1-5, 7 for USCI.
      P3DIR = 0x9A; // Port P3 - Set bit 1 and 3 for output (tmp_enbl and sclk)
    
      P4SEL = 0x00; // Port P4 - Set all bits for I/O.
      P4DIR = 0x01; // Port P4 - Set all bit for input, except bit 0, TXD_EN.
      P4OUT = 0x00; // Port P4- All outputs are low.
      
    
      P5SEL = 0x10; // Port P5 - Set all bits for I/O - P5.4 SCL I2C
      P5DIR = 0x10; // Port P5 - Set all bits for input - P5.4 output
      
    
      P6SEL = 0xFF; // Port P6 - Set all bits for A2D (rather than I/O).
     
      P7DIR = 0xFF; // Port P1 - set all bits for output.
      P7SEL = 0x03; // Port P1 - Set all bits for I/O - except for timer external CLK
    
      P7OUT = 0x00; // Port P1- All outputs are low.
      P8DIR = 0xFF; // Port P1 - set all bits for output.
      P8SEL = 0x00; // Port P1 - Set all bits for I/O.
      P8OUT = 0x00; // Port P1- All outputs are low.
      P9DIR = 0xFF; // Port P1 - set all bits for output.
      P9SEL = 0x00; // Port P1 - Set all bits for I/O.
      P9OUT = 0x00; // Port P1- All outputs are low.
      P10DIR = 0xFF; // Port P1 - set all bits for output.
      P10SEL = 0x00; // Port P1 - Set all bits for I/O.
      P10OUT = 0x00; // Port P1- All outputs are low.
      PFDIR = 0xFF; // Port P1 - set all bits for output.
      PFSEL = 0x00; // Port P1 - Set all bits for I/O.
      PFOUT = 0x00; // Port P1- All outputs are low.
    
      /// Initialize the A/D converter
      ClearAveragedA2D();
      
        /* The A/D Control Register */
      /* Initialize the shared reference module */
      REFCTL0 |= REFMSTR + REFVSEL_0 + REFON;    // Enable internal 1.5V reference
    
       
      ADC12CTL0 = ADC12ON + ADC12MSC + ADC12SHT03 + ADC12REFON;   // Sample 32 ADC12CLK cycles - turn REF on for Temperature.
                                                                   // Multiple sample and conversion.
      ADC12CTL1 = ADC12SHP + ADC12DIV_7 + ADC12SSEL_1 + ADC12CONSEQ_1 ; // Sequence conversion, ADC12CLK: ACLK/8.
    
      /* Set the Conversion Memory Registers (a sequence that starts with A0 and ends with A1. */
      
      ADC12MCTL0 = ADC12INCH_2 + ADC12REF2_5V; // ADC12MEM0 will read A2 (VCC -3v ) in the range VE_REF- (GND_420) to VE_REF+ (VCC).
      ADC12MCTL1 = ADC12INCH_3 + ADC12REF2_5V; // ADC12MEM1 will read A3 (VDD- 5v divided by 2) in the range VE_REF- (GND_420) to VE_REF+ (VCC).
      ADC12MCTL2 = ADC12INCH_1 + ADC12REF2_5V; // ADC12MEM2 will read A1 (sns_Vin -divided by 11) in the range VE_REF- (GND_420) to VE_REF+ (VCC).
      ADC12MCTL3 = ADC12INCH_0 + ADC12REF2_5V; // ADC12MEM3 - will read A0 (sns_HEATER) in the range VE_REF- (GND_420) to VE_REF+ (VCC).
      ADC12MCTL4 = ADC12INCH_4 + ADC12REF2_5V; // ADC12MEM4 - will read A4 (sns_12v - factor is 0.203187) in the range VE_REF- (GND_420) to VE_REF+ (VCC).
      ADC12MCTL5 = ADC12INCH_5 + ADC12REF2_5V; // ADC12MEM5 - will read A5 (sns_HV - between 1 and 2.6v) in the range VE_REF- (GND_420) to VE_REF+ (VCC).
      ADC12MCTL6 = ADC12INCH_6 + ADC12REF2_5V; // ADC12MEM6 - will read A6 (sns_HV - between 1 and 2.6v) in the range VE_REF- (GND_420) to VE_REF+ (VCC).
      ADC12MCTL7 = ADC12INCH_10 + ADC12SREF_1 + ADC12EOS; // ADC12MEM7 - will read A10 -temperature sensor
                                          // End of Sequence for the last channel
      
      ADC12IE = 0x0F; //ADC12IE7;  //0x01; // A/D Interrupt Enable
      isA2D_Accumulate = TRUE; // Enable A2D accumulation
      
      SetVCoreUp(2);
    
      UCS_setExternalClockSource(16128000, 0);
    
      // UCB1 for I2C
      UCB1CTL1 |= UCSWRST;                      // Enable SW reset
      UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
      UCB1CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK
      UCB1BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
      UCB1BR1 = 0;
      UCB1I2CSA = LED_I2C_SLAVE_ADDR;           // Slave default Address is 030h
      UCB1IE &= ~UCTXIE;                        // disable TX interrupt
      UCB1CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
    
      // UCB0 for SPI
      UCB0CTL1 = UCSSEL_2 | UCSWRST; // Use SMCLK + **Put state machine in reset**
      UCB0CTL0 =  UCSYNC +  UCMSB + UCMODE_0 + UCMST + UCCKPL;   // Master, synchronous mode
      // Clock polarity high, MSB first
      UCB0BR0 = 12; // fSCL = SMCLK/12 = ~ 200khz
      UCB0CTL1 &= ~UCSWRST;   // enable - take out of reset
    }
    

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

    有趣的事情...可能会给我们一个线索、告诉我们如何解决这种情况...

    如果 I2C 停止-但 SDA 和 SCL 线路都为高电平、那么如果我发送另一个 I2C 命令(使用 PC 主机到另一个外设)、I2C 返回正常工作状态。

    我必须弄清楚如何在固件中执行此操作...我无法弄清楚在11、14或15秒后将 SDA 设置为 HIGH...(正如我每次发生此情况时所观察到的那样)...

    如果 SDA 为低电平-那么向另一个外设发送 I2C 命令根本不起作用。

    请参阅随附的屏幕截图

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

    您好、Mechi、

    很抱歉,两个人的假期太晚了。

    您的问题是否已解决? 您是否仍然需要我们的支持?

    谢谢!

    此致

    Johnson

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

    否 问题未解决。

    如何在不关闭器件电源的情况下以编程方式复位 I2C?

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

    使用以下代码禁用 I2C 模块:

    UCB1CTL1 |= UCSWRST;

    然后重新改造这个 I2C 模块。  

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

    我尝试过 I2C 的这个复位-但它不起作用。

    我一直在尝试很多不同的想法。

    I2C 消息受闪存的强 EMI 影响。 我尝试同步 I2C 消息、以便在 EMI 闪存关闭80ms 后发送这些消息。 但 I2C 在10到20小时或运行后停止、并且我无法将其复位。

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

    LP5036 驱动器中是否有设置使其处于恒定闪烁状态、而无需发送特定的 I2C 消息?

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

    您好、Mechi、

    @Monet、您能帮助检查 LP5036是否具有此功能吗?

    谢谢!

    此致

    Johnson

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

    您好、Mechi、

    I2C 接口是为 LP5036配置闪烁功能的必要方法、它需要持续工作。 LP5569是一款具有引擎控制和电荷泵的通道 I2C RGB LED 驱动器。 它可以在配置相关寄存器和 SRAM 后释放 I2C 接口、闪烁功能将在启用引擎后运行。

    最恰当的考虑

    徐美奈