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.

[参考译文] CCS/MSP430FR5969:bq24250 i2c 代码问题

Guru**** 2550550 points
Other Parts Discussed in Thread: BQ24250

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/588726/ccs-msp430fr5969-bq24250-i2c-code-problem

器件型号:MSP430FR5969
主题中讨论的其他器件:BQ24250

工具/软件:Code Composer Studio

大家好、

我想  使用 I2C 代码读取 bq2250 IC 寄存器0x00的充电状态。

当我调试代码时,它将进入 eusci_b_i2c.c 驱动程序文件的这一步。


//轮询发送中断标志。
while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCTXIFG))


请指导我解决问题。

Bq24250的 I2C 代码:

#include "driverlib.h"
#include"clockinit.h"
void i2c_init();
void i2c_write();
uint8_t i2c_read();
void GPIO_init();
uint8_t REG_STATUS=0、REG_val=0;
uint32_t clock_val=0;

#define SLAVE_ADDRESS 0x6A

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 &=~LOCKLPM5;
_BIC_SR_register (GIE);
clockinit();
clock_val=CS_getSMCLK();
GPIO_init();
I2C_init();
_delay_cycles (2000);
reg_val=i2c_read();
while (1);

void GPIO_init()

GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN6 + GPIO_PIN7、GPIO_secondary 模块_function);

void i2c_init()

EUSCI_B_I2C_initMasterParam param ={0};
param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
param.i2cClk = CS_getSMCLK ();
param.datarate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;
param.byteCounterThreshold = 1;
param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、SLAVE_ADDRESS);
EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、param);
EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE);
EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);

EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);



uint8_t i2c_read ()

//发送单字节数据。
EUSCI_B_I2C_masterSendSingleByte (EUSCI_B0_BASE、0x00);//读取寄存器0x00

//延迟直到传输完成
while (EUSCI_B_I2C_isBusy (EUSCI_B0_BASE))



EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_mode);
EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0+ EUSCI_B_I2C_Transmit INTERRUPT0);
EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);
REG_STATUS=EUSCI_B_I2C_masterReceiveSingleByte (EUSCI_B0_BASE);
EUSCI_B_I2C_masterReceiveStart (EUSCI_B0_BASE);
REG_STATUS = EUSCI_B_I2C_masterReceiveSingle (EUSCI_B0_BASE);
返回 REG_STATUS;

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

    Manoj、您好!

    我刚刚收到了您的问题。 我将查看代码并返回给您。

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

    哪个"//轮询发送中断标志"被卡住了? 它是发送开始条件之后的一个还是发送单字节之后的一个?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它位于发送单字节函数上
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在深入了解代码之前、我能不能看一下您的硬件是如何设置的? 我想查看 MCU 和 bq24250之间的连接、上拉电阻器及其值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、它使用不同的版本代码。所以、硬件可以。但我的代码中有一些故障
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Manoj、您好!

    我发现一个错误、在 PMM 解锁之前必须完成 GPIO 初始化。

    这意味着您必须首先调用、

    //为 I2C 配置引脚
    //将 P1.6和 P1.7设置为辅助模块功能输入。
    /*
    
    *选择端口1
    *将引脚6、7设置为输入次级模块功能(UCB0SIMO/UCB0SDA、UCB0SOMI/UCB.S)。
    *
    GPIO_setPeripheralModuleFunctionInputPin (
    GPIO_PORT_P1、
    GPIO_PIN6 + GPIO_PIN7、
    GPIO_secondary 模块功能
    );
    
    /*
    *禁用 GPIO 上电默认高阻抗模式以激活
    *先前配置的端口设置
    *
    PMM_unlockLPM5 (); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需添加说明即可:
    PMM_unlockLPM5 ()与 PM5CTL0 (=~LOCKLPM5)相同;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我更改了您建议的更改、但它不起作用。仍然会被删除
    //轮询发送中断标志。
    while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCTXIFG))


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、它与 PM5CTL0 &=~LOCKLPM5是一个寄存器版本、而 PMM_unlockLPM5 ()是一个 driverlib 版本
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我刚刚测试了此代码、在将 slave_address 更改为正确的地址后、我遇到了与您相同的问题、一切正常。

    #include "driverlib.h"
    
    void i2c_init ();
    void i2c_write ();
    uint8_t i2c_read ();
    void GPIO_init ();
    uint8_t reg_status=0、reg_val = 0;
    uint32_t clock_val = 0;
    
    #define SLAVE_ADDRESS 0x48
    
    int main (void)
    {
    
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    //_BIC_SR_register (GIE);
    
    //将 DCO 频率设置为1MHz
    CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_0);
    //set ACLK = VLO、分频器为1
    CS_initClockSignal (CS_ACLK、CS_VLOCLK_select、CS_clock_divider);
    //set SMCLK = DCO、分频器为1
    CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_Clock_divider);
    //set MCLK = DCO、分频器为1
    CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_Clock_divider);
    
    clock_val=CS_getSMCLK();
    GPIO_init();
    PM5CTL0 &=~LOCKLPM5;
    I2C_init();
    _delay_cycles (2000);
    reg_val=i2c_read();
    while (1);
    }
    
    void GPIO_init()
    {
    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN6 + GPIO_PIN7、GPIO_secondary 模块_function);
    }
    
    void i2c_init ()
    {
    EUSCI_B_I2C_initMasterParam param ={0};
    param.selectClockSource = EUSCI_B_I2C_CLOCKSOURCE_SMCLK;
    param.i2cClk = CS_getSMCLK ();
    param.datarate = EUSCI_B_I2C_SET_DATA_RATE_400KBPS;
    param.byteCounterThreshold = 1;
    param.autoSTOPGeneration = EUSCI_B_I2C_NO_AUTO_STOP;
    EUSCI_B_I2C_setSlaveAddress (EUSCI_B0_BASE、SLAVE_ADDRESS);
    EUSCI_B_I2C_initMaster (EUSCI_B0_BASE、param);
    EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
    EUSCI_B_I2C_ENABLE (EUSCI_B0_BASE);
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);
    
    EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);
    }
    
    uint8_t i2c_read ()
    {
    //发送单字节数据。
    EUSCI_B_I2C_masterSendSingleByte (EUSCI_B0_BASE、0x00);//读取寄存器0x00
    
    //延迟直到传输完成
    while (EUSCI_B_I2C_isBusy (EUSCI_B0_BASE))
    {
    ;
    }
    EUSCI_B_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_mode);
    EUSCI_B_I2C_clearInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0+ EUSCI_B_I2C_Transmit INTERRUPT0);
    EUSCI_B_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);
    REG_STATUS=EUSCI_B_I2C_masterReceiveSingleByte (EUSCI_B0_BASE);
    EUSCI_B_I2C_masterReceiveStart (EUSCI_B0_BASE);
    REG_STATUS = EUSCI_B_I2C_masterReceiveSingle (EUSCI_B0_BASE);
    返回 REG_STATUS
    ;}