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.

[参考译文] BQ27427:基于 STM32 的初始化代码

Guru**** 2443940 points
Other Parts Discussed in Thread: BQ27427

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1535534/bq27427-initialization-code-based-on-stm32

器件型号:BQ27427

工具/软件:

我尝试使用基于软件的 I2C 仿真来与 bq27427 电量监测计通信、包括初始参数配置和读取剩余电池电量百分比 (SOC)、但我无法成功读取数据。 当连续读取寄存器 0x1C 并显示其时 低 8 位 、值在之间交替 0 255 。 您能提供一些相关的参考代码吗? 我真的很感激。

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

    您好:

    我可以提供以下关于电量监测计通信的文档: https://www.ti.com/lit/an/slua801/slua801.pdf

    此致、

    Adrian

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

    非常感谢您的帮助。  我使用逻辑分析仪观察到了 I2C 波形、发现从器件地址 (0x55) 响应正确、但寄存器地址(例如 0x00、0x1C)未得到确认、从而产生 NACK。 这会阻止成功读取或写入。 我想问一下、假设没有硬件问题、可能的原因是什么? (随附了读/写程序和逻辑分析仪的屏幕截图。 SDA 配置为开漏模式、 SCL 配置为推挽模式。)

    #define BQ27427_ADDR_W         0xAA
    #define BQ27427_ADDR_R          0xAB
    #define CMD_CONTROL            0x00
    #define CMD_STATE_OF_CHARGE  0x1C

    void BQ27427_SendControl (uint16_t cmd){
    I2C_Start ();
    I2C_Write (BQ27427_ADDR_W);
    I2C_I2C Wait_Ack ();
    I2C_Write (CMD_CONTROL);
    I2C_I2C Wait_Ack ();
    I2C_Write (cmd 和 0xFF);
    I2C_I2C Wait_Ack ();
    I2C_Write ((cmd >> 8) 和 0xFF);
    I2C_I2C Wait_Ack ();
    I2C_Stop ();
    }

    uint8_t BQ27427_read (uint8_t reg){
    uint8_t receive=0;

    I2C_Start ();
    I2C_Write (BQ27427_ADDR_W);
    RECEIVE=I2C_RECE() Wait_Ack;
    I2C_Write (reg);
    RECEIVE=I2C_RECE() Wait_Ack;
    I2C_Start ();
    I2C_Write (BQ27427_ADDR_R);
    RECEIVE=I2C_RECE() Wait_Ack;
    RECEIVE = I2C_READ (0);
    I2C_Stop ();
    返回接收;
    }


    void BQ27427_Send (uint8_t reg、uint8_t cmd){
    I2C_Start ();
    I2C_Write (BQ27427_ADDR_W);
    I2C_I2C Wait_Ack ();
    I2C_Write (reg);
    I2C_I2C Wait_Ack ();
    I2C_Write (cmd);
    I2C_I2C Wait_Ack ();
    I2C_Stop ();
    }

    uint16_t BQ27427_Read16 (uint8_t reg){

    uint16_t s=0;
    I2C_Start ();
    I2C_Write (BQ27427_ADDR_W);
    S=I2C_I2C Wait_Ack ();
    I2C_Write (reg);
    S=I2C_I2C Wait_Ack ();
    I2C_Start ();
    I2C_Write (BQ27427_ADDR_R);
    S=I2C_I2C Wait_Ack ();
    uint16_t 为低电平、高电平;
    低电平= I2C_READ (1);
    高电平= I2C_READ (0);
    S=(高电平<<8)|低电平;

    I2C_Stop ();
    返回 s;
    }

    uint16_t BQ27427_ReadSOC (void){

    返回 BQ27427_Read16 (CMD_STATE_OF_CHARGE);
    }

    我想与您确认的另一个问题是:我在数据表中看到 BQ27427 的 VDD 引脚被描述为 PO 端口。 那么、VDD 引脚是否仍需要连接到电路板的 VDD 或 VCC? 如果 BAT 引脚连接到电池、但 VDD 未 连接到电路板的 VCC 或 VDD、则该芯片是否仍可以正常工作?

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

    您好:

    在 VDD 与至少 4.7uF 的接地端之间应连接一个电容器。 如果没有此电容器、则器件可能无法正常工作。

    此致、

    Adrian

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

    存在该电容器。 目前、VDD 和 VSS 之间有一个 2.2μF 电容器。 VDD 引脚正确输出 1.8V 电压。 SDA 和 SCL 都具有连接到电路板 VDD 的 10kΩ 上拉电阻器。 除了 BAT 和 VSS 之间所需的缺失 1μF 电容器外、所有其他元件都根据数据表中的参考设计进行连接–这不应该是一个大问题。

    我需要理解的是: 假设没有硬件问题、什么可能导致寄存器无响应?

    我目前的观察:
    在读取/写入操作期间:

    正确识别和确认写入地址 (0x55);  

    但当写入 任何 寄存器地址(甚至是 0x00)时、  I2C_WAIT_ack ()  返回 NACK .(Please take a look at the I2C waveform diagram I provided above.)

    这会导致随机数据读取(例如,读取寄存器 0x1C 有时返回 255、99、0 等)。 由于 所有寄存器均 未响应、因此读取的值 始终相同且无效。

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

    您好:

    如果 I2C 时序符合我们数据表中的规格、则 IC 可能存在缺陷。 您是否有可以测试的其他 IC?

    此致、

    Adrian