Преглед изворни кода

update battery switch method

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao пре 5 година
родитељ
комит
2eb6db8634
16 измењених фајлова са 481 додато и 234 уклоњено
  1. 1 1
      Project/version.txt
  2. 180 137
      Source/app.c
  3. 3 4
      Source/app.h
  4. 1 1
      Source/app_bms_1.c
  5. 1 1
      Source/app_bms_2.c
  6. 1 1
      Source/app_can.c
  7. 0 6
      Source/app_end_ctr.c
  8. 184 40
      Source/app_rs485_1.c
  9. 61 17
      Source/app_rs485_1.h
  10. 10 0
      Source/common.h
  11. 11 11
      Source/delay.c
  12. 2 1
      Source/delay.h
  13. 1 6
      Source/drv_can.c
  14. 11 7
      Source/drv_io.c
  15. 13 0
      Source/drv_io.h
  16. 1 1
      Source/sw_build_info.h

+ 1 - 1
Project/version.txt

@@ -1 +1 @@
-PS100XX_V01_11052041
+PS100XX_V01_11061622

+ 180 - 137
Source/app.c

@@ -10,7 +10,7 @@
 #include "low_power.h"
 #include "app_end_ctr.h"
 
-CB_VAL cb_val_last;
+// CB_VAL cb_val_last;
 uint8_t cb_operate_state = CB_BAT_NO;
 
 
@@ -53,7 +53,7 @@ void CB_Operate_Initial(void)
 {
 	_CB_Operate_Initial();
 	
-	memset(&cb_val_last,0x00,sizeof(cb_val_last));
+	// memset(&cb_val_last,0x00,sizeof(cb_val_last));
 	//Check_CB_oper_sta_delay.set = 1;
 	//Check_CB_oper_sta_delay.count = 0;
 	Battery_CB_Switch(CB_BAT_NO);
@@ -100,12 +100,7 @@ uint8_t Check_Battery_2_On(void)
 
 	return 0;
 }
-void S11_FL_On(uint8_t on)
-{
-	println("S11_FL: %d", on);
-	S11_ENABLE(on);
-	FL_Enable(on);
-}
+
 uint8_t S11_May_Operate(void)
 {
 	if(cb_operate_state == CB_BAT2 || cb_operate_state == CB_BAT1_BAT2_PARRALLEL|| cb_operate_state == CB_BAT_NO)
@@ -113,29 +108,16 @@ uint8_t S11_May_Operate(void)
 	else
 		return 0;
 }
-void Battery_CB_Operate(CB_VAL *cb_val)
-{
-	if(cb_val == NULL)
-		return;
-
-	println("S11:%d, S21:%d, SS:%d", cb_val->s11_bit, cb_val->s21_bit, cb_val->ss__bit);
 
-	S10_ENABLE(cb_val->s10_bit);
-	S11_ENABLE(cb_val->s11_bit);
-	S20_ENABLE(cb_val->s20_bit);
-	S21_ENABLE(cb_val->s21_bit);
-	SS__ENABLE(cb_val->ss__bit);
-}
-
-uint8_t battery_wait_voltage_down(uint32_t voltage)
+shark_bool battery_wait_voltage_down(u32 voltage)
 {
-	uint8_t success = 0;
-	uint16_t times;
+	u8 success = 0;
+	u16 times;
 
 	for (times = 500; times > 0; times--) {
 		if (Measure_Vol() < voltage) {
 			if (++success > 20) {
-				return 1;
+				return shark_true;
 			}
 		} else {
 			success = 0;
@@ -144,12 +126,142 @@ uint8_t battery_wait_voltage_down(uint32_t voltage)
 		delay_1ms(10);
 	}
 
-	return 0;
+	return shark_false;
+}
+
+shark_bool battery_wait_voltage_up(u32 voltage)
+{
+	u64 time = shark_get_time() + 500;
+
+	while (Measure_Vol() < voltage) {
+		if (time < shark_get_time_safe()) {
+			return shark_false;
+		}
+	}
+
+	return shark_true;
+}
+
+static u8 shark_battery_switch_series(void)
+{
+	Power_On_Normal(0, 2);
+
+	if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
+		if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_SMALL) != 3) {
+			return CB_BAT_NO;
+		}
+	} else {
+		if (shark_battery_set_power(SHARK_BATT_POWER_SMALL, SHARK_BATT_POWER_FULL) != 3) {
+			return CB_BAT_NO;
+		}
+	}
+
+	shark_bms_set_mos_series();
+	battery_wait_voltage_up(SERIES_VOLTAGE_MIN);
+
+	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL) != 3) {
+		shark_bms_set_mos_close();
+		return CB_BAT_NO;
+	}
+
+	return CB_BAT1_BAT2_SERIES;
+}
+
+static u8 shark_battery_switch_bat1(u8 mask)
+{
+	if ((shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_OFF) & mask) != mask) {
+		return CB_BAT_NO;
+	}
+
+	shark_bms_set_mos_bat1();
+
+	return CB_BAT1;
+}
+
+static u8 shark_battery_switch_bat2(u8 mask)
+{
+	if ((shark_battery_set_power(SHARK_BATT_POWER_OFF, SHARK_BATT_POWER_FULL) & mask) != mask) {
+		return CB_BAT_NO;
+	}
+
+	shark_bms_set_mos_bat2();
+
+	return CB_BAT2;
+}
+
+static u8 shark_battery_switch_bat1_or_bat2(void)
+{
+	u64 time = shark_get_time() + 500;
+	u32 open1 = 0;
+	u32 open2 = 0;
+
+	while (time > shark_get_time_safe()) {
+		if (BAT1_IS_OPEN()) {
+			open1++;
+		}
+
+		if (BAT2_IS_OPEN()) {
+			open2++;
+		}
+	}
+
+	if (open1 > open2) {
+		return shark_battery_switch_bat1(3);
+	}
+
+	if (open1 < open2) {
+		return shark_battery_switch_bat2(3);
+	}
+
+	if (sub_bms_info_1.packet_common.m_total_vol > sub_bms_info_2.packet_common.m_total_vol) {
+		return shark_battery_switch_bat1(3);
+	}
+
+	return shark_battery_switch_bat2(3);
+}
+
+static u8 shark_battery_switch_auto(shark_bool series)
+{
+	shark_bms_set_mos_close();
+
+	if (!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
+		return CB_BAT_NO;
+	}
+
+	if (cb_operate_state == CB_BAT_NO) {
+		if (shark_battery_set_power(SHARK_BATT_POWER_SMALL, SHARK_BATT_POWER_SMALL) == 0) {
+			return CB_BAT_NO;
+		}
+
+		delay_1ms(200);
+	}
+
+	if (shark_battery_set_power(SHARK_BATT_POWER_FULL, SHARK_BATT_POWER_FULL) == 0) {
+		return CB_BAT_NO;
+	}
+
+	sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
+	sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
+
+	if (shark_battery_is_normal_power_on(&sub_bms_info_1)) {
+		if (shark_battery_is_normal_power_on(&sub_bms_info_2)) {
+			if (series) {
+				return shark_battery_switch_series();
+			} else {
+				return shark_battery_switch_bat1_or_bat2();
+			}
+		} else {
+			return shark_battery_switch_bat1(1);
+		}
+	} else if (shark_battery_is_normal_power_on(&sub_bms_info_2)) {
+		return shark_battery_switch_bat2(2);
+	} else {
+		return CB_BAT_NO;
+	}
 }
 
 int8_t Battery_CB_Switch(uint8_t cb_operate)
 {
-	CB_VAL cb_val_temp;
 	uint16_t i = 0;
 
 	if (Is_Soak()) {
@@ -162,13 +274,13 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 
 	switch(cb_operate)
 	{
+		case CB_BAT1_BAT2_AUTO:
+			cb_operate = shark_battery_switch_auto(shark_false);
+			println("switch auto: %d", cb_operate);
+			break;
+
 		case CB_BAT1:
-			cb_val_temp.s10_bit = 0;
-			cb_val_temp.s11_bit = 0;
-			cb_val_temp.s20_bit = 0;
-			cb_val_temp.s21_bit = 0;
-			cb_val_temp.ss__bit = 0;
-			Battery_CB_Operate(&cb_val_temp);
+			shark_bms_set_mos_close();
 
 			if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
 				goto SWITCH_ERROR;
@@ -279,22 +391,12 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 					goto SWITCH_ERROR;
 			}
 
-			cb_val_temp.s10_bit = 0;
-			cb_val_temp.s11_bit = 0;
-			cb_val_temp.s20_bit = 1;
-			cb_val_temp.s21_bit = 1;
-			cb_val_temp.ss__bit = 0;
-			Battery_CB_Operate(&cb_val_temp);
+			shark_bms_set_mos_bat1();
 			sub_bms_info_1.state = SHARK_BATT_STATE_USED;
 			sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
 			break;
 		case CB_BAT2:
-			cb_val_temp.s10_bit = 0;
-			cb_val_temp.s11_bit = 0;
-			cb_val_temp.s20_bit = 0;
-			cb_val_temp.s21_bit = 0;
-			cb_val_temp.ss__bit = 0;
-			Battery_CB_Operate(&cb_val_temp);
+			shark_bms_set_mos_close();
 
 			if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
 				goto SWITCH_ERROR;
@@ -406,22 +508,12 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 					goto SWITCH_ERROR;
 			}
 			
-			cb_val_temp.s10_bit = 1;
-			cb_val_temp.s11_bit = 1;
-			cb_val_temp.s20_bit = 0;
-			cb_val_temp.s21_bit = 0;
-			cb_val_temp.ss__bit = 0;
-			Battery_CB_Operate(&cb_val_temp);
+			shark_bms_set_mos_bat2();
 			sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
 			sub_bms_info_2.state = SHARK_BATT_STATE_USED;
 			break;
-		case CB_BAT1_BAT2_PARRALLEL:			
-			cb_val_temp.s10_bit = 0;
-			cb_val_temp.s11_bit = 0;
-			cb_val_temp.s20_bit = 0;
-			cb_val_temp.s21_bit = 0;
-			cb_val_temp.ss__bit = 0;
-			Battery_CB_Operate(&cb_val_temp);
+		case CB_BAT1_BAT2_PARRALLEL:
+			shark_bms_set_mos_close();
 
 			if(!battery_wait_voltage_down(SELECT_ONE_BATTERY_VOL)) {
 				goto SWITCH_ERROR;
@@ -463,25 +555,15 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 				default:
 					goto SWITCH_ERROR;
 			}
-			cb_val_temp.s10_bit = 1;
-			cb_val_temp.s11_bit = 1;
-			cb_val_temp.s20_bit = 1;
-			cb_val_temp.s21_bit = 1;
-			cb_val_temp.ss__bit = 0;
-			Battery_CB_Operate(&cb_val_temp);
+			
+			shark_bms_set_mos_parrallel();
 			sub_bms_info_1.state = SHARK_BATT_STATE_USED;
 			sub_bms_info_2.state = SHARK_BATT_STATE_USED;
 			break;
 		case CB_BAT1_BAT2_SERIES:
 
 			Power_On_Normal(0,2);
-			
-			cb_val_temp.s10_bit = 0;
-			cb_val_temp.s11_bit = 0;
-			cb_val_temp.s20_bit = 0;
-			cb_val_temp.s21_bit = 0;
-			cb_val_temp.ss__bit = 0;
-			Battery_CB_Operate(&cb_val_temp);		
+			shark_bms_set_mos_close();
 
 			//delay_1ms(2000);
 
@@ -494,12 +576,8 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 					goto SWITCH_ERROR;
 				case CB_BAT1:
 					delay_1ms(10);
-					cb_val_temp.s10_bit = 1;
-					cb_val_temp.s11_bit = 0;
-					cb_val_temp.s20_bit = 1;
-					cb_val_temp.s21_bit = 0;
-					cb_val_temp.ss__bit = 1;
-					Battery_CB_Operate(&cb_val_temp);
+					shark_bms_set_mos_series();
+
 					//
 					i = 0;
 					while(i++ < COM_TIMEOUT && RS485_busy_2)
@@ -530,12 +608,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 					break;
 				case CB_BAT2:
 					delay_1ms(10);
-					cb_val_temp.s10_bit = 1;
-					cb_val_temp.s11_bit = 0;
-					cb_val_temp.s20_bit = 1;
-					cb_val_temp.s21_bit = 0;
-					cb_val_temp.ss__bit = 1;
-					Battery_CB_Operate(&cb_val_temp);
+					shark_bms_set_mos_series();
 					//
 					i = 0;
 					while(i++ < COM_TIMEOUT && RS485_busy_1)
@@ -582,12 +655,8 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 						delay_1ms(50);
 
 						delay_1ms(10);
-						cb_val_temp.s10_bit = 1;
-						cb_val_temp.s11_bit = 0;
-						cb_val_temp.s20_bit = 1;
-						cb_val_temp.s21_bit = 0;
-						cb_val_temp.ss__bit = 1;
-						Battery_CB_Operate(&cb_val_temp);
+						shark_bms_set_mos_series();
+
 							
 						if(Operate_Sub_BMS_1_CD(2) == 0)
 							goto SWITCH_ERROR;
@@ -625,12 +694,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 						delay_1ms(50);
 
 						delay_1ms(10);
-						cb_val_temp.s10_bit = 1;
-						cb_val_temp.s11_bit = 0;
-						cb_val_temp.s20_bit = 1;
-						cb_val_temp.s21_bit = 0;
-						cb_val_temp.ss__bit = 1;
-						Battery_CB_Operate(&cb_val_temp);
+						shark_bms_set_mos_series();
 						
 						if(Operate_Sub_BMS_2_CD(2) == 0)
 							goto SWITCH_ERROR;
@@ -659,24 +723,14 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 					goto SWITCH_ERROR;
 			}
 			delay_1ms(10);
-			cb_val_temp.s10_bit = 1;
-			cb_val_temp.s11_bit = 0;
-			cb_val_temp.s20_bit = 1;
-			cb_val_temp.s21_bit = 0;
-			cb_val_temp.ss__bit = 1;
-			Battery_CB_Operate(&cb_val_temp);
+			shark_bms_set_mos_series();
 			sub_bms_info_1.state = SHARK_BATT_STATE_USED;
 			sub_bms_info_2.state = SHARK_BATT_STATE_USED;
 			break;
 		case CB_BAT_NO:
 		default:
 			ACC2_Enable(0);
-			cb_val_temp.s10_bit = 0;
-			cb_val_temp.s11_bit = 0;
-			cb_val_temp.s20_bit = 0;
-			cb_val_temp.s21_bit = 0;
-			cb_val_temp.ss__bit = 0;
-			Battery_CB_Operate(&cb_val_temp);
+			shark_bms_set_mos_close();
 			sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
 			sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
 			cb_operate = CB_BAT_NO;
@@ -691,7 +745,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 	}
 
 	
-	cb_val_last = cb_val_temp;
+	// cb_val_last = cb_val_temp;
 
 	cb_operate_state = cb_operate;
 	
@@ -699,13 +753,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 
 SWITCH_ERROR:
 	println("switch err");
-	cb_val_temp.s10_bit = 0;
-	cb_val_temp.s11_bit = 0;
-	cb_val_temp.s20_bit = 0;
-	cb_val_temp.s21_bit = 0;
-	cb_val_temp.ss__bit = 0;
-	Battery_CB_Operate(&cb_val_temp);
-	cb_val_last = cb_val_temp;
+	shark_bms_set_mos_close();
 	cb_operate_state = CB_BAT_NO;
 	return cb_operate_state;
 	
@@ -725,6 +773,7 @@ void test_io(void)
 
 uint8_t Select_One_BAT(void)
 {
+#if 0
 	uint8_t temp_op = CB_BAT_NO;
 
 	println("select one");
@@ -732,19 +781,11 @@ uint8_t Select_One_BAT(void)
 	sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
 	sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
 
-	if (!Operate_Sub_BMS_PING(500)) {
-		return temp_op;
-	}
-
-	if(Is_Sub_BMS_1_Normal() == SHARK_BMS_EXIT_SUCCESS)
+	if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS)
 	{
-		if(Is_Sub_BMS_2_Normal() == SHARK_BMS_EXIT_SUCCESS)
+		if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
 		{
-			if (sub_bms_info_1.open_times > sub_bms_info_2.open_times) {
-				temp_op = CB_BAT1;
-			} else if (sub_bms_info_1.open_times < sub_bms_info_2.open_times) {
-				temp_op = CB_BAT2;
-			} if(sub_bms_info_1.packet_common.m_total_vol >= sub_bms_info_2.packet_common.m_total_vol)
+			if(sub_bms_info_1.packet_common.m_total_vol >= sub_bms_info_2.packet_common.m_total_vol)
 			{
 				if(IS_CHARGE_IN())
 				{
@@ -772,13 +813,15 @@ uint8_t Select_One_BAT(void)
 			temp_op = CB_BAT1;
 		}
 	}
-	else if(Is_Sub_BMS_2_Normal() == SHARK_BMS_EXIT_SUCCESS)
+	else if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
 	{
 		temp_op = CB_BAT2;
 	}
 
 	return temp_op;
-	
+#else
+	return CB_BAT1_BAT2_AUTO;
+#endif
 }
 
 
@@ -786,7 +829,7 @@ uint8_t Check_CB_BAT_1(void)
 {
 	uint8_t temp_op = CB_MAX;
 	
-	if(Is_Sub_BMS_1_Normal() == SHARK_BMS_EXIT_SUCCESS)
+	if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS)
 	{
 		if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
 		{
@@ -822,7 +865,7 @@ uint8_t Check_CB_BAT_2(void)
 {
 	uint8_t temp_op = CB_MAX;
 	
-	if(Is_Sub_BMS_2_Normal() == SHARK_BMS_EXIT_SUCCESS)
+	if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
 	{
 		if((sub_bms_info_2.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
 		{
@@ -875,7 +918,7 @@ uint8_t Check_CB_BAT1_BAT2_PARRALLEL(void)
 		return temp_op;
 	}
 	//
-	if(Is_Sub_BMS_1_Normal() == SHARK_BMS_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BMS_EXIT_SUCCESS)
+	if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
 	{
 		if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
 		{
@@ -1030,7 +1073,7 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
 		return Select_One_BAT();
 	}
 
-	if(Is_Sub_BMS_1_Normal() == SHARK_BMS_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BMS_EXIT_SUCCESS)
+	if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
 	{
 		if((sub_bms_info_1.packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_C_OPEN)) != (BMS_STA_D_OPEN | BMS_STA_C_OPEN))
 		{
@@ -1136,7 +1179,7 @@ void Power_On_Normal(uint8_t enable,uint8_t from)
 
 #else
 
-		FL_Enable(0);
+		// FL_Enable(0);
 		
 		ACC2_Enable(0);
 		
@@ -1356,11 +1399,11 @@ void Check_Charge_In(void)
 
 uint8_t Change_Mode_Sub_BMS_1_Normal(void)
 {
-	return Is_Sub_BMS_1_Normal() == SHARK_BMS_EXIT_SUCCESS;
+	return Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS;
 }
 uint8_t Change_Mode_Sub_BMS_2_Normal(void)
 {
-	return Is_Sub_BMS_2_Normal() == SHARK_BMS_EXIT_SUCCESS;
+	return Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS;
 }
 
 uint8_t Change_Mode_Sub_BMS_PARRALLEL(void)
@@ -1375,7 +1418,7 @@ uint8_t Change_Mode_Sub_BMS_PARRALLEL(void)
 	if(is_intelligent && CB_OPERATE_PRECEDENCE_PARRALLEL != PRE_PARRALLEL)
 		return 0;
 	//
-	if(Is_Sub_BMS_1_Normal() == SHARK_BMS_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BMS_EXIT_SUCCESS)
+	if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
 		;
 	else
 		return 0;
@@ -1419,7 +1462,7 @@ uint8_t Change_Mode_Sub_BMS_SERIES(void)
 	if(IS_CHARGE_IN())
 		return 0;
 	
-	if(!(Is_Sub_BMS_1_Normal() == SHARK_BMS_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BMS_EXIT_SUCCESS))
+	if(!(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS))
 		return 0;
 
 	/*if(cb_operate_state == CB_BAT1)

+ 3 - 4
Source/app.h

@@ -52,7 +52,7 @@ enum
 	CB_BAT2,
 	CB_BAT1_BAT2_PARRALLEL,
 	CB_BAT1_BAT2_SERIES,
-
+	CB_BAT1_BAT2_AUTO,
 
 	
 	CB_MAX
@@ -78,7 +78,7 @@ typedef struct
 }CB_VAL;
 
 
-extern CB_VAL cb_val_last;
+// extern CB_VAL cb_val_last;
 extern uint8_t cb_operate_state;
 extern uint8_t Check_CB_oper_sta_start;
 extern DELAY_COMMON Check_CB_oper_sta_delay;
@@ -111,6 +111,7 @@ __inline void Check_CB_Oper_Sta_Delay(void)
 #define SERIES_UNDER_VOL_TIME_OUT  (4000)
 #define NEXT_SERIES_TIME_OUT  (5000)
 #define SELECT_ONE_BATTERY_VOL  (60000)
+#define SERIES_VOLTAGE_MIN  (80000)
 #define SERIES_UNDER_XX_PERCENT  (20)
 
 enum
@@ -197,8 +198,6 @@ void CB_Operate_Initial(void);
 
 void Misc_Initial(void);
 
-void Battery_CB_Operate(CB_VAL *cb_val);
-
 int8_t Battery_CB_Switch(uint8_t cb_operate);
 
 uint8_t Is_BAT1_Lock(void);

+ 1 - 1
Source/app_bms_1.c

@@ -169,7 +169,7 @@ int8_t Rsp_Can_Bms_1_CMD(CAN_FRAME*can_bms_1_frame)
 					//bang zi ce shi start
 					#else
 					{
-						if(Is_Sub_BMS_1_Normal() == SHARK_BMS_EXIT_SUCCESS)
+						if(Is_Sub_BMS_1_Normal() == SHARK_BATT_EXIT_SUCCESS)
 						{
 							temp = (uint16_t)(sub_bms_info_1.packet_common.m_percent*sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi*10/1000);
 							if(temp%10 >= 5)

+ 1 - 1
Source/app_bms_2.c

@@ -168,7 +168,7 @@ int8_t Rsp_Can_Bms_2_CMD(CAN_FRAME*can_bms_2_frame)
 					//bang zi ce shi start
 					#else
 					{
-						if(Is_Sub_BMS_2_Normal() == SHARK_BMS_EXIT_SUCCESS)
+						if(Is_Sub_BMS_2_Normal() == SHARK_BATT_EXIT_SUCCESS)
 						{
 							temp = (uint16_t)(sub_bms_info_2.packet_common.m_percent*sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi*10/1000);
 							if(temp%10 >= 5)

+ 1 - 1
Source/app_can.c

@@ -257,7 +257,7 @@ int8_t Handle_Can_Data(void)
 				printf("ctr_temperature[1]:%d\r\n",ctr_temperature[1]);
 				printf("Batter_Vol:%lu\r\n",Measure_Vol());
 				
-				printf("cb_val_last:%d\r\n",*(uint8_t*)(&cb_val_last));
+				// printf("cb_val_last:%d\r\n",*(uint8_t*)(&cb_val_last));
 				printf("cb_operate_state:%d\r\n",cb_operate_state);
 				break;
 				

+ 0 - 6
Source/app_end_ctr.c

@@ -598,12 +598,6 @@ int8_t Rsp_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 					shark_printf_enable = buf[len];
 					buf[len++] = 0;
 					break;
-				case 4:
-					memcpy(buf + len, &sub_bms_info_1.open_times, sizeof(sub_bms_info_1.open_times));
-					len += sizeof(sub_bms_info_1.open_times);
-					memcpy(buf + len, &sub_bms_info_2.open_times, sizeof(sub_bms_info_2.open_times));
-					len += sizeof(sub_bms_info_2.open_times);
-					break;
 				case 5:
 					buf[len++] = sub_bms_info_1.packet_common.bms_status;
 					buf[len++] = sub_bms_info_2.packet_common.bms_status;

+ 184 - 40
Source/app_rs485_1.c

@@ -467,16 +467,16 @@ void  Sub_BMS_1_lt_State(void)
 	
 }
 
-static uint8_t shark_battery_is_normal_raw(SUB_BMS_INFO *info)
+static shark_battery_exit_t shark_battery_is_normal_raw(SUB_BMS_INFO *info)
 {
 	uint16_t work_status;
 
 	if (info->define_error != D_BMS_ERROR_NO) {
-		return SHARK_BMS_EXIT_ERROR;
+		return SHARK_BATT_EXIT_ERROR;
 	}
 
 	if (info->test_error != D_BMS_ERROR_NO) {
-		return SHARK_BMS_EXIT_ERROR;
+		return SHARK_BATT_EXIT_ERROR;
 	}
 
 	work_status = info->packet_common.work_status;
@@ -489,43 +489,57 @@ static uint8_t shark_battery_is_normal_raw(SUB_BMS_INFO *info)
 	}
 
 	if(work_status) {
-		return SHARK_BMS_EXIT_ERROR;
+		return SHARK_BATT_EXIT_ERROR;
 	}
 
-	if (info->state == SHARK_BATT_STATE_IDLE) {
-		if (info->conn_state != SUB_BMS_CONT_HV485) {
-			return SHARK_BMS_EXIT_485;
-		}
-
-		if (!shark_battery_detect(info)) {
-			return SHARK_BMS_EXIT_SHAKE;
-		}
-	} else if (info->conn_state != SUB_BMS_CONT_HV485) {
-		if (shark_bms_check_xl() == 0) {
-			return SHARK_BMS_EXIT_485;
+	if (info->conn_state != SUB_BMS_CONT_HV485) {
+		if (shark_bms_check_xl() == 0 || info->state == SHARK_BATT_STATE_IDLE) {
+			return SHARK_BATT_EXIT_485;
 		}
 	}
 
 	if (update_bat.ub_bat != UPDATE_BAT_NO) {
 		if (update_bat.ub_bat == UPDATE_BAT_1 && info == &sub_bms_info_1) {
-			return SHARK_BMS_EXIT_UPGRADE;
+			return SHARK_BATT_EXIT_UPGRADE;
 		}
 
 		if (update_bat.ub_bat == UPDATE_BAT_2 && info == &sub_bms_info_2) {
-			return SHARK_BMS_EXIT_UPGRADE;
+			return SHARK_BATT_EXIT_UPGRADE;
 		}
 	}
 
-	return SHARK_BMS_EXIT_SUCCESS;
+	return SHARK_BATT_EXIT_SUCCESS;
 }
 
-uint8_t shark_battery_is_normal(SUB_BMS_INFO *info)
+shark_battery_exit_t shark_battery_is_normal(SUB_BMS_INFO *info)
 {
 	info->exit_code = shark_battery_is_normal_raw(info);
 	return info->exit_code;
 }
 
-uint8_t Is_Sub_BMS_1_Normal(void)
+shark_bool shark_battery_is_power_on(SUB_BMS_INFO *info)
+{
+	if ((info->packet_common.bms_status & BMS_POWER_FULL) != BMS_POWER_FULL) {
+		return shark_false;
+	}
+
+	return shark_true;
+}
+
+shark_bool shark_battery_is_normal_power_on(SUB_BMS_INFO *info)
+{
+	if (shark_battery_is_normal(info) == SHARK_BATT_EXIT_SUCCESS) {
+		if (shark_battery_is_power_on(info)) {
+			return shark_true;
+		}
+
+		info->exit_code = SHARK_BATT_EXIT_POWER;
+	}
+
+	return shark_false;
+}
+
+shark_battery_exit_t Is_Sub_BMS_1_Normal(void)
 {
 	return shark_battery_is_normal(&sub_bms_info_1);
 }
@@ -589,18 +603,18 @@ int8_t Operate_Sub_BMS_1_CD(uint8_t on)
 
 int8_t Operate_Sub_BMS_PING(uint32_t delay)
 {
-	uint64_t time = shark_get_mseconds() + delay;
+	uint64_t time = shark_get_time() + delay;
 	uint8_t mask = 0;
 
 	while (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_1) {
-		if (time < shark_get_mseconds()) {
+		if (time < shark_get_time_safe()) {
 			println("bat1 busy");
 			return 0;
 		}
 	}
 
 	while (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_2) {
-		if (time < shark_get_mseconds()) {
+		if (time < shark_get_time_safe()) {
 			println("bat2 busy");
 			return 0;
 		}
@@ -617,7 +631,7 @@ int8_t Operate_Sub_BMS_PING(uint32_t delay)
 	Send_Sub_BMS_CMD_1();
 	Send_Sub_BMS_CMD_2();
 
-	while (time > shark_get_mseconds() && mask != 3) {
+	while (time > shark_get_time_safe() && mask != 3) {
 		if(g_event & RS485_RECEIVE_END_EVENT) {
 			g_event &= ~RS485_RECEIVE_END_EVENT;
 			Handle_RS485_1_Data();
@@ -638,6 +652,114 @@ int8_t Operate_Sub_BMS_PING(uint32_t delay)
 	return 1;
 }
 
+static u8 shark_battery_get_power_param(shark_battery_power_t power)
+{
+	switch (power) {
+	case SHARK_BATT_POWER_SMALL:
+		return 0x04;
+
+	case SHARK_BATT_POWER_FULL:
+		return 0x03;
+
+	default:
+		return 0x00;
+	}
+}
+
+static void shark_battery_set_power_param(SUB_BMS_INFO *info, shark_battery_power_t power)
+{
+	info->sub_bms_cmd.operate = OP_OPEN_FET;
+	info->sub_bms_cmd.param = shark_battery_get_power_param(power);
+}
+
+static shark_bool shark_battery_check_power(SUB_BMS_INFO *info, shark_battery_power_t power)
+{
+	if (sub_bms_info_1.conn_state != SUB_BMS_CONT_HV485) {
+		return shark_false;
+	}
+
+	switch (power) {
+	case SHARK_BATT_POWER_SMALL:
+		if ((info->packet_common.bms_status & BMS_POWER_ALL) != BMS_POWER_SMALL) {
+			return shark_false;
+		} else {
+			break;
+		}
+
+	case SHARK_BATT_POWER_FULL:
+		if ((info->packet_common.bms_status & BMS_POWER_ALL) != BMS_POWER_FULL) {
+			return shark_false;
+		} else {
+			break;
+		}
+
+	default:
+		if ((info->packet_common.bms_status & BMS_POWER_ALL) != 0) {
+			return shark_false;
+		} else {
+			break;
+		}
+	}
+
+	return shark_true;
+}
+
+u8 shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2)
+{
+	u64 time = shark_get_time() + 200;
+	u8 times;
+	u8 mask;
+
+	while (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_1) {
+		if (time < shark_get_time_safe()) {
+			break;
+		}
+	}
+
+	while (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_2) {
+		if (time < shark_get_time_safe()) {
+			break;
+		}
+	}
+
+	sub_bms_info_1.conn_state = SUB_BMS_DISC_HV485;
+	sub_bms_info_2.conn_state = SUB_BMS_DISC_HV485;
+
+	for (mask = 0, times = 0; times < 3 && mask != 3; times++) {
+		shark_battery_set_power_param(&sub_bms_info_1, power1);
+		g_event &= ~RS485_RECEIVE_END_EVENT;
+
+		shark_battery_set_power_param(&sub_bms_info_2, power2);
+		g_event &= ~RS485_2_RECEIVE_END_EVENT;
+
+		Send_Sub_BMS_CMD_1();
+		Send_Sub_BMS_CMD_2();
+
+		time = shark_get_time() + 200;
+
+		while (time > shark_get_time_safe() && mask != 3) {
+			if(g_event & RS485_RECEIVE_END_EVENT) {
+				g_event &= ~RS485_RECEIVE_END_EVENT;
+				Handle_RS485_1_Data();
+
+				if (shark_battery_check_power(&sub_bms_info_1, power1)) {
+					mask |= 1;
+				}
+			}
+
+			if (g_event & RS485_2_RECEIVE_END_EVENT) {
+				g_event &= ~RS485_2_RECEIVE_END_EVENT;
+				Handle_RS485_2_Data();
+
+				if (shark_battery_check_power(&sub_bms_info_2, power2)) {
+					mask |= 2;
+				}
+			}
+		}
+	}
+
+	return mask;
+}
 
 int8_t Update_Sub_BMS_1_Software(uint8_t step)
 {
@@ -781,30 +903,52 @@ uint8_t shark_bms_check_xl(void)
 	return end_ctr_self_ss_new.xl_sta != 0 || XL_Dect() == RESET;
 }
 
-uint8_t shark_battery_detect(SUB_BMS_INFO *info)
+void shark_bms_set_vgs(shark_bms_vgs_t mask, uint8_t enable)
 {
-	if ((info->packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_S_OPEN)) != 0) {
-		return info->open_times > 500;
-	}
+	static uint8_t shark_bms_vgs_mask;
 
-	return 1;
+	println("fl: %d %d", mask, enable);
+
+	if (enable) {
+		shark_bms_vgs_mask |= mask;
+		gpio_bit_reset(GPIO_PORT_FL, GPIO_PIN_FL);
+	} else {
+		shark_bms_vgs_mask &= ~mask;
+
+		if (shark_bms_vgs_mask == 0) {
+			gpio_bit_set(GPIO_PORT_FL, GPIO_PIN_FL);
+		}
+	}
 }
 
-uint8_t shark_battery_wait_stable(uint32_t delay)
+void shark_bms_set_mos(shark_bool ss, shark_bool s11, shark_bool s21)
 {
-	uint64_t time = shark_get_mseconds() + delay;
-	uint8_t mask = 0x00;
+	println("S11:%d, S21:%d, SS:%d", s11, s21, ss);
 
-	while (time > shark_get_mseconds() && mask != 3) {
-		if (shark_battery_detect(&sub_bms_info_1)) {
-			mask |= 1;
-		}
+	shark_bms_set_vgs(SHARK_BMS_VGS_FV, s11);
 
-		if (shark_battery_detect(&sub_bms_info_2)) {
-			mask |= 2;
-		}
+	if (ss == 0) {
+		gpio_bit_reset(GPIO_PORT_SS, GPIO_PIN_SS);
 	}
 
-	return mask;
+	if (s11 == 0) {
+		gpio_bit_reset(GPIO_PORT_S11, GPIO_PIN_S11);
+	}
+
+	if (s21 == 0) {
+		gpio_bit_reset(GPIO_PORT_S21, GPIO_PIN_S21);
+	}
+
+	if (ss != 0) {
+		gpio_bit_set(GPIO_PORT_SS, GPIO_PIN_SS);
+	}
+
+	if (s11 != 0) {
+		gpio_bit_set(GPIO_PORT_S11, GPIO_PIN_S11);
+	}
+
+	if (s21 != 0) {
+		gpio_bit_set(GPIO_PORT_S21, GPIO_PIN_S21);
+	}
 }
 

+ 61 - 17
Source/app_rs485_1.h

@@ -63,6 +63,11 @@ typedef struct
 #define BMS_STA_C_FULL     (0x10)
 #define BMS_STA_S_BAHU     (0x20)
 #define BMS_STA_JIAO_YAN   (0x40)
+
+#define BMS_POWER_FULL		(BMS_STA_D_OPEN | BMS_STA_C_OPEN)
+#define BMS_POWER_SMALL		(BMS_STA_S_OPEN)
+#define BMS_POWER_ALL		(BMS_POWER_FULL | BMS_POWER_SMALL)
+
 /*******************************************ͨÓÃÖ¡Í·-end*********************************************************/
 
 /*******************************************BMSÖ¡Í·-start*********************************************************/
@@ -79,19 +84,32 @@ typedef struct
 
 /*******************************************BMSÖ¡Í·-end*********************************************************/
 
+typedef enum {
+	SHARK_BMS_VGS_ACC2 = 1 << 0,
+	SHARK_BMS_VGS_FV = 1 << 1,
+	SHARK_BMS_VGS_ALL = 0xFF
+} shark_bms_vgs_t;
+
 typedef enum {
 	SHARK_BATT_STATE_IDLE,
 	SHARK_BATT_STATE_USED,
 } shark_battery_state_t;
 
 typedef enum {
-	SHARK_BMS_EXIT_SUCCESS,
-	SHARK_BMS_EXIT_UPGRADE,
-	SHARK_BMS_EXIT_ERROR,
-	SHARK_BMS_EXIT_SHAKE,
-	SHARK_BMS_EXIT_SOAK,
-	SHARK_BMS_EXIT_485,
-} shark_bms_exit_code_t;
+	SHARK_BATT_POWER_OFF,
+	SHARK_BATT_POWER_FULL,
+	SHARK_BATT_POWER_SMALL,
+} shark_battery_power_t;
+
+typedef enum {
+	SHARK_BATT_EXIT_SUCCESS,
+	SHARK_BATT_EXIT_UPGRADE,
+	SHARK_BATT_EXIT_POWER,
+	SHARK_BATT_EXIT_SHAKE,
+	SHARK_BATT_EXIT_ERROR,
+	SHARK_BATT_EXIT_SOAK,
+	SHARK_BATT_EXIT_485,
+} shark_battery_exit_t;
 
 #pragma  pack (push,1)  
 typedef struct
@@ -167,10 +185,8 @@ typedef struct
 	uint8_t define_error;
 	uint8_t test_error;
 	uint8_t conn_state;
-	uint8_t exit_code;
-
-	uint16_t open_times;
-	shark_battery_state_t state;	
+	shark_battery_state_t state;
+	shark_battery_exit_t exit_code;
 }SUB_BMS_INFO;
 
 extern SUB_BMS_INFO sub_bms_info_1;
@@ -332,9 +348,9 @@ void  Sub_BMS_1_lt_State(void);
 
 void  Sub_BMS_2_lt_State(void);
 
-shark_bms_exit_code_t Is_Sub_BMS_1_Normal(void);
+shark_battery_exit_t Is_Sub_BMS_1_Normal(void);
 
-shark_bms_exit_code_t Is_Sub_BMS_2_Normal(void);
+shark_battery_exit_t Is_Sub_BMS_2_Normal(void);
 
 int8_t Operate_Sub_BMS_1_CD(uint8_t on);
 
@@ -365,10 +381,38 @@ void Ca_Chu_Test_Info(void);
 
 void Check_Enable_Test_Info(void);
 
-uint8_t shark_bms_check_xl(void);
-uint8_t shark_battery_detect(SUB_BMS_INFO *info);
-uint8_t shark_battery_is_normal(SUB_BMS_INFO *info);
-uint8_t shark_battery_wait_stable(uint32_t delay);
+shark_bool shark_bms_check_xl(void);
+shark_battery_exit_t shark_battery_is_normal(SUB_BMS_INFO *info);
+void shark_bms_set_vgs(shark_bms_vgs_t vgs, shark_bool enable);
+void shark_bms_set_mos(shark_bool ss, shark_bool s11, shark_bool s21);
+u8 shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2);
+shark_bool shark_battery_is_power_on(SUB_BMS_INFO *info);
+shark_bool shark_battery_is_normal_power_on(SUB_BMS_INFO *info);
+
+static inline void shark_bms_set_mos_close(void)
+{
+	shark_bms_set_mos(shark_false, shark_false, shark_false);
+}
+
+static inline void shark_bms_set_mos_bat1(void)
+{
+	shark_bms_set_mos(shark_false, shark_false, shark_true);
+}
+
+static inline void shark_bms_set_mos_bat2(void)
+{
+	shark_bms_set_mos(shark_false, shark_true, shark_false);
+}
+
+static inline void shark_bms_set_mos_series(void)
+{
+	shark_bms_set_mos(shark_true, shark_false, shark_false);
+}
+
+static inline void shark_bms_set_mos_parrallel(void)
+{
+	shark_bms_set_mos(shark_false, shark_true, shark_true);
+}
 
 #endif
 

+ 10 - 0
Source/common.h

@@ -35,10 +35,20 @@
 		} \
 	} while (0)
 
+#define SHARK_BOOL(value) \
+	((shark_bool) (value))
+
 extern const uint8_t soft_version[];
 extern uint8_t sn[PS100_SERIAL_NUM_SIZE];
 extern uint8_t shark_printf_enable;
 
+typedef uint8_t u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+typedef uint64_t u64;
+
+typedef enum { shark_false, shark_true } shark_bool;
+
 typedef struct
 {
 	uint8_t set;

+ 11 - 11
Source/delay.c

@@ -20,6 +20,13 @@ uint64_t shark_mseconds;
 uint32_t utc_seconds = 1505216210;// 2017/9/12  19:37:50
 uint16_t s_ms ;
 
+uint64_t shark_get_time_safe(void)
+{
+	fwdgt_counter_reload();
+	Handle_Can_Data();
+	return shark_mseconds;
+}
+
 void systick_close(void)
 {
 	//close tick
@@ -63,7 +70,10 @@ void systick_config(void)
 void delay_1ms(uint32_t count)
 {
 	uint64_t time = shark_mseconds + count;
-	while (time > shark_mseconds);
+
+	while (time > shark_mseconds) {
+		fwdgt_counter_reload();
+	}
 }
 
 #if 0
@@ -85,16 +95,6 @@ void SysTick_Handler(void)
 {
 	shark_mseconds++;
 
-	//uint8_t i,j;
-
-	if (BAT1_IS_OPEN() && sub_bms_info_1.open_times < 0xFFFF) {
-		sub_bms_info_1.open_times++;
-	}
-
-	if (BAT2_IS_OPEN() && sub_bms_info_2.open_times < 0xFFFF) {
-		sub_bms_info_2.open_times++;
-	}
-
 	if(++s_ms >= 1000)
 	{
 		utc_seconds++;

+ 2 - 1
Source/delay.h

@@ -9,8 +9,9 @@ void systick_close(void);
 void systick_config(void);
 void delay_1ms(uint32_t count);
 void delay_1us(uint16_t cnt);
+uint64_t shark_get_time_safe(void);
 
-static inline uint64_t shark_get_mseconds(void)
+static inline uint64_t shark_get_time(void)
 {
 	return shark_mseconds;
 }

+ 1 - 6
Source/drv_can.c

@@ -452,16 +452,11 @@ static can_trasnmit_message_struct shark_can_log_message;
 
 static void shark_can_log_flush(uint8_t dest)
 {
-	uint32_t times = 100000;
-
 	shark_can_log_message.tx_efid = 3 << 24 | 1 << 19 | 1 << 14 | SELF_ID << 7 | dest;
 	shark_can_log_message.tx_ff = CAN_FF_EXTENDED;
 	shark_can_log_message.tx_ft = CAN_FT_DATA;
 
-	while (can_message_transmit(CAN0, &shark_can_log_message) == CAN_NOMAILBOX && times > 0) {
-		times--;
-	}
-
+	can_message_transmit(CAN0, &shark_can_log_message);
 	shark_can_log_message.tx_dlen = 0;
 }
 

+ 11 - 7
Source/drv_io.c

@@ -33,6 +33,7 @@ uint8_t QD_switch_from = 0;
 extern void S11_FL_On(uint8_t on);
 extern uint8_t S11_May_Operate(void);
 
+#if 0
 void Check_S11_May_Operate(void)
 {
 	if(QD_Dect() == 0 && ACC2_Is_On() == 0 && S11_May_Operate())
@@ -68,11 +69,13 @@ void Check_S11(uint8_t on,uint8_t from)
 		}
 	}
 }
+#endif
+
 void QD_Enable_From(uint8_t on,uint8_t from)
 {
 	println("qd: %d %d", on, from);
 
-	Check_S11(on,FROM_QD);
+	// Check_S11(on,FROM_QD);
 	QD_Enable(on);
 	QD_switch_from = from;
 }
@@ -105,14 +108,13 @@ void ACC2_Enable(uint8_t on)
 {
 	println("acc2: %d", on);
 
+	shark_bms_set_vgs(SHARK_BMS_VGS_ACC2, SHARK_BOOL(on));
+
 #if ACC2_USE_PWM
-	Check_S11(on,FROM_ACC12);
-	
 	if(on)
 	{
 		acc2_delay.set = 1;
 		acc2_delay.count = 0;
-		FL_Enable(1);
 	}
 	else
 	{
@@ -162,6 +164,7 @@ void E_CTR_Dec_IRQ_Initial(void)
 	exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
     exti_interrupt_flag_clear(EXTI_7);
 
+#if CONFIG_BATT_DET_USE_IRQ
 	// BAT1 DET
 	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOC, GPIO_PIN_SOURCE_2);
 	exti_init(EXTI_2, EXTI_INTERRUPT, EXTI_TRIG_RISING);
@@ -173,6 +176,7 @@ void E_CTR_Dec_IRQ_Initial(void)
 	exti_init(EXTI_1, EXTI_INTERRUPT, EXTI_TRIG_RISING);
 	exti_interrupt_flag_clear(EXTI_1);
 	nvic_irq_enable(EXTI1_IRQn, 1, 0);
+#endif
 }
 void E_CTR_Initial(void)
 {
@@ -299,7 +303,7 @@ void GPIO_Initial(void)
 
 	//
 	gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_2);
-	FL_Enable(0);
+	shark_bms_set_vgs(SHARK_BMS_VGS_ALL, shark_false);
 	
 	
 }
@@ -370,11 +374,11 @@ void EXTI0_IRQHandler(void)
     }
 }
 
+#if CONFIG_BATT_DET_USE_IRQ
 void EXTI1_IRQHandler(void)
 {
 	if (RESET != exti_flag_get(EXTI_1)) {
 		exti_flag_clear(EXTI_1);
-		sub_bms_info_2.open_times = 0;
 	}
 }
 
@@ -382,9 +386,9 @@ void EXTI2_IRQHandler(void)
 {
 	if (RESET != exti_flag_get(EXTI_2)) {
 		exti_flag_clear(EXTI_2);
-		sub_bms_info_1.open_times = 0;
 	}
 }
+#endif
 
 void EXTI3_IRQHandler(void)
 {

+ 13 - 0
Source/drv_io.h

@@ -1,6 +1,19 @@
 #ifndef  __GPIO_Init_H__
 #define  __GPIO_Init_H__
 
+#define CONFIG_BATT_DET_USE_IRQ		0
+
+#define GPIO_PORT_FL				GPIOB
+#define GPIO_PIN_FL					GPIO_PIN_2
+
+#define GPIO_PORT_S11				GPIOB
+#define GPIO_PIN_S11				GPIO_PIN_13
+
+#define GPIO_PORT_S21				GPIOB
+#define GPIO_PIN_S21				GPIO_PIN_15
+
+#define GPIO_PORT_SS				GPIOB
+#define GPIO_PIN_SS					GPIO_PIN_14
 
 #define Can_Power_Enable(on) gpio_bit_write(GPIOA,GPIO_PIN_12,(bit_status)(!on))
 #define FL_Enable(on) gpio_bit_write(GPIOB,GPIO_PIN_2,(bit_status)(!on))

+ 1 - 1
Source/sw_build_info.h

@@ -1,3 +1,3 @@
 #pragma once
 
-#define CONFIG_VERSION "PS100XX_V01_11052041"
+#define CONFIG_VERSION "PS100XX_V01_11061622"