ZHCAAI0B February 2020 – August 2021 BQ769142 , BQ76922 , BQ76942 , BQ76952
以下示例代码是用 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