This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ76952:与保护相关的问题

Guru**** 2588625 points
Other Parts Discussed in Thread: BQ76952, BQSTUDIO, BQ76942

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1018255/bq76952-issues-related-to-protection

器件型号:BQ76952
主题中讨论的其他器件: BQSTUDIOBQ76942

您好!

我已启用我的放电、充电、启用保护并尝试设置不同保护的阈值,同时我观察到违反保护 CUV。当我尝试违反 COV 时,我观察到主放电已关闭我的故障状态已设置。 但是、当充电 FET 仅在 All_FET_OFF 条件下关断时而不在 CHG_PCHG_OFF 和 FET_CONTROL 条件下关断时、我的充电 FET 不会关断;为了实现热敏电阻保护、我将 TS3、HDQ、DCHG 配置为 FET 保护并超出阈值、两个 FET 都未关断。

我的阈值配置是否正确? 和设置其他参数是否一致?

请帮助

我已附上我的 C 代码

/*用户代码 begin Header */
/**
秘书长的报告
*@文件:main.c
*@简介:主要节目机构
秘书长的报告
*@注意
*
*

Copyright版权所有(c) 2021 STMicroelectronics。
*保留所有权利。


*
*此软件组件由 ST 根据 BSD 3条款许可、
*"许可证";除非符合、否则不得使用此文件
*许可证。 您可以在以下位置获取许可证副本:
* opensource.org/licenses/BSD-3-Clause
*
秘书长的报告
*
/*用户代码结尾标头*/
/*包括------------------------------------------ *
#include "main.h"

/*私有包括---------------------------------------------- *
/*用户代码 begin 包括*/
#include
/*用户代码末尾包括*/

/*私人 typedef ------------------------------------------------------- *
/*用户代码 begin PTD */

/*用户代码结束 PTD */

/*私人定义------------------------------------------------------- *
/* USER CODE BEGIN PD */
#define DEV_ADDR 0x10 //器件地址
#define CRC_Mode 0 // 0表示禁用、1表示启用
#define MAX_BUFFER_SIZE 10 //缓冲区最大大小
//#define DEBUG_RX_DO 引脚 GPIO_PIN_10
//#define DEBUG_RX_DO GPIO_Port GPIOA
/*用户代码末尾 PD */

/*私有宏------------------------------------------------------- *
/*用户代码 begin PM */

/*用户代码结束 PM */

/*私有变量------------------------------------------------------- *
I2C_HandleTypeDef hi2c1;

TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim2;

UART_HandleTypeDef huart1;

/*用户代码 begin PV */
uint8_t spiData [2];
uint8_t spiRxData [2];
uint8_t rxdata [2];
uint8_t busyData [2]={0xFF、0xFF};
uint8_t TX_1Byte_P[14]={0x78、0x7B、0x75、0x7c、0x82、 0x84、0x8A、0x80、0x86、0x87、 0xA0、0xA2、0xA3、0xA5};
uint8_t TX_Byte_data[14]={0x51、0x4F、0x44、0x55、0x12、 0x15、0x38、0x07、0x46、0x21、 0x5A、0x4B、0x2D、0x28};
//COV //COV //CUV 0x44 //CUV RELEASE //OCD1 //OCD2 //OCD3 //OCC //SCD /SCD DELAY //OT FET ///OT FET Rec //OT Init //OT Init RELEASE
uint8_t TX_Byte_arr[15][3]={0x78、0x92、0x51}、{0x7B、0x92、0x02}、{0x75、0x92、0x48}、{0x7C、0x92、0x76}、{0x82、0x92、0x12}、 {0x84、0x92、0x15}、{0x8A、0x92、0x38}、{0x80、0x92、0x07}、{0x86、0x92、0x46}、{0x87、0x92、0x21}、 {0xA0、0x92、0x5A}、{0xA2、0x92、0x4B}、{0xA3、0x92、0x2D}、{0xA1、0x92、0x02}、{0xA5、0x92、0x28}};
uint8_t TX_2Byte [2]={0x00、0x00};
uint8_t TX_3字节[3]={0x00、0x00、0x00};
uint8_t TX_4字节[4]={0x00、0x00、0x00、0x00};
uint8_t TX_6Byte [6]={0x00、0x00、0x00、0x00、0x00、 0x00};
uint8_t TX_Buffer [MAX_Buffer_SIZE]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};

uint8_t RX_2Byte [2]={0x00、0x00};
uint8_t RX_3Byte [3]={0x00、0x00、0x00};
uint8_t RX_4字节[4]={0x00、0x00、0x00、0x00};
uint8_t RX_6Byte [6]={0x00、0x00、0x00、0x00、0x00、 0x00};
uint8_t RX_12字节[12]={0x00、0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00、 0x00、0x00};
uint8_t RX_32byte [32]={0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x00};
uint8_t RX_Buffer [MAX_Buffer_SIZE]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};
unsigned int RX_CRC_Check = 0;
//电池电压、温度、CC2电流、堆叠电压、PACK 引脚电压、 LD 引脚电压
uint16_t CellVoltage [16]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};
浮点温度[3]={0、0、0};
FET_Temperature = 0;
浮点 HDQ_Temp = 0;
浮点 DCHG_Temp = 0;
浮点 DDSG_Temp = 0;
uint16_t Result_bin = 0;
uint16_t Stack_Voltage = 0x00;
uint16_t LD_Voltage = 0x00;
uint16_t PACK_Voltage = 0x00;
uint16_t PACK_CURRENT = 0x00;
浮点电流= 0;
uint16_t AlarmBits = 0x00;
uint32_t Samp1[2]={0x00、0x00};
uint32_t RES = 0;
uint32_t min_cell = 0;
uint32_t Battery_volte_sum = 0;
uint32_t Avg_cell_temp = 0;
uint32_t FET_temp = 0;
uint32_t Max_cell_temp = 0;
uint32_t min_cell_temp = 0;
uint32_t Avg_min_max_temp = 0;
uint32_t Max_cell = 0;
uint32_t CC3_CURRENT;
uint32_t CC1_CURRENT;
uint32_t Raw_CC2_Count;
uint32_t Raw_CC3_Count;
char hex_num[10];
字符 Val[100];
uint8_t SafetyStatusA;//安全状态寄存器 A
uint8_t SafetyStatusB;//安全状态寄存器 B
uint8_t SafetyStatusC;//安全状态寄存器 C
uint8_t PFStatusA;//永久故障状态寄存器 A
uint8_t PFStatusB;//永久故障状态寄存器 B
uint8_t PFStatusC;//永久故障状态寄存器 C
uint8_t FET_Status;// FET 状态寄存器内容请参阅 TRM 第12.2.20节-显示 FET 的状态
uint8_t Alert_B;
uint8_t OTF = 0;
uint16_t CB_ActiveCells;//电池平衡活动电池
uint16_t DEVICE_NUMBER;

uint8_t uV_Fault = 0;//欠压故障状态
uint8_t OV_Fault = 0;//过压故障状态
uint8_t SCD_Fault = 0;//短路故障状态
uint8_t OCD_Fault = 0;//过流故障状态
uint8_t OTF_Fault = 0;
uint8_t LD_on = 0;//加载检测状态位
uint8_t DCHG = 0;//放电 FET 状态
uint8_t CHG = 0;//充电 FET 状态
uint8_t PCHG = 0;//预充电 FET 状态
uint8_t PDSG = 0;//预放电 FET 状态
uint8_t DDSG = 0;
uint32_t 累加器介入_Int;
uint32_t 累加成帧;
uint32_t 累加时间;
/*用户代码末尾 PV */

/*私有函数原型------------------------------------------------------- *
void SystemClock_Config (void);
静态空 MX_GPIO_Init (空);
静态空 MX_I2C1_Init (空);
静态空 MX_TIM1_Init (空);
静态空 MX_USART1_UART_Init (空);
静态空 MX_TIM2_Init (空);
/*用户代码 begin PFP */
#ifdef __GNU__
//使用 gcc/Raisonance,small printf (选项 LD Linker->Libraries->small printf
设置为"是")调用__io_putchar()*/
#define PUTCHAR_prototype int _io_putchar (int ch)
其他
#define PUTCHAR_prototype int putc (int ch、file *)
#endif /*__GNU_*/
void delayUS (uint32_t us){//设置以微秒为单位的延迟。
//uint8_t Tim = 0;
_HAL_TIM_SET_COUNTER (&htim1、0);//将计数器值设置为0
while (__HAL_TIM_GET_COUNTER (&htim1)< us);

void delay_ticks (uint32_t ticks)

SysTick -> LOAD =节拍;
SysTick ->VAL = 0;
SysTick ->CTRL = SysTK_CTRL_ENABLE_MSK;
// COUNTFLAG 位在计数器到达0时设置为1。
//读取时会自动清除。
while ((SysTick ->CTRL & SysTick _CTRL_COUNTFLAG_MSK)=0);
SysTick ->CTRL = 0;

void CopyArray (uint8_t *源、uint8_t *目标、uint8_t 计数)

uint8_t copyIndex = 0;
for (copyIndex = 0;copyIndex < count;copyIndex++)

dest[copyIndex]= source[copyIndex];

unsigned char 校验和(unsigned char * ptr、unsigned char len)
//计算写入 RAM 寄存器时的校验和。 校验和是字节总和的倒数。

unsigned char i;
unsigned char 校验和= 0;

for (i=0;<len; i++)
校验和+= PTR[i];

校验和= 0xff &~Ω 校验和;

return (校验和);

unsigned char CRC8 (unsigned char * ptr、unsigned char len)

unsigned char i;
unsigned char crc=0;
while (len--!=0)

对于(i=0x80;i!=0;i/=2)

if ((CRC & 0x80)!= 0)

CRC *= 2;
CRC ^= 0x107;

其他
CRC *= 2;

if ((* ptr & i)!=0)
CRC ^= 0x107;

PTR++;

return (CRC);

void I2C_WriteReg (uint8_t reg_addr、uint8_t * reg_data、uint8_t count)

#if CRC_Mode

uint8_t CRC_COUNT = 0;
CRC_COUNT = COUNT * 2;
uint8_t crc1stByteBuffer [3]={0x10、reg_addr、reg_data[0]};
unsigned int j;
unsigned int i;
uint8_t temp_CRC_buffer [3];

TX_Buffer[0]= REG_DATA[0];
TX_Buffer[1]= CRC8 (CRC 1stByteBuffer、3);

J = 2;
对于(i=1 <count; i++)

TX_Buffer[j]= reg_data[i];
J = j + 1;
temp_CRC_buffer[0]= REG_DATA[i];
TX_Buffer[j]= CRC8 (temp_CRC_buffer、1);
J = j + 1;

HAL_I2C_Mem_Write (&hi2c1、DEV_ADDR、REG_addr、1、TX_Buffer、 计数、1000);

#endif

#if CRC_Mode < 1
HAL_StatusTypeDef 状态= HAL_OK;
State=HAL_I2C_Mem_Write (&hi2c1、DEV_ADDR、REG_addr、1、REG_DATA、 计数、1000);
if (state!= HAL_OK)


#endif


int I2C_ReadReg (uint8_t reg_addr、uint8_t * reg_data、uint8_t count)

unsigned int RX_CRC_FAIL = 0;//复位为0。 如果处于 CRC 模式且 CRC 失败、则该值将递增。

#if CRC_Mode

uint8_t CRC_COUNT = 0;
uint8_t ReceiveBuffer [10]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};
CRC_COUNT = COUNT * 2;
unsigned int j;
unsigned int i;
unsigned char CRCc = 0;
uint8_t temp_CRC_buffer [3];

HAL_I2C_Mem_Read (&hi2c1、DEV_ADDR、REG_addr、1、ReceiveBuffer、 crc_count、1000);
uint8_t crc1stByteBuffer [4]={0x10、reg_addr、0x11、ReceiveBuffer[0]};
CRCc = CRC8 (CRC 1stByteBuffer、4);
if (CRCc!= ReceiveBuffer[1])
RX_CRC_FAIL += 1;

RX_Buffer[0]= ReceiveBuffer[0];

J = 2;
对于(i=1 <count; i++)

RX_Buffer[i]=接收缓冲器[j];
TEMP_CRC_BUFFER[0]=接收缓冲器[j];
J = j + 1;
CRCc = CRC8 (TEMP_CRC_BUFFER、1);
if (CRCc!= ReceiveBuffer[j])
RX_CRC_FAIL += 1;
J = j + 1;

CopyArray (RX_Buffer、REG_DATA、CRC_COUNT);

#endif

#if CRC_Mode < 1
// HAL_StatusTypeDef state = HAL_OK;
HAL_I2C_Mem_Read (&hi2c1、DEV_ADDR、reg_addr、1、reg_data、 计数、1000);
//if (state!= HAL_OK)
//{

//}
#endif

返回0;

int Dec_TO_Bin (int n){
int binaryNum[32];
int Convert_Num[32];
//二进制数组的计数器
int i = 0;
while (n > 0){

//将余数存储在二进制数组中
binaryNum[i]= n % 2;
N = n/2;
i++;

//以相反的顺序打印二进制数组
for (int j = i - 1;j >= 0;j-)

convert_Num[j]= binaryNum[j];

int k;
对于(k = 16-1;k >= 0;k---)
如果(Convert_Num[k]='1')
中断;

//如果在上没有"1"连接1
//字符串开头
如果(k =-1)
返回"1"+ Convert_Num;

//在的位置之后继续遍历
//第一个'1'
对于(int j = k-1;j >= 0;j--)

//只需翻转这些值
如果(Convert_Num[j]='1')
convert_Num[j]='0';
其他
convert_Num[j]='1';

返回 Convert_Num;


void AFE_Reset (){
//重置命令。 将所有寄存器复位为默认值或 OTP 中编程的值。
TX_2Byte[0]= 0x12;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void AFE_Init(){
//配置器件 RAM 中的所有参数

//进入 configupdate 模式(子命令0x0090)-需要处于 CONFIG_UPDATE 模式才能对器件 RAM 设置进行编程
//有关 CONFIG_UPDATE 模式的完整说明,请参阅 TRM 第7.6节
TX_2Byte[0]= 0x90;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

delayUS(2000);

//进入 CONFIG_UPDATE 模式后、可以对 RAM 寄存器进行编程。 对 RAM 进行编程时、校验和和长度也必须为
//编程以使更改生效。 BQ76952 TRM 的第13章详细介绍了所有 RAM 寄存器。
//查找说明的一种更简单的方法是在 BQStudio Data Memory 屏幕中找到。 将鼠标移到寄存器名称上时、
//屏幕上将弹出对寄存器和位的完整说明。
// TRM 的第13.9节中也提供了数据存储器的摘要。

//"电源配置"-设置 DSLP_LDO - 0x9234 = 0x2D82 (请参阅 TRM 第13.3.2节)
//设置 DSLP_LDO 位可使 LDO 在器件进入深度睡眠模式时保持活动状态
TX_4Byte[0]= 0x34;TX_4Byte[1]= 0x92;TX_4Byte[2]= 0x82;TX_4Byte[3]= 0x2D;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//'re 4/0 Config'-设置 REG0_EN 位以启用前置稳压器
TX_3Byte[0]= 0x37;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x01;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//'re 4/12 Config'-启用具有3.3V 输出的 REG1
TX_3Byte[0]= 0x36;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x0D;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//'VCell Mode'-启用16节电池- 0x9304 = 0x0000 (请参阅 TRM 第13.3.2.19节)
// 0x0000设置16个单元格的默认值。
TX_4Byte[0]= 0x04;TX_4Byte[1]= 0x93;TX_4Byte[2]= 0x00;TX_4Byte[3]= 0x00;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//“默认报警屏蔽”-启用全扫描和可扫描位
// 0xF882
TX_4Byte[0]= 0x6D;TX_4Byte[1]= 0x92;TX_4Byte[2]= 0x82;TX_4Byte[3]= 0xf8;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//在'Enabled Protections A'中启用保护0x9261 = 0xBC (请参阅 TRM 第13.3.3.2节)
//启用 SCD (短路)、OCD1 (放电过流)、OCC (充电过流)、
// COV (过压)、CUV (欠压)
TX_3Byte[0]= 0x61;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0xFC;//0xFC
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//启用'Enabled Protections B'中的所有保护0x9262 = 0xF7 (请参阅 TRM 第13.3.3.3节)
//启用 OTF (过热 FET)、OTINT (内部过热)、OTD (放电过热)、
// OTC (充电过热)、UTINT (内部欠温)、UTD (放电欠温)、UTC (充电欠温)
TX_3Byte[0]= 0x62;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0xF7;//0xF7
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//充电 FET 保护 A
TX_3Byte[0]= 0x65;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x98;//0xF7
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//充电 FET 保护 B
TX_3Byte[0]= 0x66;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0xD5;//0xF7
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

#if 1.
//将 TS1设置为测量电池温度- 0x92FD = 0x07 (请参阅 TRM 第13.3.2.12节)
TX_3Byte[0]= 0xFD;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x07;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//将 TS3设置为测量 FET 温度- 0x92FF = 0x0F (请参阅 TRM 第13.3.2.14节)
TX_3Byte[0]= 0xFF;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x0F;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#endif
#if 1.
//设置 DFETOFF 引脚以控制 CHG 和 DSG FET - 0x92FB = 0x42 (设置为0x00以禁用)
//请参阅 TRM 第13.3.2.10节、表13-7
#if 0
TX_3Byte[0]= 0xFB;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0xC2;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#endif
//设置警报引脚- 0x92FC = 0x2A -请参阅 TRM 第13.3.2.11节、表13-8
//这会将警报引脚配置为在启用时驱动高电平(REG1电压)。
//其他可用选项包括低电平有效、驱动 HiZ、使用 REG18 (1.8V)的驱动、弱内部上拉和下拉
TX_3Byte[0]= 0xFC;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x2A;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#endif

#if 0
//设置电池平衡配置- 0x9335 = 0x03 -处于静置或充电模式时的自动平衡
//参见 TRM 第13.3.11节。 TRM 的第10章详细介绍了电池平衡
//另请参阅 TI.com 上的“使用 BQ76952、BQ76942电池监控器实现电池平衡”文档
TX_3Byte[0]= 0x35;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x03;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//设置 COV (过压)阈值- 0x9278 = 0x55 (4301mV)
// COV 阈值是该值乘以50.6mV、请参阅 TRM 第13.6.2节
TX_3Byte[0]= 0x78;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x55;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//设置 SCD 阈值- 0x9286 = 0x05 (在1m Ω 感应电阻上100mV = 100A)
//请参阅 TRM 部分13.6.7 0x05=100mV
TX_3Byte[0]= 0x86;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x05;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//设置 SCD 延迟- 0x9287 = 0x03 (30us)请参阅 TRM 第13.6.7节
//单位15us
TX_3Byte[0]= 0x87;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x03;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//将 SCDL 锁存限制设置为1,以便仅在卸载时设置 SCD 恢复0x9295 = 0x01
//如果未设置,则 SCD 将根据时间恢复(SCD 恢复时间参数)。
//参见 TRM 第13.6.11.1节
TX_3Byte[0]= 0x95;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x01;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#endif
//CUV
TX_3Byte[0]= 0x75;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x3D;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
//CUV 恢复迟滞
TX_3Byte[0]= 0x7B;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x02;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#if 1.
//COV
TX_3Byte[0]= 0x78;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x48;//;0x4B;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
//COV 恢复迟滞
TX_3Byte[0]= 0x7C;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x02;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#endif

#if 1.
//预充电启动 V
TX_4Byte[0]= 0x0A;TX_4Byte[1]= 0x93;TX_4Byte[2]= 0xB8;TX_4Byte[3]= 0x0B;// 0x48 0xF4
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//预充电停止 V
TX_4Byte[0]= 0x0C;TX_4Byte[1]= 0x93;TX_4Byte[2]= 0x1C;TX_4Byte[3]= 0x03;//0x1C F3;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//预放电超时
TX_3Byte[0]= 0x0E;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x00;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//预放电停止增量
TX_3Byte[0]= 0x0F;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x00;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//放电电流阈值
TX_4Byte[0]= 0x10;TX_4Byte[1]= 0x93;TX_4Byte[2]= 0x64;TX_4Byte[3]= 0x00;//0xE2; 0xFF
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
// HAL_DELAY (1);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//充电电流阈值
TX_4Byte[0]= 0x12;TX_4Byte[1]= 0x93;TX_4Byte[2]= 0x32;TX_4Byte[3]= 0x00;//0xF6 0xFF;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
// HAL_DELAY (1);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

#endif
//毛培养状态初始化
TX_4Byte[0]= 0x43;TX_4Byte[1]= 0x93;TX_4Byte[2]= 0x50;TX_4Byte[3]= 0x00;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
// HAL_DELAY (1);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//FET 选项
TX_3Byte[0]= 0x08;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x0F;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//保护配置
TX_4Byte[0]= 0x5F;TX_4Byte[1]= 0x92;TX_4Byte[2]= 0x00;TX_4Byte[3]= 0x00;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
// HAL_DELAY (1);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//取消保护 a
TX_3Byte[0]= 0x69;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0xE4;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
//COVL
TX_3Byte[0]= 0x7E;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x02;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
//Disccharg 保护 B
TX_3Byte[0]= 0x6A;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0xE6;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//Disccharg 保护 C
TX_3Byte[0]= 0x6B;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x00;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//体二极管
TX_4Byte[0]= 0x73;TX_4Byte[1]= 0x92;TX_4Byte[2]= 0xEC;TX_4Byte[3]= 0xFF;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
// HAL_DELAY (1);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//CC 增益
TX_6Byte[0]= 0xA8;TX_6Byte[1]= 0x91;TX_6Byte[2]= 0xF2;TX_6Byte[3]= 0x41;TX_6Byte[4]= 0x6f; TX_6Byte[5]= 0x41;
I2C_WriteReg (0x3E、TX_6Byte、6);
delayUS(1000);
TX_2Byte[0]=校验和(TX_6Byte、6);TX_2Byte[1]= 0x08;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//HDQ 配置
TX_3Byte[0]= 0x00;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x0F;//0x0B;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//DCHG 热敏电阻配置
TX_3Byte[0]= 0x01;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x0F;//0x0B;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#if 1.
//TS1温度偏移
TX_3Byte[0]= 0xCE;TX_3Byte[1]= 0x91;TX_3Byte[2]= 0x19;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//TS3温度偏移
TX_3Byte[0]= 0xD0;TX_3Byte[1]= 0x91;TX_3Byte[2]= 0x19;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//HDQ 温度偏移
TX_3Byte[0]= 0xD1;TX_3Byte[1]= 0x91;TX_3Byte[2]= 0x19;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//DCHG 温度偏移
TX_3Byte[0]= 0xD2;TX_3Byte[1]= 0x91;TX_3Byte[2]= 0x19;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

#endif
#if 0
//数据状态
TX_2Byte[0]= 0x76;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(1000);
I2C_ReadReg (0x40、RX_12字节、12);
CC3_CURRENT =(RX_12Byte[21]<<8)+(RX_12Byte[20]);
CC1_CURRENT =(RX_12Byte[23]<<8)+(RX_12Byte[22]);
RAW_CC2_Count =((RX_12Byte[27]<<24)+(RX_12Byte[26]<<16)+(RX_12Byte[25]<8)+ RX_12Byte[24]);
RAW_CC3_Count =((RX_12Byte[31]<<24)+(RX_12Byte[30][<16)+(RX_12Byte[29]<8)+ RX_12Byte[28]);
delayUS(1000);
#endif
#if 0
//TS3
TX_3Byte[0]= 0xFF;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x0B;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
//TS1
TX_3Byte[0]= 0xFD;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x0B;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#endif


#if 0
//***** 制造状态**** //
TX_4Byte[0]= 0x43;TX_4Byte[1]= 0x93;TX_4Byte[2]= 0x50;TX_4Byte[3]= 0x00;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
// HAL_DELAY (1);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x61、TX_2Byte、2);
delayUS(1000);
//********* //
/***** FET 选项******* //
TX_3Byte[0]= 0x08;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x1F;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
//********* //
//******** 在*******上的所有 FET //
TX_2Byte[0]= 0x96;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(1000);
//********* //
AFE_ReadFETStatus();
#endif
//退出 configupdate 模式-子命令0x0092
TX_2Byte[0]= 0x92;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(1000);

#if 0
void AFE_Protection_Thresholds ()

TX_2Byte[0]= 0x90;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
//电池 OV
TX_3Byte[0]= 0x78;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x51;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//Cell ov 释放
TX_3Byte[0]= 0x7B;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x4F;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//电池 UV
TX_3Byte[0]= 0x75;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x44;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//Cell UV Release
TX_3Byte[0]= 0x7C;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x55;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//OCD1
TX_3Byte[0]= 0x82;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x12;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//OCD2
TX_3Byte[0]= 0x84;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x15;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//OCD3
TX_4Byte[0]= 0x8A;TX_4Byte[1]= 0x92;TX_4Byte[2]= 0x38;TX_4Byte[3]= 0x00;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
// HAL_DELAY (1);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x61、TX_2Byte、2);
delayUS(1000);

//OCC
TX_3Byte[0]= 0x80;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x07;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//SCD
TX_3Byte[0]= 0x86;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x46;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//SCD 延迟
TX_3Byte[0]= 0x87;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x21;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//FET 温度
TX_3Byte[0]= 0xA0;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x5A;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//FET 温度释放
TX_3Byte[0]= 0xA2;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x4B;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//内部温度
TX_3Byte[0]= 0xA3;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x2D;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//内部温度释放
TX_3Byte[0]= 0xA5;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x28;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

#endif

void Protections_AFE (){
TX_2Byte[0]= 0x90;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

for (int i=0;i<15;i++)

TX_3Byt[0]= TX_1Byte_P[i];TX_3Byt[1]= 0x92、TX_3Byt[2]= TX_Byte_data[i];
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

TX_2Byte[0]= 0x92;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void Temp_protection(){
TX_2Byte[0]= 0x90;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(1000);
//FET 温度
TX_3Byte[0]= 0x75;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x48;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#if 0
//FET 温度释放
TX_3Byte[0]= 0xA2;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x4B;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
#endif
TX_2Byte[0]= 0x92;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);



void alert_protection_B (){
TX_2Byte[0]= 0x90;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(1000);

I2C_ReadReg (0x04、RX_2Byte、2);
ALERT_B =(RX_2Byte[1]*256 + RX_2Byte[0]);
OTF = 0x8 & RX_2Byte[0];
delayUS(1000);
TX_2Byte[0]= 0x92;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void protect_aFE (){

TX_2Byte[0]= 0x90;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(1000);
for (int i=0;i<16;i++)

for (int j =0;j<4;j++)

TX_3Byte[j]= TX_Byte_arr[i][j];

I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);


delayUS(1000);
TX_2Byte[0]= 0x92;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);


void Enable_REG1 ()

TX_2Byte[0]= 0x90;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
//'re 4/0 Config'-设置 REG0_EN 位以启用前置稳压器
TX_3Byte[0]= 0x37;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x01;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

//'re 4/12 Config'-启用具有3.3V 输出的 REG1
TX_3Byte[0]= 0x36;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x0D;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);
//退出 configupdate 模式-子命令0x0092
TX_2Byte[0]= 0x92;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
//delayUS(1000);

/********* Rohith ********编写的函数 //
void AFE_FETOptions(){
TX_3Byte[0]= 0x08;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x1F;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

void AFE_ManufacturingStatus (){

TX_4Byte[0]= 0x43;TX_4Byte[1]= 0x93;TX_4Byte[2]= 0x50;TX_4Byte[3]= 0x00;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
// HAL_DELAY (1);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x61、TX_2Byte、2);
delayUS(1000);


void Manufacturing 状态读取(){


void pdsg_test(){
TX_2Byte[0]= 0x1C;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void PCHG_TEST (){
TX_2Byte[0]= 0x1E;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void CHG_TEST (){
TX_2Byte[0]= 0x1F;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void DSG_TEST (){
TX_2Byte[0]= 0x20;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void charge pump(){
TX_3Byte[0]= 0x09;TX_3Byte[1]= 0x93;TX_3Byte[2]= 0x01;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);
delayUS(1000);

void ComM_Type (){
TX_3Byte[0]= 0x39;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x12;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);

void Swap_Comm_Mode (){
TX_2Byte[0]= 0x90;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);


TX_3Byte[0]= 0x39;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x12;
I2C_WriteReg (0x3E、TX_3Byte、3);
//delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);

TX_2Byte[0]= 0xBC;TX_2Byte[1]= 0x29;
I2C_WriteReg (0x3E、TX_2Byte、2);

TX_2Byte[0]= 0x92;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void Dfet_off (){

TX_3Byte[0]= 0xFB;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x00;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);

void CFET_OFF (){

TX_3Byte[0]= 0xFA;TX_3Byte[1]= 0x92;TX_3Byte[2]= 0x00;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);


void Status_Read(){
uint8_t rd_data;
TX_2Byte[0]= 0x57;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(2000);
I2C_ReadReg (0x40、RX_2Byte、2);
RD_DATA =(RX_2Byte[1]*256 + RX_2Byte[0]);

void Vcell(){
TX_4Byte[0]= 0x04;TX_4Byte[1]= 0x93;TX_4Byte[2]= 0x00;TX_4Byte[3]= 0x00;
I2C_WriteReg (0x3E、TX_4Byte、4);
delayUS(1000);
TX_2Byte[0]=校验和(TX_4Byte、4);TX_2Byte[1]= 0x06;//校验和和长度
I2C_WriteReg (0x60、TX_2Byte、2);

//********* 结束******* //
// FET 控制命令

void AFE_FET_ENABLE(){
//切换制造状态寄存器中的 FET_EN 位。 因此、该命令可用于启用或禁用 FET。
TX_2Byte[0]= 0x22;TX_2Byte[1]= 0x00;//0x22
I2C_WriteReg (0x3E、TX_2Byte、2);

void AFE_FET_Control (uint8_t FET_States){// bit 3 = PCHG_OFF、bit 2 = CHG_OFF、bit 1 = PDSG_OFF、bit 0 = DSG_OFF
TX_3Byte[0]= 0x97;TX_3Byte[1]= 0x00;TX_3Byte[2]= FET_States;
I2C_WriteReg (0x3E、TX_3Byte、3);
delayUS(1000);
TX_2Byte[0]=校验和(TX_3Byte、3);TX_2Byte[1]= 0x05;
I2C_WriteReg (0x60、TX_2Byte、2);

void DSG_PDSG_OFF (){
//禁用放电(和预放电) FET
//子命令0x0093请参阅 TRM 表5-8 (DSG_PDSG_OFF ())
TX_2Byte[0]= 0x93;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void CHG_PCHG_OFF (){
//禁用充电(和预充电) FET
//子命令0x0094请参阅 TRM 表5-8 (CHG_PCHG_OFF ())
TX_2Byte[0]= 0x94;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void AFE_All_FET_OFF (){
//使用命令0x0095禁用所有 FET 请参阅 TRM 表5-8
TX_2Byte[0]= 0x95;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void AFE_All_FETs_on (){
//要使用命令0x0096启用的所有 FET 请参阅 TRM 表5-8
TX_2Byte[0]= 0x96;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void AFE_BOTHOFF (){
//使用 DFETOFF (BOTHOFF)引脚禁用所有 FET
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_8、GPIO_PIN_SET);// DFETOFF 引脚(BOTHOFF)设置为低电平

void AFE_RESET_BOTHOFF (){
//重置 DFETOFF (BOTHOFF)引脚
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_8、GPIO_PIN_RESET);// DFETOFF 引脚(BOTHOFF)设置为低电平

void AFE_ReadFETStatus(){
//读取 FET 状态以查看启用了哪些 FET
I2C_ReadReg (0x7F、RX_2Byte、2);
FET_Status =(RX_2Byte[1]*256 + RX_2Byte[0]);
DCHG = 0x4 & RX_2Byte[0];//放电 FET 状态
CHG = 0x1 & RX_2Byte[0];//充电 FET 状态
PCHG = 0x2 & RX_2Byte[0];//预充电 FET 状态
PDSG = 0x8 & RX_2Byte[0];//预放电 FET 状态
DDSG = 0x4 & RX_2Byte[1];


// FET 控制命令结束


// AFE 电池平衡命令

void CB_ACTIVE_Cells (){
//检查哪些电池正在平衡的状态
TX_2Byte[0]= 0x83;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
I2C_ReadReg (0x40、RX_2Byte、2);
CB_ActiveCells =(RX_2Byte[1]*256 + RX_2Byte[0]);

void CFET_OFF_LO (){
TX_2Byte[0]= 0x28;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void DFET_OFF_LO (){
TX_2Byte[0]= 0x28;TX_2Byte[1]= 0x01;
I2C_WriteReg (0x3E、TX_2Byte、2);

// AFE 电池平衡命令结束


// AFE 电源命令
void AFE_DeepSleep (){
//将器件置于深度睡眠模式。 请参阅 TRM 第7.4节
TX_2Byte[0]= 0x0F;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
I2C_WriteReg (0x3E、TX_2Byte、2);

void AFE_ExitDeepSleep (){
//退出深度睡眠模式。 请参阅 TRM 第7.4节
TX_2Byte[0]= 0x0E;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void AFE_ShutdownCommand (){
//将器件置于关断模式。 请参阅 TRM 第7.5节
TX_2Byte[0]= 0x10;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void AFE_ShutdownPin (){
//使用 RST_SHUT 引脚将器件置于关断模式
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_9、GPIO_PIN_SET);//设置 RST_SHUT 引脚

void AFE_ReleaseShutdownPin (){
//释放 RST_SHUT 引脚
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_9、GPIO_PIN_RESET);//重置 RST_SHUT 引脚

void AFE_SLEEP_ENABLE (){// SLEEP_ENABLE 0x0099
//允许器件在电流低于睡眠电流时进入睡眠模式。 请参阅 TRM 第7.3节
TX_2Byte[0]= 0x99;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void AFE_SLEEP_DISABLE (){// SLEEP_DISABLE 0x009A
//使器件退出睡眠模式。 请参阅 TRM 第7.3节
TX_2Byte[0]= 0x9A;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

// AFE 电源命令结束


// AFE 状态和故障命令

uint16_t AFE_ReadAlarmStatus(){
//读取该寄存器以找出警报引脚被置为有效的原因。 有关完整说明、请参阅 TRM 的第6.6节。
uint8_t 状态= 0;
I2C_ReadReg (0x62、RX_2Byte、2);
状态=(RX_2Byte[1]*256 + RX_2Byte[0]);
退货状态;

void AFE_ReadSafetyStatus(){
//读取安全状态 A/B/C 并查找设置了哪些位
//这显示触发了哪些主要保护
I2C_ReadReg (0x03、RX_2Byte、2);
SafetyStatusA =(RX_2Byte[1]*256 + RX_2Byte[0]);
UV_Fault = 0x4 & RX_2Byte[0];
OV_Fault = 0x8 & RX_2Byte[0];
SCD_Fault=0x8 & RX_2Byte[1];
OCD_Fault = 0x2 & RX_2Byte[1];
I2C_ReadReg (0x05、RX_2Byte、2);
SafetyStatusB =(RX_2Byte[1]*256 + RX_2Byte[0]);
OTF_Fault = 0x8 & RX_2Byte[1];
I2C_ReadReg (0x07、RX_2Byte、2);
SafetyStatusC =(RX_2Byte[1]*256 + RX_2Byte[0]);

void AFE_ReadPFStatus(){
//读取永久性故障状态 A/B 并查找设置了哪些位
//这显示触发了哪些永久性故障
I2C_ReadReg (0x0B、RX_2Byte、2);
PFStatusA =(RX_2Byte[1]*256 + RX_2Byte[0]);
I2C_ReadReg (0x0D、RX_2Byte、2);
PFStatusB =(RX_2Byte[1]*256 + RX_2Byte[0]);
I2C_ReadReg (0x0F、RX_2Byte、2);
PFStatusC =(RX_2Byte[1]*256 + RX_2Byte[0]);


void AFE_ControlStatus(){
//控制状态寄存器-位0 - LD_ON (检测到负载)
//请参阅 TRM 表6-1
I2C_ReadReg (0x00、RX_2Byte、2);
LD_ON = 0x1 & RX_2Byte[0];

void AFE_BatteryStatus(){
//电池状态寄存器-请参阅 TRM 表6-2
I2C_ReadReg (0x12、RX_2Byte、2);

void AFE_ClearVault (){
TX_2Byte[0]= 0x00;TX_2Byte[1]= 0xf8;
I2C_WriteReg (0x62、TX_2Byte、2);

void AFE_ClearScanBits (){
TX_2Byte[0]= 0x82;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x62、TX_2Byte、2);

void AFE_PFReset (){
TX_2Byte[0]= 0x29;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

uint16_t AFE_DeviceID (){
//使用子命令0x0001读取设备 ID
TX_2Byte[0]= 0x01;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(500);
I2C_ReadReg (0x40、RX_2Byte、2);
返回(RX_2Byte[1]*256 + RX_2Byte[0]);

void AFE_STATUS (){

TX_2Byte[0]= 0x75;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(1000);
I2C_ReadReg (0x40、RX_32byte、32);
MAX_CELL =(RX_32byt[5]<<8)+(RX_32byte[4]);
MIN_CELL =(RX_32BYTE[7]<8)+(RX_32BYTE[6]);
battery_volte_sum =(RX_32byt[9]<<8)+(RX_32byte[8]);
Avg_CELL_temp =(RX_32byt[11]<8)+(RX_32byt[10]);
FET_temp =(RX_32byt[13]<<8)+(RX_32byt[12]);
MAX_CELL_temp =(RX_32BYTE[15]<<8)+(RX_32BYTE[14]);
min_cell_temp =(RX_32byte[17]<<8)+(RX_32byte[16]);
Avg_min_max_temp =(RX_32byt[19]<<8)+(RX_32byt[18]);
CC3_CURRENT =(RX_32BYTE[21]<<8)+(RX_32BYTE[20]);
CC1_CURRENT =(RX_32BYTE[23]<<8)+(RX_32BYTE[22]);
RAW_CC2_Count =((RX_32byt[27]<<24)+(RX_32byt[26]<<16)+(RX_32byt[25]<8)+ RX_32byt[24]);
RAW_CC3_Count =((RX_32byt[31]<<24)+(RX_32byt[30]<<16)+(RX_32byt[29]<8)+ RX_32byt[28]);

delayUS(1000);

// AFE 状态和故障命令结束


// AFE 测量命令

uint16_t AFE_ReadCellVoltage (uint8_t CHANNEL){
I2C_ReadReg (通道*2+0x14、RX_2Byte、2);/0x14
返回(RX_2Byte[1]*256 + RX_2Byte[0]);//电池电压以 mV 为单位报告

uint16_t AFE_ReadStackVoltage (){
I2C_ReadReg (0x34、RX_2Byte、2);
返回10 *(RX_2Byte[1]*256 + RX_2Byte[0]);//电压以0.01V 为单位报告

uint16_t AFE_ReadPackVoltage (){
I2C_ReadReg (0x36、RX_2Byte、2);
返回10 *(RX_2Byte[1]*256 + RX_2Byte[0]);//电压以0.01V 为单位报告

uint16_t AFE_ReadLDVoltage (){
I2C_ReadReg (0x38、RX_2Byte、2);
返回10 *(RX_2Byte[1]*256 + RX_2Byte[0]);//电压以0.01V 为单位报告

uint16_t AFE_ReadCurrent (){
//uint8_t cure = 0;
I2C_ReadReg (0x3A、RX_2Byte、2);
返回(RX_2Byte[1]*256 + RX_2Byte[0]);//电流以 mA 为单位报告

float AFE_ReadTemperature (uint8_t channel){
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_15、GPIO_PIN_SET);
开关(通道)

情况0:
I2C_ReadReg (0x70、RX_2Byte、2);// TS1引脚
中断;
案例1:
I2C_ReadReg (0x74、RX_2Byte、2);// TS3引脚、FET 温度
中断;
案例2:
I2C_ReadReg (0x76、RX_2Byte、2);// HDQ、FET 温度
中断;
案例3:
I2C_ReadReg (0x78、RX_2Byte、2);// DCHG 引脚、FET 温度
中断;
默认值:break;

返回(0.1 *(float)(RX_2Byte[1]*256 + RX_2Byte[0]))- 273.15;//将0.1K 转换为 Celcius


void AFE_ReadPassQ(){
//读取累积的电荷和 DASTATUS6的时间(请参阅 TRM 表4-6)
TX_2Byte[0]= 0x76;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);
delayUS(1000);
I2C_ReadReg (0x40、RX_12字节、12);
累加器介入_Int =((RX_12Byte[3]<<24)+(RX_12Byte[2]<<16)+(RX_12Byte[1]<8)+ RX_12Byte[0]);
累加器强_分数=((RX_12Byte[7]<<24)+(RX_12Byte[6]<<16)+(RX_12Byte[5]<8)+ RX_12Byte[4]);
累加器时间=((RX_12Byte[11]<24)+(RX_12Byte[10][<16)+(RX_12Byte[9]<8)+ RX_12Byte[8]);

void AFE_ClearPassQ(){
//清除累积的电荷和时间,命令0x0082
TX_2Byte[0]= 0x82;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);

void config_mode(){
TX_2Byte[0]= 0x90;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);


void Exit_config_mode(){
TX_2Byte[0]= 0x92;TX_2Byte[1]= 0x00;
I2C_WriteReg (0x3E、TX_2Byte、2);


// AFE 测量命令结束

/*用户代码末尾 PFP */

/*私人用户代码------------------------------------------------------- *
/*用户代码开始0 */
PUTCHAR_prototype

/*将您的 putc 实现放在此处*/
//例如,将字符写入 EVAL_COM1和 Loop,直到传输结束*/

// HAL_UART_transmit (&huart2、(uint8_t *)&ch、1、0xFFFF);
HAL_UART_Transmit (&huart1、(uint8_t *)&ch、1、0xFFFF);
返回通道;

/**
*@简要将 C 库 printf 函数重定位到 USART。
*@param 无
*@Retval 无
*
/*用户代码结束0 */

/**
*@简要介绍应用程序入口点。
*@retval int
*
int main (空)

/*用户代码 begin 1 */
volatile int i = 0;
char UART_buf[50];
int UART_buf_len;

/*用户代码结束1 */

/* MCU 配置------------------------------------------------------- *

/*复位所有外设、初始化闪存接口和 SysTick。 *
HAL_Init();

/*用户代码 begin Init */

/*用户代码结束初始化*/

/*配置系统时钟*/
SystemClock_Config();

/*用户代码 begin sysinit */

/*用户代码结束 sysinit */

/*初始化所有已配置的外设*/
mx_GPIO_Init();
mx_I2C1_Init();
MX_TIM1_Init();
mx_USART1_UART_Init();
MX_TIM2_Init();
/*用户代码 begin 2 */
//DFET 引脚 fetofff (低电平)
HAL_TIM_Base_Start (&H);
// Protections_AFE ();


//HAL_GPIO_WritePin (GPIOC、GPIO_PIN_7、GPIO_PIN_RESET);// DEFET 引脚
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_3、GPIO_PIN_RESET);

delayUS(10000);

AFE_RESET();
delayUS(60000);
//Temp_protection();
PROTECT_AFE ();
//delayUS(10000);
// Dec_TO_Hex (65521);
DRE_TO_Bin (65521);
AFE_Init();

delayUS(10000);
#if 0 //测试模式
AFE_FET_Control (0x00);
AFE_ReadFETStatus();
delayUS(10000);
DSG_TEST ();
AFE_ReadFETStatus();
delayUS(10000);

chg_test();
AFE_ReadFETStatus();
delayUS(10000);
pdsg_test();
AFE_ReadFETStatus();
delayUS(10000);
PCHG_TEST ();
AFE_ReadFETStatus();
delayUS(10000);
#endif
#if 1.
//AFE_FET_ENABLE ();
//delayUS(10000);
AFE_All_FETs_on ();
delayUS(10000);
AFE_ReadFETStatus();
delayUS(10000);
//CHG_PCHG_OFF ();
//delayUS(10000);
AFE_ReadFETStatus();
AFE_SLEEP_DISABLE();
#endif
delayUS (60000);delayUS (60000);delayUS (60000);delayUS (60000);//等待 FET 关闭后开始测量
CellVoltage[1]= AFE_ReadCellVoltage (1);
CellVoltage[5]= AFE_ReadCellVoltage (5);
CellVoltage[10]= AFE_ReadCellVoltage (10);
STACK_Voltage = AFE_ReadStackVoltage ();
PACK_Voltage = AFE_ReadPackVoltage ();
LD_Voltage = AFE_ReadLDVoltage ();
//PACK_CURRENT = AFE_ReadCurrent ();
//Temperature[0]= AFE_ReadTemperature (0);
//FET_Temperature = AFE_ReadTemperature (1);
//HDQ_Temp = AFE_ReadTemperature (2);
//DCHG_Temp = AFE_ReadTemperature (3);
//DDSG_Temp = AFE_ReadTemperature (4);

#if 0
AFE_SLEEP_DISABLE();
AFE_ManufacturingStatus();
AFE_ReadFETStatus();
电荷泵();
AFE_FETOptions();
// AFE_FET_ENABLE ();
AFE_FET_Control (0x00);
AFE_ReadFETStatus();
AFE_All_FETs_on ();
AFE_ReadFETStatus();
#endif

HAL_StatusTypeDef stat = HAL_OK;
STAT = HAL_I2C_IsDeviceReady (&hi2c1、0x10、2、10);
if (stat =HAL_OK)



/*用户代码末尾2 */

/*无限循环*/
/*用户代码在*/时开始
while (1)

/*用户代码结束,同时*/

/*用户代码 begin 3 */
// alert_protection_B ();
AFE_ReadAlarmStatus();
// AFE_STATUS();
PACK_CURRENT = AFE_ReadCurrent ();
//电流= PACK_CURRENT * 14.9538;
AFE_ReadFETStatus();
// HAL_GPIO_WritePin (RS485_1_RO_DO_UC_GPIO_Port、UC_RDE_DO_RS485_1_Pin、1);//启用 uart1
// HAL_GPIO_WritePin (uC_DI_DO_RS485_1_GPIO_Port、uC_RDE_DO_RS485_1_Pin、1);//启用 UART1
// HAL_GPIO_WritePin (GPIOA、GPIO_PIN_10、1);//启用 UART1
HAL_GPIO_WritePin (DEBUG_RX_DO_GPIO_Port、DEBUG_RDE_DO_Pin、1);
printf ("cv \n");
for (int i = 0;i <=15;i++)

CellVoltage[i]= AFE_ReadCellVoltage (i);
printf ("[%d]=%d|"、I、CellVoltage);


温度[0]= AFE_ReadTemperature (0)* 10;
printf ("环境温度:%d"、Temperature[0]);
FET_Temperature = AFE_ReadTemperature (1)* 10;
printf ("温度 MOSFET:%d"、FET_Temperature);
HDQ_Temp = AFE_ReadTemperature (2)* 10;
printf (“HDQ 温度:%d”,HDQ_Temp);
DCHG_Temp = AFE_ReadTemperature (3)* 10;
printf (“DCHG 温度:%d”,DCHG_Temp);
// DDSG_Temp = AFE_ReadTemperature (4);
//PA10端口、PA8引脚、1.
HAL_GPIO_WritePin (DEBUG_RX_DO_GPIO_Port、DEBUG_RDE_DO_Pin、1);
// HAL_GPIO_WritePin (RS485_1_RO_DO_UC_GPIO_Port、UC_RDE_DO_RS485_1_Pin、1);//启用 uart1
// HAL_GPIO_WritePin (RDE_DO_GPIO_Port、RDE_DO_Pin、0);//禁用 uart2
// HAL_GPIO_WritePin (GPIOA、GPIO_PIN_10、1);//启用 UART1
// HAL_GPIO_WritePin (RS485_1_RO_DO_UC_GPIO_Port、UC_RDE_DO_RS485_1_Pin、0);//禁用 UART1
#if 1.
AFE_ReadSafetyStatus();
IF (AlarmBits & 0x82){
AFE_ClearScanBits();

IF (AlarmBits & 0xC000){
AFE_ReadSafetyStatus();
AFE_ReadPFStatus();
AFE_ClearVault ();
AFE_PFReset ();

#endif

/*用户代码结束3 */

/**
*@简要系统时钟配置
*@Retval 无
*
空系统时钟配置(空)

RCC_OscInitTypeDef RCC_OscInitStruct={0};
RCC_ClkInitTypeDef RCC_ClkInitStruct={0};
RCC_PeriphCLKInitTypeDef PeriphClkInit ={0};

/**根据指定的参数初始化 RCC 振荡器
*在 RCC_OscInitTypeDef 结构中。
*
RCC_OscInitStruct.OscatorType = RCC_OSCILATORTYPE_MSI;
RCC_OscInitStruct.MSIState = RCC_MSI_ON;
RCC_OscInitStruct.MSICalibrationValue = 0;
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 36;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
IF (HAL_RCC_OscConfig (&RCC_OscInitStruct)!= HAL_OK)

ERROR_Handler();

/**初始化 CPU、AHB 和 APB 总线时钟
*
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLK 分频器= RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, flash_latit_4)!= HAL_OK)

ERROR_Handler();

PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1;
PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig (&PeriphClkInit)!= HAL_OK)

ERROR_Handler();

/**配置主内部稳压器输出电压
*
if (HAL_PWREx_ControlVoltageScaling (PWR_Regulator _VOLTAGE_SCALE1)!= HAL_OK)

ERROR_Handler();

/**
*@I2C1初始化函数简介
*@param 无
*@Retval 无
*
静态空 MX_I2C1_Init (空)

/*用户代码 begin I2C1_Init 0 */

/*用户代码结束 I2C1_Init 0 */

/*用户代码 begin I2C1_Init 1 */

/*用户代码结束 I2C1_Init 1 */
hi2c1.instance = I2C1;
hi2c1.Init.Timing = 0x10808DD3;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init (&hi2c1)!= HAL_OK)

ERROR_Handler();

/**配置模拟过滤器
*
if (HAL_I2CEx_ConfigAnalogFilter (&hi2c1、I2C_ANALOGUEFILTER_ENABLE)!= HAL_OK)

ERROR_Handler();

/**配置数字过滤器
*
if (HAL_I2CEx_ConfigDigitalFilter (&hi2c1、0)!= HAL_OK)

ERROR_Handler();

/*用户代码 begin I2C1_Init 2 */

/*用户代码结束 I2C1_Init 2 */

/**
*@TIM1初始化函数简介
*@param 无
*@Retval 无
*
静态空 MX_TIM1_Init (空)

/*用户代码 begin TIM1_Init 0 */

/*用户代码结束 TIM1_Init 0 */

TIM_ClockConfigTypeDef sClockSourceConfig ={0};
TIM_MasterConfigTypeDef sMasterConfig ={0};

/*用户代码 begin TIM1_Init 1 */

/*用户代码结束 TIM1_Init 1 */
hdim1.instance = TIM1;
Htim1.Init.Prescaler = 63;
Htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.period = 65535;
Htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
hdim1.Init.RefetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init (&htim1)!= HAL_OK)

ERROR_Handler();

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource (&htim1、&sClockSourceConfig)!= HAL_OK)

ERROR_Handler();

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_Timex_MasterConfigSynchronization (&htim1、&sMasterConfig)!= HAL_OK)

ERROR_Handler();

/*用户代码 begin TIM1_Init 2 */

/*用户代码结束 TIM1_Init 2 */

/**
*@TIT2初始化函数简介
*@param 无
*@Retval 无
*
静态空 MX_TIM2_Init (空)

/*用户代码 begin TIM2_Init 0 */

/*用户代码结束 TIM2_Init 0 */

TIM_ClockConfigTypeDef sClockSourceConfig ={0};
TIM_MasterConfigTypeDef sMasterConfig ={0};
TIM_OC_InitTypeDef sConfigOC ={0};

/*用户代码 begin TIM2_Init 1 */

/*用户代码结束 TIM2_Init 1 */
hdim2.instance = TIT2;
hdim2.Init.Prescaler = 63;
Htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
hdim2.Init.period = 65535;
Htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init (&htim2)!= HAL_OK)

ERROR_Handler();

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource (&htim2、&sClockSourceConfig)!= HAL_OK)

ERROR_Handler();

if (HAL_TIM_OC_Init (&htim2)!= HAL_OK)

ERROR_Handler();

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_Timex_MasterConfigSynchronization (&htim2、&sMasterConfig)!= HAL_OK)

ERROR_Handler();

sConfigOC.OCMode = TIM_OCMODE_TIM;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFast_disable;
if (HAL_TIM_OC_ConfigChannel (&htim2、&sConfigOC、TIM_CHANNEL)!= HAL_OK)

ERROR_Handler();

if (HAL_TIM_OC_ConfigChannel (&htim2、&sConfigOC、TIM_CHANNEL)!= HAL_OK)

ERROR_Handler();

if (HAL_TIM_OC_ConfigChannel (&htim2、&sConfigOC、TIM_CHANNEL 3)!= HAL_OK)

ERROR_Handler();

if (HAL_TIM_OC_ConfigChannel (&htim2、&sConfigOC、TIM_CHANNEL)!= HAL_OK)

ERROR_Handler();

/*用户代码 begin TIM2_Init 2 */

/*用户代码结束 TIM2_Init 2 */

/**
*@简要 USART1初始化函数
*@param 无
*@Retval 无
*
静态空 MX_USART1_UART_Init (空)

/*用户代码 begin USART1_Init 0 */

/*用户代码结束 USART1_Init 0 */

/*用户代码 begin USART1_Init 1 */

/*用户代码结束 USART1_Init 1 */
huart1.instance = USART1;
huart1.Init.budrate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.stopbits = UART_stopbits_1;
huart1.Init.Parity = UART_parity;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.oversing= UART_oversing_16;
huart1.Init.OneBitSampling = UART_one_bit_sample_disable;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init (&huart1)!= HAL_OK)

ERROR_Handler();

/*用户代码 begin USART1_Init 2 */

/*用户代码结束 USART1_Init 2 */

/**
*@简单 GPIO 初始化函数
*@param 无
*@Retval 无
*
静态空 MX_GPIO_Init (空)

GPIO_InitTypeDef GPIO_InitStruct={0};

/* GPIO 端口时钟启用*/
_HAL_RCC_GPIOA_CLK_ENABLE ();
_HAL_RCC_GPIOC_CLK_ENABLE();
_HAL_RCC_GPIOD_CLK_ENABLE ();
_HAL_RCC_GPIOB_CLK_ENABLE ();

/*配置 GPIO 引脚输出电平*/
HAL_GPIO_WritePin (RST_SHIT_B_UC_GPIO_Port、RST_SHIT_B_UC_Pin、GPIO_PIN_RESET);

/*配置 GPIO 引脚输出电平*/
HAL_GPIO_WritePin (DFETOFF_B_UC_GPIO_Port、DFETOFF_B_UC_Pin、GPIO_PIN_RESET);

/*配置 GPIO 引脚输出电平*/
HAL_GPIO_WritePin (GPIOA、DEBUG_RDE_DO_PIN|UC_TEMP_EN_DO_M_Pin、GPIO_PIN_SET);

/*配置 GPIO 引脚输出电平*/
HAL_GPIO_WritePin (RDE_DO_GPIO_Port、RDE_DO_Pin、GPIO_PIN_RESET);

/*配置 GPIO 引脚:RST_SHIT_B_UC_Pin DEBUG_RDE_DO_Pin UC_TEMP_EN_DO_M_Pin *
GPIO_InitStruct.Pin = RST_SHut_B_uC_Pin |调试_RDE_DO_Pin | uC_TEMP_EN_DO_M_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPSI_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPED_FREQ_LOW;
HAL_GPIO_Init (GPIOA、&GPIO_InitStructt);

/*配置 GPIO 引脚:DFETOFF_B_UC_Pin */
GPIO_InitStruct.Pin = DFETOFF_B_uC_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPSI_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPED_FREQ_LOW;
HAL_GPIO_Init (DFETOFF_B_UC_GPIO_Port、&GPIO_InitStructt);

/*配置 GPIO 引脚:RDE_DO_Pin */
GPIO_InitStruct.Pin = RDE_DO_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPSI_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPED_FREQ_LOW;
HAL_GPIO_Init (RDE_DO_GPIO_Port、&GPIO_InitStructt);

/*用户代码 begin 4 */

/*用户代码结束4 */

/**
*@简述如果发生错误、则执行此函数。
*@Retval 无
*
空 Error_Handler (空)

/*用户代码 begin Error_Handler_debug */
/*用户可以添加自己的实现以报告 HAL 错误返回状态*/
_disable_IRQ ();
while (1)


/*用户代码 End Error_Handler_debug */

#ifdef use_full_assert
/**
*@brief 会报告源文件的名称和源行号
*发生了 assert_param 错误的位置。
*@param 文件:指向源文件名的指针
*@param 行:assert_param 错误行源代码
*@Retval 无
*
void assert_failed (uint8_t *文件、uint32_t 行)

/*用户代码 begin 6 */
/*用户可以添加自己的实施以报告文件名和行号,
示例:printf ("错误的参数值:第%d\r\n"行上的文件%s、文件、行)*/
/*用户代码结束6 */

#endif /* use_full_assert */

/******** (c)版权所有 STMicroelectronics ***** 文件末尾****/

谢谢、此致、

罗希思西