ZHCAAI0B February   2020  – August 2021 BQ769142 , BQ76922 , BQ76942 , BQ76952

 

  1.   商标
  2. 1直接命令
    1. 1.1 警报启用 - 0x66
    2. 1.2 电池1 电压 - 0x14
    3. 1.3 内部温度 - 0x68
    4. 1.4 CC2电流- 0x3A
  3. 2子命令
    1. 2.1 DEVICE_NUMBER - 0x0001
    2. 2.2 生产状态 - 0x0057
    3. 2.3 FET_ENABLE - 0x0022
    4. 2.4 重置 - 0x0012
  4. 3读取和写入 RAM 寄存器
    1. 3.1 读取启用保护功能A
    2. 3.2 进入 CONFIG_UPDATE 模式
    3. 3.3 写入启用保护功能A
    4. 3.4 写入“VCell模式”
    5. 3.5 退出 CONFIG_UPDATE 模式
  5. 4具有 CRC 的 I2C
  6. 5具有 CRC 的 SPI 示例
    1. 5.1 直接命令示例:警报启用 - 0x66
    2. 5.2 直接命令示例:Cell 1 电压- 0x14
    3. 5.3 子命令示例:器件型号 - 0x0001
    4. 5.4 子命令示例:FET_ENABLE - 0x0022
    5. 5.5 子命令示例:重置 - 0x0012
    6. 5.6 RAM 寄存器读取示例:启用保护功能 A
    7. 5.7 RAM 寄存器写入示例:启用保护功能A
  7. 6简单代码示例
  8. 7参考文献
  9. 8修订历史记录

简单代码示例

以下示例代码是用 Python 编写的,旨在通过 EV2400 模块或通过 BQ76942 或 BQ76952 评估模块上的 USB 连接器从 PC 与 BQ769x2 器件进行通信。该代码显示了简单 的I2C 读取和写入函数的创建、 DataRAM_Read 函数(也可用于执行子命令,因其遵循相同的格式)的创建,以及显示校验和及长度计算的 DataRAM_Write 函数的创建。代码的主要部分介绍了本文档前面三个章节中涉及的所有示例。

这个简单的代码示例旨在说明 I2C 命令的基本命令结构。微控制器代码示例也可用于 I2C 和 SPI。Topic Link Label7中提供了微控制器代码的链接。

'''
/* BQ769x2 示例程序演示了直接命令、子命令以及从器件 RAM 写入/读取 的示例。
'''
import pywinusb
import bqcomm
import sys
import time
from time import sleep
import sets
I2C_ADDR = 0x10  # BQ769x2 slave address
numCells = 10    # Set to 10 for BQ76942
####################################################
## 检查 EV2400 是否已连接
####################################################
try: 
    a = bqcomm.Adapter()  # 这将使用第一个找到的 Aardvark 或 EV2400
except: 
    print "No EV2400 Available"
    sys.exit(1)
######################################################
## 定义一些命令函数
######################################################
def I2C_Read(device_addr, reg_addr, length): 
    '''
    使用 全局I2C地址并返回读取值
    '''
    try: 
        value = a.i2c_read_block(device_addr, reg_addr, length)
    except: 
        print "Nack received"
        return
    return value
def I2C_Write(device_addr, reg_addr, block): 
    '''
    使用全局I2C地址
    '''
    try: 
        a.i2c_write_block(device_addr, reg_addr, block)
    except: 
        print "Nack received"
    return 
def DataRAM_Read(addr, length): 
    '''
    Write address location to 0x3E and read back from 0x40
    Used to read configuration registers and for subcommands
    '''
    addressBlock = [(addr%256), (addr/256)]
    I2C_Write(I2C_ADDR, 0x3E, addressBlock)
    value = I2C_Read(I2C_ADDR, 0x40,length)
    return value
def DataRAM_Write(addr, block): 
    '''
    Write address location to 0x3E and Checksum,length to 0x60
    Used to write configuration registers
    '''
    addressBlock = [(addr%256), (addr/256)]
    wholeBlock = addressBlock + block
    I2C_Write(I2C_ADDR, 0x3E, wholeBlock)             # Write Data Block
    # Write Data Checksum and length to 0x60, required for RAM writes
    I2C_Write(I2C_ADDR, 0x60, [~sum(wholeBlock) & 0xff, len(wholeBlock)+2])
    return        
def crc8(b,key): 
    crc = 0
    ptr = 0
    for j in range(len(b),0,-1): 
        for k in range(8): 
            i = 128 / (2**k)
            if ((crc & 0x80) != 0): 
                crc = crc * 2
                crc = crc ^ key
            else: 
                crc = crc * 2
            if ((b[ptr] & i) != 0): 
                crc = crc ^ key
        ptr = ptr + 1
    return crc
##########################################
#  主脚本开始
##########################################
################ 直接命令示例 ################
#将警报启用写入 0xF082
I2C_Write(I2C_ADDR, 0x66, [0x82, 0xF0])
#读取电池 #1 上的电压
result = I2C_Read(I2C_ADDR, 0x14, 2)
print "Cell 1 = ", (result[1]*256 + result[0]), " mV"
#读取内部温度
result = I2C_Read(I2C_ADDR, 0x68, 2)
print "Internal Temp = ", ((result[1]*256 + result[0])/10 - 273.15), "degrees C"
#读取 CC2 电池测量值
result = I2C_Read(I2C_ADDR, 0x3A, 2)
print "CC2 = ", (result[1]*256 + result[0]), " mA"
################ 子命令示例 ################
#读取器件型号
b = DataRAM_Read(0x0001,6)
print "Device_Number = " '{0:04X}'.format(b[1]*256+b[0])
#读取生产状态
b = DataRAM_Read(0x0057,2)
print "Manufacturing Status = " '{0:04X}'.format(b[0]+256*b[1])
## 只包含命令的子命令 ##
#FET_ENABLE
I2C_Write(I2C_ADDR, 0x3E, [0x22, 0x00])
#RESET - 器件恢复为默认设置
I2C_Write(I2C_ADDR, 0x3E, [0x12, 0x00])
sleep(1)
############ 读取和写入 RAM 寄存器 ##########
# 读取“启用保护功能A RAM 寄存器 0x9261
b = DataRAM_Read(0x9261,1)
print "Enabled Protections A = 0x" '{0:02X}'.format(b[0])
#设置 CONFIG_UPDATE 模式(RAM 寄存器的写入应在 CONFIG_UPDATE 模式时进行,并退出 CONFIG_UPDATE 模式时生效)
I2C_Write(I2C_ADDR, 0x3E, [0x90, 0x00])
#写入启用保护功能A RAM 寄存器以启用 CUV 保护
DataRAM_Write(0x9261, [0x8C])
#写入“VCell Mode”RAM 寄存器,为9节电池进行配置
DataRAM_Write(0x9304, [0x03, 0x7f])
#退出 CONFIG_UPDATE 模式
I2C_Write(I2C_ADDR, 0x3E, [0x92, 0x00])
# CRC8 示例计算
TestValue = [0x10, 0x14, 0x11, 0x68]
crcKey = 0x107
check = 0xff & crc8(TestValue,crcKey)
print "crc8 check = 0x" '{0:02X}'.format(check)

下述是 BQ76942 评估模块上运行的示例 Python 脚本的输出。

Cell 1 =  3700  mV
Internal Temp =  25.05 degrees C
CC2 = 7  mA
Device_Number = 7694
Manufacturing Status = 0040
Enabled Protections A = 0x88
crc8 check = 0x33