/************************************************************************

  • LOCAL FUNCTIONS */ void I2CTransfer(uint16_t deviceAddr, uint8_t cmdArray[], uint8_t dataArray[], uint16_t cmdLen, uint16_t dataLen, uint16_t flag) { // Õâ¸öº¯ÊýÓÉi2cReadRegister/i2cWriteRegisterµ÷Óã¬ÊÇ×î»ù±¾µÄI2C´«Ê亯Êý¡£ // Ïȼì²éflag£¬Õâ´Î´«ÊäÊǶÁ»¹ÊÇд // È»ºó¼ì²é¶ÁдµÄ×Ö½ÚÊý£¬¶ÔÕÕBQ27441оƬÊÖ²á

    deviceAddr = BQ27441_G1_ADDR;

    //¼ì²éflag if(flag==I2C_FLAG_WRITE_READ) { uint8_t Value = 0x00; /* 1.I2CÍâÉè¿ÕÏÐ. */ while(LL_I2C_IsActiveFlag_BUSY(I2C_Handle));

     LL_I2C_IsEnabled(I2C_Handle);
     LL_I2C_EnableBitPOS(I2C_Handle);
    
     /* 2.STARTÐźŠ*/
    

    LL_I2C_AcknowledgeNextData(I2C_Handle, LL_I2C_ACK); LL_I2C_GenerateStartCondition(I2C_Handle); while(!LL_I2C_IsActiveFlag_SB(I2C_Handle));

     /* 2.дÆ÷¼þµØÖ· */
    

    LL_I2C_TransmitData8(I2C_Handle, deviceAddr); while(!LL_I2C_IsActiveFlag_ADDR(I2C_Handle));

    LL_I2C_ClearFlag_ADDR(I2C_Handle); /* 3.µØÖ·Î». */ while(!LL_I2C_IsActiveFlag_TXE(I2C_Handle));

     /* 4.·¢ËÍÆ÷¼þ¼Ä´æÆ÷µØÖ·. */
    

    LL_I2C_TransmitData8(I2C_Handle, BQ27441_G1_STATE_OF_CHARGE_CMD); while(!LL_I2C_IsActiveFlag_TXE(I2C_Handle));

     /* 5.RESTARTÐźÅ. */
    

    //LL_I2C_GenerateStopCondition(I2C_Handle); LL_I2C_GenerateStartCondition(I2C_Handle); while(!LL_I2C_IsActiveFlag_SB(I2C_Handle));

     /* 6.ÖØÐ·¢ËÍ. */
    

    LL_I2C_TransmitData8(I2C_Handle, deviceAddr<<1); while(!LL_I2C_IsActiveFlag_ADDR(I2C_Handle));

     	if((dataLen == 2))
     	{
     /* 7.STOP. */
    

    LL_I2C_AcknowledgeNextData(I2C_Handle, LL_I2C_NACK); LL_I2C_ClearFlag_ADDR(I2C_Handle); LL_I2C_GenerateStopCondition(I2C_Handle); while(!LL_I2C_IsActiveFlag_RXNE(I2C_Handle));

     	}
     /* 8.Êý¾Ý¶ÁÈ¡. */
    

    Value = LL_I2C_ReceiveData8(I2C_Handle); return ;

    volatile uint16_t temp = 0; while(1) { temp = BQ27441_G1_GetChecksum(&bq27441_g1); } } else if (flag==I2C_FLAG_WRITE_WRITE) {

    } }

static uint16_t i2cReadRegister(uint16_t addr,uint8_t regOffset) { uint16_t result = 0x00;

uint8_t cmdArray[1];
uint8_t dataArray[2];

cmdArray[0] = regOffset;
I2CTransfer(addr << 1, cmdArray, dataArray, 1, 2, I2C_FLAG_WRITE_READ );

result = (dataArray[1] << 8) | (dataArray[0]);
return result;
return dataArray[0];

}

static void i2cWriteRegister(uint16_t addr,uint8_t regOffset, uint8_t writeData) { uint8_t cmdArray[1]; uint8_t dataArray[2];

cmdArray[0] = regOffset;
dataArray[0] = writeData;
I2CTransfer(addr << 1, cmdArray, dataArray, 1, 2, I2C_FLAG_WRITE_WRITE );

}

/************************************************************************

  • FUNCTIONS */

//BQ27441³õʼ»¯ bq27441_g1_t* BQ27441_Init() { /* ³õʼ»¯Í¨ÐÅ½Ó¿Ú */ LL_I2C_Enable(I2C_Handle);

/* ³õʼ»¯BQ27441 */ bq27441_g1.Read = i2cReadRegister; bq27441_g1.Write = i2cWriteRegister;

/* ³õʼ»¯³õʼ»¯BQ27441¼Ä´æÆ÷ */

return &bq27441_g1;

如何在main函数完成相关函数的添加 内容:在main函数中,可以先初始化BQ27441,然后调用相关函数进行操作,例如:

int main(void) { /* 初始化BQ27441 / bq27441_g1_t bq = BQ27441_Init();

/* 读取状态 */ uint16_t stateOfCharge = bq->Read(BQ27441_G1_ADDR, BQ27441_G1_STATE_OF_CHARGE_CMD);

/* 写入配置 */ bq->Write(BQ27441_G1_ADDR, BQ27441_G1_CONFIG_DATA_CLASS, 0x01);

/* 循环读取电池电量 / while (1) { uint16_t stateOfCharge = bq->Read(BQ27441_G1_ADDR, BQ27441_G1_STATE_OF_CHARGE_CMD); / 进行其他操作 */ }

return 0; }

BQ27441 电池管理芯片 I2C 通信函数实现

原文地址: https://www.cveoy.top/t/topic/nlX1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录