我使用德州仪器 BQ25713 充电器。当我们通过 I2C 对 BQ25713 进行编程时,它无法正确向任何寄存器写入/读取值。
例如;无法读取ManufacturerID() 0x2E
预期:0x2E / 0x002E
结果:0x2E41
我也尝试过 DeviceID() - ChargeCurrent() - ChargeOption0() - MaxChargeVoltage() 等,但我再次读取和写入时出错。
只有一个例外,即 CHRG_OK -> AC_STAT 运行良好。它可以看到输入存在/不存在。
I2C_地址:0xD6(6B)。 (我没有发现I2C地址有什么问题)
来自数据表;
9.5 编程 该充电器支持使用写字或读字协议的电池充电器命令,如第 9.5.1 节中所概述。 I2C 地址是 D6h。分配ManufacturerID 和DeviceID 寄存器来识别充电器设备。 ManufacturerID 寄存器命令始终返回 40h。
#define BQ25713_REG_I2C_ADDRESS 0xD6 // I2C Address (R) Converted to 8 Bit from 6Bh
#define BQ25713_REG_MANUFACTURER_ID 0x2E // MANUFACTURER ID (R) // I've also tried as 0x002E
checkBitsAndControlLEDs(BQ25713_REG_MANUFACTURER_ID);
uint16_t SetI2CData(uint16_t regAddress, uint16_t regValue) {
HAL_StatusTypeDef status;
uint8_t regValSet8[2];
// Seperation as LSB ve MSB
regValSet8[0] = regValue & 0xFF; // LSB
regValSet8[1] = (regValue >> 8) & 0xFF; // MSB
// is Device Ready
status = HAL_I2C_IsDeviceReady(&hi2c1, BQ25713_REG_I2C_ADDRESS, 3, HAL_MAX_DELAY);
if (status != HAL_OK) {
// Cihaz hazır değil, hata durumunu göster
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
}
// Write LSB
status = HAL_I2C_Mem_Write(&hi2c1, BQ25713_REG_I2C_ADDRESS, regAddress, I2C_MEMADD_SIZE_16BIT, ®ValSet8[0], 1, HAL_MAX_DELAY);
if (status != HAL_OK) {
// Error LSB
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
}
// Write MSB
status = HAL_I2C_Mem_Write(&hi2c1, BQ25713_REG_I2C_ADDRESS, regAddress + 1, I2C_MEMADD_SIZE_16BIT, ®ValSet8[1], 1, HAL_MAX_DELAY);
if (status != HAL_OK) {
// Error MSB
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
}
return 0;
}
uint16_t ReadI2CData(uint16_t regAddress) {
uint8_t readData[2];
HAL_StatusTypeDef status;
// Check device
status = HAL_I2C_IsDeviceReady(&hi2c1, BQ25713_REG_I2C_ADDRESS, 3, HAL_MAX_DELAY);
if (status != HAL_OK) {
// Error
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(300);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
}
// Read data from Register
status = HAL_I2C_Mem_Read(&hi2c1, BQ25713_REG_I2C_ADDRESS | 0x01, regAddress, I2C_MEMADD_SIZE_16BIT, readData, 2, HAL_MAX_DELAY);
if (status != HAL_OK) {
// Error
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(10000);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_Delay(10000);
}
// Combine LSB and MSB
uint16_t readI2CData = (readData[0] << 8) | readData[1];
return readI2CData;
}
// Check Bits via LED
void checkBitsAndControlLEDs(uint16_t check_register) {
uint16_t regData = ReadI2CData(check_register);
for (int i = 15; i >= 0; i--) {
if ((regData >> i) & 1) {
// if bit is 1, light on LED 2 (GREEN)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
HAL_Delay(2500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
} else {
// if bit is 0, light on LED 1 (RED)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(2500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
}
HAL_Delay(1000); // 1s Delay
}
}
单片机:STM32F030 IDE:STM32CubeIDE(已导入HAL、INIT、I2C函数)
进行调试和运行过程时没有错误或警告。
我为此花了4天,但没有成功的结果。看来我需要你的建议和支持。
BQ25713 数据表显示用于I2C通信的
Reg Addr
是8位。例如。参见图 9-11。多读.
代码在调用
I2C_MEMADD_SIZE_16BIT
和 HAL_I2C_Mem_Write
时使用 HAL_I2C_Mem_Read
。 IE。该代码尝试将 16 位寄存器地址发送到 BQ25713,而不是 8 位寄存器地址。
此外,数据表显示 BQ25713 寄存器是 8 位,但
SetI2CData
和 ReadI2CData
函数使用 uint16_t
而不是 uint8_t
作为寄存器的数据类型。
虽然数据表确实显示了多重写入和多重读取I2C操作,这些操作适用于具有连续寄存器地址的多个8位寄存器,但如果将代码更改为写入/读取8位寄存器,可能会更清楚。
至少建议更改代码以使用
I2C_MEMADD_SIZE_8BIT
而不是 I2C_MEMADD_SIZE_16BIT
。
总而言之,问题中的代码似乎将 BQ25713 寄存器视为具有 16 位地址和 16 位数据,而数据表显示了 8 位寄存器地址和 8 位数据。