ZDBMS/output/AFE.lst

564 lines
26 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

C51 COMPILER V9.01 AFE 02/22/2025 15:36:21 PAGE 1
C51 COMPILER V9.01, COMPILATION OF MODULE AFE
OBJECT MODULE PLACED IN .\output\AFE.obj
COMPILER INVOKED BY: D:\Tool\Keil\C51\BIN\C51.EXE code_drv\AFE.c LARGE OPTIMIZE(7,SIZE) REGFILE(.\output\MCUCore_Load.OR
-C) BROWSE INTVECTOR(0X1000) INCDIR(.\header_app;.\header_drv;.\code_gasguage;.\code_classb\iec60730_lib\include;.\code_c
-lassb\iec60730_proc\Include;.\code_classb\config) DEBUG OBJECTEXTEND PRINT(.\output\AFE.lst) OBJECT(.\output\AFE.obj)
line level source
1 /********************************************************************************
2 Copyright (C), Sinowealth Electronic. Ltd.
3 Author: Sino
4 Version: V0.0
5 Date: 2020/04/26
6 History:
7 V2.0 2020/04/26 Preliminary
8 ********************************************************************************/
9 #include "Main.h"
10
11 //AFE相关的变量
12 BOOL bAfeAlarmFlg;
13 BOOL bCADCFlg;
14 BOOL bVADCFlg;
15 BOOL bAfeI2CRWErrFlg;
16 BOOL bAfeErr;
17 U8 data ucCellNum; //当前硬件电芯串数
18 U8 data ucCellNumOffset; //当前硬件电芯连接方式对应的偏移用于程序读取AFE对应寄
-存器
19 U16 data uiCellVmax; //电芯电压最大值
20 U16 data uiCellVmin; //电芯电压最小值
21 U16 xdata uiVadcVmax; //ADC采集最大值
22 U16 xdata uiVadcVmin; //ADC采集最小值
23 U8 xdata ucTempeMiddle;
24 U16 xdata uiTempeMin;
25 U16 xdata uiTempeMax;
26 S32 xdata slCadcCurrent;
27 S32 xdata slCadcCurAverage;
28 U8 xdata ucCadcCnt;
29 S32 xdata slCadcCurBuf[16];
30 U8 xdata ucAfeI2CErrDelayCnt;
31 SYSINFOR xdata Info; //经过计算的值
32 AFEDATA xdata AFE; //AFE寄存器读取的值
33 AFEREG xdata REG; //AFE寄存器预设值
34
35
36
37 /*************************************************************************************************
38 * 函数名: AFETwiCheck
39 * 参 数: 无
40 * 返回值: 无
41 * 描 述: 连续5S检测到AFE的I2C通讯错误则置位bAfeErr=1
42 *************************************************************************************************/
43 void AFETwiCheck(void)
44 {
45 1 if(bAfeI2CRWErrFlg)
46 1 {
47 2 if(++ucAfeI2CErrDelayCnt >= TIME_1S_5S)
48 2 {
49 3 bAfeErr = 1;
50 3 ucAfeI2CErrDelayCnt = TIME_1S_5S;
51 3 }
52 2 }
C51 COMPILER V9.01 AFE 02/22/2025 15:36:21 PAGE 2
53 1 else
54 1 {
55 2 ucAfeI2CErrDelayCnt = 0;
56 2 }
57 1 }
58
59
60 /*************************************************************************************************
61 * 函数名: AFEWriteReg
62 * 参 数: Reg寄存器地址
63 WrBuf写的数据1Byte数据+1Byte CRC
64 * 返回值: 1:成功0:失败
65 * 描 述: 写AFE寄存器每次写一个寄存器
66 *************************************************************************************************/
67 BOOL AFEWriteReg(U8 Reg, U8 Length, U8 xdata *WrBuf)
68 {
69 1 BOOL Result = 0;
70 1 U8 Times = 0;
71 1 U8 i;
72 1
73 1 if(!bAfeErr)
74 1 {
75 2 for(i=0; i<Length; i++)
76 2 {
77 3 while(Times++ < 5)
78 3 {
79 4 #ifdef TWI_Hardware_Module
80 4 {
81 5 Result = TwiWrite(AFE_ID, Reg, TWI_ADDR_1B, 1, TWI_CRC_YES, WrBuf);
82 5 }
83 4 #else
{
Result = TwiWrite(AFE_ID, Reg, 1, WrBuf);
}
#endif
88 4 if(Result)
89 4 {
90 5 break;
91 5 }
92 4 else
93 4 {
94 5 TWICON = 0; //Close TWI module
95 5 Delay1ms(1);
96 5 TwiInit(); //Reinitial
97 5 Delay1ms(1);
98 5 }
99 4 }
100 3 if(Times >= 5)
101 3 {
102 4 break;
103 4 }
104 3 else
105 3 {
106 4 Times = 0;
107 4 Reg++;
108 4 WrBuf++;
109 4 }
110 3 Delay1ms(1);
111 3 }
112 2 }
113 1 bAfeI2CRWErrFlg = !Result; //标记通讯是否正常
114 1
C51 COMPILER V9.01 AFE 02/22/2025 15:36:21 PAGE 3
115 1 return Result;
116 1 }
117
118
119 /*************************************************************************************************
120 * 函数名: AFEReadReg
121 * 参 数: Reg寄存器地址
122 RdBuf读的数据2Byte数据+1Byte CRC
123 * 返回值: 1:成功0:失败
124 * 描 述: 读AFE寄存器每次连续读两个寄存器
125 *************************************************************************************************/
126 BOOL AFEReadReg(U8 Reg, U8 Length , U8 xdata *RdBuf)
127 {
128 1 BOOL Result = 0;
129 1 U8 Times = 0;
130 1
131 1 if(!bAfeErr)
132 1 {
133 2 while(Times++ < 5) //如果读数出错则Try 5次
134 2 {
135 3 #ifdef TWI_Hardware_Module
136 3 Result = TwiRead(AFE_ID, Reg, TWI_ADDR_1B, Length, TWI_CRC_YES, RdBuf);
137 3 #else
Result = TwiRead(AFE_ID, Reg, Length, RdBuf);
#endif
140 3 if(Result) //如果读数成功且CRC校验正确则退出循环返回成功标标志
141 3 {
142 4 break;
143 4 }
144 3 else //如果TWI读数或CRC校验失败则延时1mS之后再读取
145 3 {
146 4 TWICON = 0; //Close TWI module
147 4 Delay1ms(1);
148 4 TwiInit(); //Reinitial
149 4 Delay1ms(1);
150 4 }
151 3 }
152 2 }
153 1 bAfeI2CRWErrFlg = !Result; //标记通讯是否正常
154 1
155 1 return Result;
156 1 }
157
158
159 /*************************************************************************************************
160 * 函数名: AFEClrFlg
161 * 参 数:
162 * 返回值: 无
163 * 描 述: 清零AFE标志寄存器
164 *************************************************************************************************/
165 void AFEClrFlg(void)
166 {
167 1 if(AFEReadReg(AFE_FLAG1, 2, &REG.AFEFLAG1))
168 1 {
169 2 if((REG.AFEFLAG1!=0) || (REG.AFEFLAG2!=0))
170 2 {
171 3 REG.AFESCONF1 |= 0x80;
172 3 AFEWriteReg(AFE_SCONF1, 1, &REG.AFESCONF1);
173 3 REG.AFESCONF1 &= ~0x80;
174 3 AFEWriteReg(AFE_SCONF1, 1, &REG.AFESCONF1);
175 3 }
176 2 }
C51 COMPILER V9.01 AFE 02/22/2025 15:36:21 PAGE 4
177 1 }
178
179
180 /*************************************************************************************************
181 * 函数名: AFEInitReg
182 * 参 数: 无
183 * 返回值: 无
184 * 描 述: 初始化AFE寄存器
185 *************************************************************************************************/
186 void AFEInitReg(void)
187 {
188 1 U16 TempVar;
189 1
190 1 REG.AFEINTEN = 0x00; //采取查询式故不需要ALARM中断
191 1 REG.AFESCONF1 = 0x50; //使能CTLD和WDT功能
192 1 REG.AFESCONF2 = 0x00; //AFE引脚配置为复位信号ALARM输出低电平脉冲放电MOS与充电MOS都关闭
193 1 REG.AFESCONF3 = 0xF8; //默认VADC和CADC都开启CADC连续采样10位ADCVADC只采集
-电压转换周期50ms
194 1 REG.AFESCONF4 = 0x00; //默认关闭平衡BAT6-10
195 1 REG.AFESCONF5 = 0x00; //默认关闭平衡BAT1-5
196 1 REG.AFESCONF6 = 0x70; //CADC采集200mV范围复位信号宽度1S硬件短路保护电压100mV硬件短路保护延时5
-0uS
197 1 REG.AFESCONF7 = 0x01; //硬件过冲保护延时1个转换周期充放电状态阈值选择位1.4mV<EFBFBD>
-<2D>渲每疵殴芬绯<E88AAC>10S
198 1 REG.AFESCONF8 = 0x03; //SCONF8 + SCONF9 = 11 1111 1111 = 1023
199 1 REG.AFESCONF9 = 0xff; //硬件过冲保护阈值1023*5.86mV = 5994.78
200 1 REG.AFESCONF10= 0x00; //低功耗控制位写入0x33再写PD_EN=1进入低功耗
201 1
202 1 if(bSC_EN) //配置使能AFE短路功能
203 1 {
204 2 REG.AFESCONF1 |= 0x08;
205 2 REG.AFESCONF6 |= (E2ucAFEProtectConfig&0x0f);//将FLASH内参数写入AFE寄存器
206 2 }
207 1 if(bOV_EN) //配置使能AFE过压功能
208 1 {
209 2 REG.AFESCONF1 |= 0x04;
210 2 REG.AFESCONF7 |= (E2ucAFEProtectConfig&0xf0);//将FLASH内参数写入AFE寄存器
211 2 TempVar = (U32)E2uiAFEOVvol*50/293; //取出过压保护电压
212 2 REG.AFESCONF8 = TempVar>>8; //写高两位
213 2 REG.AFESCONF9 = TempVar; //写低八位
214 2 }
215 1 }
216
217
218
219 /*************************************************************************************************
220 * 函数名: AFEInit
221 * 参 数:
222 * 返回值: 1:成功0:失败
223 * 描 述: 初始化AFE
224 *************************************************************************************************/
225 BOOL AFEInit(void)
226 {
227 1 U8 xdata RdBuf[2];
228 1 U8 i;
229 1 BOOL Result = 1;
230 1 U8 j = 3;
231 1
232 1 while(j--)
233 1 {
234 2 if( AFEWriteReg(AFE_INT_EN, 11, &REG.AFEINTEN))
235 2 {
C51 COMPILER V9.01 AFE 02/22/2025 15:36:21 PAGE 5
236 3 for(i=3; i<=11; i=i+2)
237 3 {
238 4 AFEReadReg(i, 2, RdBuf);
239 4
240 4 if((RdBuf[0]!=*(&REG.AFEFLAG1+i)) || (RdBuf[1]!=*(&REG.AFEFLAG1+i+1)))
241 4 {
242 5 if(i != 7) //平衡寄存器除外因为平衡寄存器不置位持续30s会自动清零
243 5 {
244 6 Result = 0;
245 6 break;
246 6 }
247 5 }
248 4 }
249 3 }
250 2 else
251 2 {
252 3 Result = 0;
253 3 }
254 2 if(Result)
255 2 {
256 3 break;
257 3 }
258 2 }
259 1 return Result;
260 1
261 1 }
262
263
264 /*************************************************************************************************
265 * 函数名: AFERdFlg
266 * 参 数:
267 * 返回值: 无
268 * 描 述: 读取AFE标志寄存器
269 AFE_SC表示发生短路保护
270 FLAG2的bit2为1表示发生LVR复位需要重新初始化AFE
271 *************************************************************************************************/
272 void AFERdFlg(void)
273 {
274 1 if(AFEReadReg(AFE_FLAG1, 2, &REG.AFEFLAG1))
275 1 {
276 2 if((REG.AFEFLAG2&0x02) != 0) //CADC 电流转换完成
277 2 {
278 3 bCADCFlg = 1;
279 3 }
280 2
281 2 if((REG.AFEFLAG2&0x01) != 0) //VADC 电压转换完成
282 2 {
283 3 bVADCFlg = 1;
284 3 }
285 2
286 2 if((REG.AFEFLAG1&0x08) != 0 && (bLoadChkingFlg != 1)) //AFE短路保护
287 2 {
288 3 bAFE_SC = 1;
289 3 bLoadStartCheckFlg = 1; //开启负载检测
290 3 }
291 2 if((REG.AFEFLAG1&0x04) != 0) //AFE 硬件过压保护
292 2 {
293 3 bAFE_OV= 1;
294 3 }
295 2
296 2 if((REG.AFEFLAG2&0x04) != 0) //判断FLAG2的bit2是否为1如为1则表示AFE发生过LVR<EFBC8C>
-<2D>匦鲁跏蓟疉FE寄存器
C51 COMPILER V9.01 AFE 02/22/2025 15:36:21 PAGE 6
297 2 {
298 3 AFEInit();
299 3 }
300 2 }
301 1 }
302
303
304 /*************************************************************************************************
305 * 函数名: AFERdStatus
306 * 参 数:
307 * 返回值: 无
308 * 描 述: 读取AFE状态寄存器
309 *************************************************************************************************/
310 void AFERdStatus(void)
311 {
312 1 U8 RegTemp[2];
313 1 if(AFEReadReg(AFE_BSTATUS, 2, RegTemp))//&REG.AFEBSTATUS))//AFE固定读2Bytes只取1Byte
314 1 {
315 2 ucAFEStatus = REG.AFEBSTATUS = RegTemp[0]; //更新充电器、负载的检测结果
316 2 }
317 1 }
318
319
320 /*************************************************************************************************
321 * 函数名: AFERamCheck
322 * 参 数:
323 * 返回值: 无
324 * 描 述: 定时检测AFE的寄存器是否被改写如果是则重新初始化
325 *************************************************************************************************/
326 void AFERamCheck(void)
327 {
328 1 U8 xdata RdBuf[2];
329 1 U8 i;
330 1
331 1 for(i=3; i<=11; i=i+2)
332 1 {
333 2 AFEReadReg(i, 2, RdBuf);
334 2
335 2 if((RdBuf[0]!=*(&REG.AFEFLAG1+i)) || (RdBuf[1]!=*(&REG.AFEFLAG1+i+1)))
336 2 {
337 3 if(i != 7) //平衡寄存器除外因为平衡寄存器不置位持续30s会自动清零
338 3 {
339 4 if(!AFEInit())
340 4 {
341 5 bPDFlg = 1;
342 5 }
343 4 break;
344 4 }
345 3 }
346 2 }
347 1 }
348
349
350 /*************************************************************************************************
351 * 函数名: AFEEnterPD
352 * 参 数:
353 * 返回值: 无
354 * 描 述: 控制AFE进入PD状态关闭3.3V输出
355 *************************************************************************************************/
356 void AFEEnterPD(void)
357 {
358 1 REG.AFESCONF10 = 0x33;
C51 COMPILER V9.01 AFE 02/22/2025 15:36:21 PAGE 7
359 1 if(AFEWriteReg(AFE_SCONF10, 1, &REG.AFESCONF10))
360 1 {
361 2 REG.AFESCONF1 |= 0x20;
362 2 AFEWriteReg(AFE_SCONF1, 1, &REG.AFESCONF1);
363 2 }
364 1 }
365
366
367 /*************************************************************************************************
368 * 函数名: AFEMosCtl
369 * 参 数: MosStatusMOS状态。1开启0关闭
370 * 返回值: 无
371 * 描 述: 控制充放电MOS的开启和关闭
372 *************************************************************************************************/
373 void AFEMosCtl(U8 MosStatus)
374 {
375 1 REG.AFESCONF2 &= ~0x03;
376 1 REG.AFESCONF2 |= MosStatus;
377 1 AFEWriteReg(AFE_SCONF2, 1, &REG.AFESCONF2);
378 1 }
379
380
381
382 /*************************************************************************************************
383 * 函数名: AFEChgerCheckEn、AFEChgerCheckDis、AFELoadCheckEn、AFELoadCheckDis
384 * 参 数:
385 * 返回值: 无
386 * 描 述: 使能/关闭充电器检测、负载检测
387 *************************************************************************************************/
388 void AFEChgerCheckEn(void)
389 {
390 1 REG.AFESCONF1 |= 0x01;
391 1 AFEWriteReg(AFE_SCONF1, 1, &REG.AFESCONF1);
392 1 }
393
394
395 void AFEChgerCheckDis(void)
396 {
397 1 REG.AFESCONF1 &= ~0x01;
398 1 AFEWriteReg(AFE_SCONF1, 1, &REG.AFESCONF1);
399 1 }
400
401
402 void AFELoadCheckEn(void)
403 {
404 1 REG.AFESCONF1 |= 0x02;
405 1 AFEWriteReg(AFE_SCONF1, 1, &REG.AFESCONF1);
406 1 }
407
408
409 void AFELoadCheckDis(void)
410 {
411 1 REG.AFESCONF1 &= ~0x02;
412 1 AFEWriteReg(AFE_SCONF1, 1, &REG.AFESCONF1);
413 1 }
414
415
416 /*************************************************************************************************
417 * 函数名: AfeBalEn
418 * 参 数: BalChTemp平衡对应的CELL如果全部为0则关闭平衡
419 * 返回值: 无
420 * 描 述: 开启和关闭平衡
C51 COMPILER V9.01 AFE 02/22/2025 15:36:21 PAGE 8
421 *************************************************************************************************/
422 void AfeBalCtl(U16 BalChTemp)
423 {
424 1 REG.AFESCONF4 = BalChTemp>>5;
425 1 if(AFEWriteReg(AFE_SCONF4, 1, &REG.AFESCONF4))
426 1 {
427 2 REG.AFESCONF5 = BalChTemp;
428 2 AFEWriteReg(AFE_SCONF5, 1, &REG.AFESCONF5);
429 2 }
430 1 }
431
432
433 /*************************************************************************************************
434 * 函数名: AfeWDTEn AfeWDTDis
435 * 参 数:
436 * 返回值: 无
437 * 描 述: 开启和关闭看门狗模块
438 *************************************************************************************************/
439 void AfeWDTEn(void)
440 {
441 1 REG.AFESCONF1 |= 0x10;
442 1 AFEWriteReg(AFE_SCONF1, 1, &REG.AFESCONF1);
443 1 }
444
445
446 void AfeWDTDis(void)
447 {
448 1 REG.AFESCONF1 &= ~0x10;
449 1 AFEWriteReg(AFE_SCONF1, 1, &REG.AFESCONF1);
450 1 }
451
452
453 /*************************************************************************************************
454 * 函数名: AfeWDTEn AfeWDTDis
455 * 参 数: 无
456 * 返回值: 无
457 * 描 述: 开启和关闭看门狗模块
458 *************************************************************************************************/
459 void AfeADCEn(void)
460 {
461 1 REG.AFESCONF3 |= 0xf8;
462 1 AFEWriteReg(AFE_SCONF3, 1, &REG.AFESCONF3);
463 1 }
464
465
466 void AfeADCDis(void)
467 {
468 1 REG.AFESCONF3 &= ~0xf8;
469 1 AFEWriteReg(AFE_SCONF3, 1, &REG.AFESCONF3);
470 1 }
471
472 void AfeCADCEn(void)
473 {
474 1 REG.AFESCONF3 |= 0xe0;
475 1 AFEWriteReg(AFE_SCONF3, 1, &REG.AFESCONF3);
476 1 }
477
478
479 void AfeCADCDis(void)
480 {
481 1 REG.AFESCONF3 &= ~0xe0;
482 1 AFEWriteReg(AFE_SCONF3, 1, &REG.AFESCONF3);
C51 COMPILER V9.01 AFE 02/22/2025 15:36:21 PAGE 9
483 1 }
484
485 void AfeTempADCEn(void)
486 {
487 1 REG.AFESCONF3 |= 0x08;
488 1 AFEWriteReg(AFE_SCONF3, 1, &REG.AFESCONF3);
489 1 }
490
491
492 void AfeTempADCDis(void)
493 {
494 1 REG.AFESCONF3 &= ~0x08;
495 1 AFEWriteReg(AFE_SCONF3, 1, &REG.AFESCONF3);
496 1 }
497
498
499 /*************************************************************************************************
500 * 函数名: AfeAlarmEnAfeAlarmDis
501 * 参 数: AlarmFlg置位对应的ALARM位
502 * 返回值: 无
503 * 描 述: 开启和关闭对应的ALARM中断触发
504 *************************************************************************************************/
505 void AfeAlarmEn(U8 AlarmFlg)
506 {
507 1 REG.AFEINTEN |= AlarmFlg;
508 1 AFEWriteReg(AFE_INT_EN, 1, &REG.AFEINTEN);
509 1 }
510
511 void AfeAlarmDis(U8 AlarmFlg)
512 {
513 1 REG.AFEINTEN &= ~AlarmFlg;
514 1 AFEWriteReg(AFE_INT_EN, 1, &REG.AFEINTEN);
515 1 }
516
517
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1206 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 181 22
PDATA SIZE = ---- ----
DATA SIZE = 6 ----
IDATA SIZE = ---- ----
BIT SIZE = 5 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)