STM32 和 BQ25713 无法通过 I2C 正确读取/写入寄存器

问题描述 投票:0回答:1

我使用德州仪器 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, &regValSet8[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, &regValSet8[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天,但没有成功的结果。看来我需要你的建议和支持。

c stm32 cpu-registers hal texas-instruments
1个回答
0
投票

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 位数据。

© www.soinside.com 2019 - 2024. All rights reserved.