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.

[参考译文] LP5861T:I2C 寄存器寻址

Guru**** 2515615 points
Other Parts Discussed in Thread: LP5861T, LP5860

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1388771/lp5861t-i2c-register-addressing

器件型号:LP5861T
Thread 中讨论的其他器件: LP5860

工具与软件:

您好!

我在与数据表中列出的地址大于0A9h 的寄存器进行交互时遇到问题。 在表8-6中、我看到总共有10个地址位用于定义要调用的地址、我可以遵循这些位;2个位用于选择寄存器组0、1或2、其余8个位可定义整个 FF 范围内的所有数字。 我想知道是否能找到一个软件驱动程序来解决我的问题、该驱动程序能够以正确的格式发送 i2c 传输。 非常感谢您为访问这些寄存器提供任何帮助。 我认为我需要进入这些寄存器来将单独的 PWM 值设置为非零以启用任何 LED 输出。

我使用 RP2040比 i2c 控制 LP5861T。

谢谢你

TIM

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

    Tim、您好!

    正如您在下图中看到的、LP5860的 I2C 格式。 它与常规 I2C 格式不同、因为内部寄存器太多、8位无法全部包含。 因此、我们在第一个字节中将2位分频。 实际上、当您使用任何 MCU 的 I2C 接口时、只需要更改命令第一个字节的数据格式。 您需要在其中添加较高的2位寄存器地址。

    以下是 LP5860的示例代码供参考。

    // This function writes data to a register on the slave device
    void I2C_write(uint16_t regAdr_10bit, uint8_t data)
    {
        /*set slave address*/
        uint8_t I2C_TARGET_ADDRESS;
        I2C_TARGET_ADDRESS = (I2C_LP586X_5BIT_ADDRESS<<2) + (regAdr_10bit>>8);
    
        /* Transfer data format to I2C standard*/
        uint8_t regAdr_8bit = (uint8_t) regAdr_10bit;
    
        /* Set up the TX packet with the register address */
        uint8_t gTxPacket[8] = {0};
        gTxPacket[0] = regAdr_8bit;
    
        /* Set up the data to be written */
        gTxPacket[1] = data;
    
        //DL_I2C_flushControllerTXFIFO(I2C_INST);
    
        DL_I2C_fillControllerTXFIFO(I2C_INST, &gTxPacket[0], 2);
    
        /* Ensure I2C is idle before starting the transaction */
        while (!(DL_I2C_getControllerStatus(I2C_INST) & DL_I2C_CONTROLLER_STATUS_IDLE))
            ;
    
        /* Start the write operation */
        DL_I2C_startControllerTransfer(I2C_INST, I2C_TARGET_ADDRESS,
            DL_I2C_CONTROLLER_DIRECTION_TX, 2);
    
        /* Wait until the transaction is completed */
        while (DL_I2C_getControllerStatus(I2C_INST) &
               DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
            ;
    
        //DL_I2C_flushControllerTXFIFO(I2C_INST);
    
        /* Check for errors */
        if (DL_I2C_getControllerStatus(I2C_INST) &
            DL_I2C_CONTROLLER_STATUS_ERROR) {
            // An error occurred, insert error handling code here
            __BKPT(0);
        }
    }

    如果您仍需要任何支持、请通过电子邮件(jared-zhou@ti.com)与我联系。 谢谢!

    BR、Jared