Просмотр исходного кода

update battery switch

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao 5 лет назад
Родитель
Сommit
9faa4b79b3
11 измененных файлов с 238 добавлено и 159 удалено
  1. 1 1
      Project/version.txt
  2. 43 18
      Source/app.c
  3. 1 3
      Source/app.h
  4. 2 2
      Source/app_can.c
  5. 23 4
      Source/app_end_ctr.c
  6. 134 46
      Source/app_rs485_1.c
  7. 19 7
      Source/app_rs485_1.h
  8. 9 63
      Source/app_rs485_2.c
  9. 4 12
      Source/delay.c
  10. 1 2
      Source/drv_io.c
  11. 1 1
      Source/sw_build_info.h

+ 1 - 1
Project/version.txt

@@ -1 +1 @@
-PS100XX_V01_11041811
+PS100XX_V01_11052041

+ 43 - 18
Source/app.c

@@ -28,7 +28,6 @@ uint8_t CB_OPERATE_PRECEDENCE_Config = PRE_SERIES;
 DELAY_COMMON Series_delay;
 DELAY_COMMON Next_Series_delay;
 uint8_t Next_Series_Not_Enable = 0;
-uint8_t define_bms_1_error = D_BMS_ERROR_NO,define_bms_2_error = D_BMS_ERROR_NO;
 
 uint8_t one_bat_charge_status = OBCS_CHARGER_OUT;
 
@@ -148,18 +147,16 @@ uint8_t battery_wait_voltage_down(uint32_t voltage)
 	return 0;
 }
 
-uint8_t shark_switch_disabled;
-
 int8_t Battery_CB_Switch(uint8_t cb_operate)
 {
 	CB_VAL cb_val_temp;
 	uint16_t i = 0;
 
-	if (shark_switch_disabled && cb_operate != CB_BAT_NO && cb_operate_state != CB_BAT1_BAT2_SERIES) {
-		return cb_operate_state;
+	if (Is_Soak()) {
+		cb_operate = CB_BAT_NO;
 	}
 
-	println("switch: %d", cb_operate);
+	println("switch: %d -> %d", cb_operate_state, cb_operate);
 
 #define COM_TIMEOUT  (15)
 
@@ -181,7 +178,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 			{
 				case CB_BAT_NO:
 					//
-					if(sub_bms_2_lt_state == SUB_BMS_CONT_HV485)
+					if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
 					{
 						i = 0;
 						while(i++ < COM_TIMEOUT && RS485_busy_2)
@@ -192,7 +189,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 						if(Operate_Sub_BMS_2_CD(0) == 0)
 							goto SWITCH_ERROR;
 					}
-					else if(sub_bms_2_lt_state == SUB_BMS_DISC_NO485)
+					else if(sub_bms_info_2.conn_state == SUB_BMS_DISC_NO485)
 					{
 						if(Check_Battery_2_On())
 							goto SWITCH_ERROR;
@@ -261,7 +258,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 					break;
 				case CB_BAT1_BAT2_SERIES:
 					//
-					if(sub_bms_2_lt_state == SUB_BMS_CONT_HV485)
+					if(sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485)
 					{
 						i = 0;
 						while(i++ < COM_TIMEOUT && RS485_busy_2)
@@ -288,6 +285,8 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 			cb_val_temp.s21_bit = 1;
 			cb_val_temp.ss__bit = 0;
 			Battery_CB_Operate(&cb_val_temp);
+			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;
@@ -305,7 +304,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 			{
 				case CB_BAT_NO:
 					//
-					if(sub_bms_1_lt_state == SUB_BMS_CONT_HV485)
+					if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
 					{
 						i = 0;
 						while(i++ < COM_TIMEOUT && RS485_busy_1)
@@ -316,7 +315,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 						if(Operate_Sub_BMS_1_CD(0) == 0)
 							goto SWITCH_ERROR;
 					}
-					else if(sub_bms_1_lt_state == SUB_BMS_DISC_NO485)
+					else if(sub_bms_info_1.conn_state == SUB_BMS_DISC_NO485)
 					{
 						if(Check_Battery_1_On())
 							goto SWITCH_ERROR;
@@ -385,7 +384,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 					break;
 				case CB_BAT1_BAT2_SERIES:
 					//
-					if(sub_bms_1_lt_state == SUB_BMS_CONT_HV485)
+					if(sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485)
 					{
 						i = 0;
 						while(i++ < COM_TIMEOUT && RS485_busy_1)
@@ -413,6 +412,8 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 			cb_val_temp.s21_bit = 0;
 			cb_val_temp.ss__bit = 0;
 			Battery_CB_Operate(&cb_val_temp);
+			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;
@@ -468,6 +469,8 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 			cb_val_temp.s21_bit = 1;
 			cb_val_temp.ss__bit = 0;
 			Battery_CB_Operate(&cb_val_temp);
+			sub_bms_info_1.state = SHARK_BATT_STATE_USED;
+			sub_bms_info_2.state = SHARK_BATT_STATE_USED;
 			break;
 		case CB_BAT1_BAT2_SERIES:
 
@@ -662,6 +665,8 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 			cb_val_temp.s21_bit = 0;
 			cb_val_temp.ss__bit = 1;
 			Battery_CB_Operate(&cb_val_temp);
+			sub_bms_info_1.state = SHARK_BATT_STATE_USED;
+			sub_bms_info_2.state = SHARK_BATT_STATE_USED;
 			break;
 		case CB_BAT_NO:
 		default:
@@ -672,6 +677,8 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 			cb_val_temp.s21_bit = 0;
 			cb_val_temp.ss__bit = 0;
 			Battery_CB_Operate(&cb_val_temp);
+			sub_bms_info_1.state = SHARK_BATT_STATE_IDLE;
+			sub_bms_info_2.state = SHARK_BATT_STATE_IDLE;
 			cb_operate = CB_BAT_NO;
 			if(Is_Soak())
 			{
@@ -691,6 +698,7 @@ int8_t Battery_CB_Switch(uint8_t cb_operate)
 	return 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;
@@ -719,6 +727,15 @@ uint8_t Select_One_BAT(void)
 {
 	uint8_t temp_op = CB_BAT_NO;
 
+	println("select one");
+
+	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_2_Normal() == SHARK_BMS_EXIT_SUCCESS)
@@ -1008,25 +1025,29 @@ uint8_t Check_CB_BAT1_BAT2_SERIES(void)
 		temp_op = Select_One_BAT();
 		return temp_op;
 	}	
-	
+
+	if (Measure_Vol() < SELECT_ONE_BATTERY_VOL) {
+		return Select_One_BAT();
+	}
+
 	if(Is_Sub_BMS_1_Normal() == SHARK_BMS_EXIT_SUCCESS && Is_Sub_BMS_2_Normal() == SHARK_BMS_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))
 		{
 			//sub_bms_info_1.sub_bms_cmd.operate = OP_OPEN_FET;
 			//sub_bms_info_1.sub_bms_cmd.param = 0x03;
-			define_bms_1_error = D_BMS_ERROR_SERISE_CD_OFF;
+			sub_bms_info_1.define_error= D_BMS_ERROR_SERISE_CD_OFF;
 			temp_op = Select_One_BAT();
-			define_bms_1_error = D_BMS_ERROR_NO;
+			sub_bms_info_1.define_error = D_BMS_ERROR_NO;
 			return temp_op;
 		}
 		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))
 		{
 			//sub_bms_info_2.sub_bms_cmd.operate = OP_OPEN_FET;
 			//sub_bms_info_2.sub_bms_cmd.param = 0x03;
-			define_bms_2_error = D_BMS_ERROR_SERISE_CD_OFF;
+			sub_bms_info_2.define_error = D_BMS_ERROR_SERISE_CD_OFF;
 			temp_op = Select_One_BAT();
-			define_bms_2_error = D_BMS_ERROR_NO;
+			sub_bms_info_2.define_error = D_BMS_ERROR_NO;
 			return temp_op;
 		}
 	}
@@ -1176,6 +1197,10 @@ void Check_CB_Operate_State(void)
 			return;	
 	}
 
+	if (Is_Soak()) {
+		temp_op = CB_BAT_NO;
+	}
+
 	if(temp_op >= CB_MAX)
 	{
 		//test-start
@@ -1500,7 +1525,7 @@ void Intelligent_Management_Battery(void)
 		}
 		else
 		{
-			if(cb_operate_state == CB_BAT1_BAT2_SERIES)
+			if(cb_operate_state == CB_BAT1_BAT2_SERIES || end_ctr_self_ss_new.qd_sta)
 				return;		
 			else if(Battery_Change_Mode(CB_BAT1_BAT2_SERIES) == CB_BAT1_BAT2_SERIES)
 				return;

+ 1 - 3
Source/app.h

@@ -110,7 +110,7 @@ __inline void Check_CB_Oper_Sta_Delay(void)
 #define SERIES_PROTECT_VOL  (CHECK_SERIES_PROTECT_VOL + 3000)
 #define SERIES_UNDER_VOL_TIME_OUT  (4000)
 #define NEXT_SERIES_TIME_OUT  (5000)
-#define SELECT_ONE_BATTERY_VOL  (65000)
+#define SELECT_ONE_BATTERY_VOL  (60000)
 #define SERIES_UNDER_XX_PERCENT  (20)
 
 enum
@@ -121,8 +121,6 @@ enum
 
 	D_BMS_ERROR_MAX
 };
-extern uint8_t define_bms_1_error;
-extern uint8_t define_bms_2_error;
 
 enum
 {

+ 2 - 2
Source/app_can.c

@@ -177,7 +177,7 @@ int8_t Handle_Can_Data(void)
 				printf("return:%d\r\n",Battery_CB_Switch(app_can_buf[len]));
 				break;
 			case OPERATE_POWER_DATA:
-				printf("sub_bms_1_lt_state:%d\r\n",sub_bms_1_lt_state);
+				printf("sub_bms_1_lt_state:%d\r\n",sub_bms_info_1.conn_state);
 				printf("rs485_connect_1:%d\r\n",sub_bms_info_1.rs485_connect);
 				printf("rs485_time_out_1:%d\r\n",sub_bms_info_1.rs485_time_out);
 				printf("yjkxslc_1:%d\r\n",sub_bms_info_1.packet_common.yjkxslc);
@@ -216,7 +216,7 @@ int8_t Handle_Can_Data(void)
 				break;
 				
 			case OPERATE_ENERGY_DATA: //0x0C
-				printf("sub_bms_2_lt_state:%d\r\n",sub_bms_2_lt_state);
+				printf("sub_bms_2_lt_state:%d\r\n",sub_bms_info_2.conn_state);
 				
 				printf("rs485_connect_2:%d\r\n",sub_bms_info_2.rs485_connect);
 				printf("rs485_time_out_2:%d\r\n",sub_bms_info_2.rs485_time_out);

+ 23 - 4
Source/app_end_ctr.c

@@ -326,8 +326,8 @@ int8_t Handle_Can_Ctr_CMD(CAN_FRAME*can_ctr_frame)
 		case KEY_END_CTR_ACC12_TEST:
 			if(work_normal == 1)
 			{
-				bms_1_test_define_error = buf[2];
-				bms_2_test_define_error = buf[3];
+				sub_bms_info_1.test_error = buf[2];
+				sub_bms_info_2.test_error = buf[3];
 			}
 			break;
 		case KEY_END_CTR_ACC12_TEST_1:
@@ -598,6 +598,25 @@ 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;
+					break;
+				case 6:
+					buf[len++] = cb_operate_state;
+					buf[len++] = sub_bms_info_1.exit_code;
+					buf[len++] = sub_bms_info_2.exit_code;
+					break;
+				case 7:
+					buf[len++] = end_ctr_self_ss_new.acc12_sta << 1 | ACC2_Dect();
+					buf[len++] = end_ctr_self_ss_new.qd_sta << 1 | QD_Dect();
+					break;
 				default:
 					buf[len++] = 0;
 					break;
@@ -792,8 +811,8 @@ void Check_End_Ctr_Status(void)
 	end_ctr_self_ss_new.moto_temp = ctr_temperature[1];
 
 	end_ctr_self_ss_new.ps100_temp = ctr_temperature[0];
-	end_ctr_self_ss_new.bms_1_status = sub_bms_1_lt_state;
-	end_ctr_self_ss_new.bms_2_status = sub_bms_2_lt_state;
+	end_ctr_self_ss_new.bms_1_status = sub_bms_info_1.conn_state;
+	end_ctr_self_ss_new.bms_2_status = sub_bms_info_2.conn_state;
 	end_ctr_self_ss_new.using_bms_mode = cb_operate_state;
 
 	end_ctr_self_ss_new.nhb = (uint16_t)(sheng_yu_li_cheng.sy_ss_parm.neng_hao_bi);

+ 134 - 46
Source/app_rs485_1.c

@@ -4,6 +4,7 @@
 #include "app.h"
 #include "hardware_test.h"
 #include "app_end_ctr.h"
+#include "drv_io.h"
 
 //uart1
 static uint8_t app_rs485_buf[TX_BUFFER_SIZE];
@@ -17,16 +18,10 @@ DELAY_COMMON send_delay;
 
 uint8_t RS485_busy_1 = 0;
 
-uint8_t sub_bms_1_lt_state = SUB_BMS_INVALID_STATUS;
-
 uint8_t sub_bms_1_connect = 0;
 
 uint8_t cang_wei = CW_CHE_SHANG_NO_CHARGER;
 
-uint16_t bms_1_work_status = 0;
-
-uint8_t bms_1_test_define_error = 0;
-
 TEST_INFO test_info;
 
 static int8_t Get_Check_Sum_1(uint16_t*value,uint8_t*data,uint16_t size)
@@ -69,11 +64,11 @@ void RS485_Communication_Time_Out_1(void)
 {
 	if(sub_bms_info_1.rs485_connect)
 	{
-		sub_bms_1_lt_state = SUB_BMS_CONT_NO485;
+		sub_bms_info_1.conn_state = SUB_BMS_CONT_NO485;
 	}
 	else
 	{
-		sub_bms_1_lt_state = SUB_BMS_DISC_NO485;
+		sub_bms_info_1.conn_state = SUB_BMS_DISC_NO485;
 	}
 	
 	if(sub_bms_info_1.rs485_time_out)
@@ -120,11 +115,11 @@ static int8_t Handle_Sub_BMS_CMD_1(uint8_t *data)
 
 		if(sub_bms_info_1.rs485_connect)
 		{
-			sub_bms_1_lt_state = SUB_BMS_CONT_HV485;
+			sub_bms_info_1.conn_state = SUB_BMS_CONT_HV485;
 		}
 		else
 		{
-			sub_bms_1_lt_state = SUB_BMS_DISC_HV485;
+			sub_bms_info_1.conn_state = SUB_BMS_DISC_HV485;
 		}
 		
 		//CRC 
@@ -389,7 +384,7 @@ void Check_Sub_BMS_1(void)
 	{
 		if(sub_bms_info_1.rs485_connect)
 		{
-			memset(&sub_bms_info_1,0x00,sizeof(sub_bms_info_1));
+			// memset(&sub_bms_info_1,0x00,sizeof(sub_bms_info_1));
 			memset(&sub_rs485_time_out_1,0x00,sizeof(sub_rs485_time_out_1));
 			RS485_busy_1 = 0;
 
@@ -456,7 +451,7 @@ void Sub_BMS_1_Initial(void)
 
 void  Sub_BMS_1_lt_State(void)
 {
-	switch(sub_bms_1_lt_state)
+	switch(sub_bms_info_1.conn_state)
 	{
 		case SUB_BMS_INVALID_STATUS:
 			break;
@@ -472,58 +467,69 @@ void  Sub_BMS_1_lt_State(void)
 	
 }
 
-uint8_t Is_Sub_BMS_1_Normal(void)
+static uint8_t shark_battery_is_normal_raw(SUB_BMS_INFO *info)
 {
-	uint16_t work_sta = sub_bms_info_1.packet_common.work_status;
-
-	work_sta &= ~ST_CHRG_CUR;
-	work_sta &= ~ST_DISCHRG_CUR;
-	work_sta &= ~ST_OVRDISCHRG_CUR;
-	work_sta &= ~ST_SMALL_CURRENT_OVER;
-	if(IS_CHARGER_ON())
-	//if(IS_CHARGE_IN())
-	{
-		work_sta &= ~ST_OVRDISCHRG_VOL;
-		work_sta &= ~ST_PDOWN;
-		work_sta &= ~ST_UDR_TEMPE_DISCHRG;
-		work_sta &= ~ST_OVR_TEMPE_DISCHRG;
-	}
-	else
-	{
-		work_sta &= ~ST_OVRCHRG_VOL;
-		work_sta &= ~ST_OVR_TEMPE_CHRG;
-		work_sta &= ~ST_UDR_TEMPE_CHRG;
-	}
+	uint16_t work_status;
 
-	if(update_bat.ub_bat == UPDATE_BAT_1) {
-		return SHARK_BMS_EXIT_UPGRADE;
+	if (info->define_error != D_BMS_ERROR_NO) {
+		return SHARK_BMS_EXIT_ERROR;
 	}
 
-	if(define_bms_1_error != D_BMS_ERROR_NO) {
+	if (info->test_error != D_BMS_ERROR_NO) {
 		return SHARK_BMS_EXIT_ERROR;
 	}
 
-	if(Is_Soak()) {
-		return SHARK_BMS_EXIT_SOAK;
+	work_status = info->packet_common.work_status;
+	work_status &= ~(ST_CHRG_CUR | ST_DISCHRG_CUR | ST_OVRDISCHRG_CUR | ST_SMALL_CURRENT_OVER);
+
+	if (IS_CHARGER_ON()) {
+		work_status &= ~(ST_OVRDISCHRG_VOL | ST_PDOWN | ST_UDR_TEMPE_DISCHRG | ST_OVR_TEMPE_DISCHRG);
+	} else {
+		work_status &= ~(ST_OVRCHRG_VOL | ST_OVR_TEMPE_CHRG | ST_UDR_TEMPE_CHRG);
 	}
 
-	if(work_sta)
-	{
-		bms_1_work_status = sub_bms_info_1.packet_common.work_status;			
+	if(work_status) {
 		return SHARK_BMS_EXIT_ERROR;
 	}
 
-	if(sub_bms_1_lt_state != SUB_BMS_CONT_HV485) {			
-		return SHARK_BMS_EXIT_485;
+	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(bms_1_test_define_error != 0) {			
-		return SHARK_BMS_EXIT_ERROR;
+	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;
+		}
+
+		if (update_bat.ub_bat == UPDATE_BAT_2 && info == &sub_bms_info_2) {
+			return SHARK_BMS_EXIT_UPGRADE;
+		}
 	}
 
 	return SHARK_BMS_EXIT_SUCCESS;
 }
 
+uint8_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)
+{
+	return shark_battery_is_normal(&sub_bms_info_1);
+}
+
 int8_t Operate_Sub_BMS_1_CD(uint8_t on)
 {
 	uint8_t cd_fet,rtn;
@@ -581,6 +587,56 @@ 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;
+	uint8_t mask = 0;
+
+	while (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_1) {
+		if (time < shark_get_mseconds()) {
+			println("bat1 busy");
+			return 0;
+		}
+	}
+
+	while (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485 && RS485_busy_2) {
+		if (time < shark_get_mseconds()) {
+			println("bat2 busy");
+			return 0;
+		}
+	}
+
+	sub_bms_info_1.conn_state = SUB_BMS_DISC_HV485;
+	sub_bms_info_1.sub_bms_cmd.operate = OP_READ_INFO;
+	g_event &= ~RS485_RECEIVE_END_EVENT;
+
+	sub_bms_info_2.conn_state = SUB_BMS_DISC_HV485;
+	sub_bms_info_2.sub_bms_cmd.operate = OP_READ_INFO;
+	g_event &= ~RS485_RECEIVE_END_EVENT;
+
+	Send_Sub_BMS_CMD_1();
+	Send_Sub_BMS_CMD_2();
+
+	while (time > shark_get_mseconds() && mask != 3) {
+		if(g_event & RS485_RECEIVE_END_EVENT) {
+			g_event &= ~RS485_RECEIVE_END_EVENT;
+			Handle_RS485_1_Data();
+			mask |= 1;
+			println("mask1: %d", mask);
+		}
+
+		if (g_event & RS485_2_RECEIVE_END_EVENT) {
+			g_event &= ~RS485_2_RECEIVE_END_EVENT;
+			Handle_RS485_2_Data();
+			mask |= 2;
+			println("mask2: %d", mask);
+		}
+	}
+
+	println("mask: %d", mask);
+
+	return 1;
+}
 
 
 int8_t Update_Sub_BMS_1_Software(uint8_t step)
@@ -630,7 +686,7 @@ int8_t Update_Sub_BMS_1_Software(uint8_t step)
 
 uint8_t Sub_BMS_1_COM_Finish(void)
 {
-	return sub_bms_1_lt_state;
+	return sub_bms_info_1.conn_state;
 }
 
 
@@ -720,3 +776,35 @@ void Check_Enable_Test_Info(void)
 		test_info.ti_set = 0;
 }
 
+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)
+{
+	if ((info->packet_common.bms_status & (BMS_STA_D_OPEN | BMS_STA_S_OPEN)) != 0) {
+		return info->open_times > 500;
+	}
+
+	return 1;
+}
+
+uint8_t shark_battery_wait_stable(uint32_t delay)
+{
+	uint64_t time = shark_get_mseconds() + delay;
+	uint8_t mask = 0x00;
+
+	while (time > shark_get_mseconds() && mask != 3) {
+		if (shark_battery_detect(&sub_bms_info_1)) {
+			mask |= 1;
+		}
+
+		if (shark_battery_detect(&sub_bms_info_2)) {
+			mask |= 2;
+		}
+	}
+
+	return mask;
+}
+

+ 19 - 7
Source/app_rs485_1.h

@@ -79,10 +79,16 @@ typedef struct
 
 /*******************************************BMS֡ͷ-end*********************************************************/
 
+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;
@@ -158,8 +164,13 @@ typedef struct
 	
 	uint8_t rs485_connect;
 	uint8_t rs485_time_out;
+	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;	
 }SUB_BMS_INFO;
 
 extern SUB_BMS_INFO sub_bms_info_1;
@@ -266,8 +277,6 @@ enum
 	SUB_BMS_CONT_HV485,
 	SUB_BMS_CONT_NO485,
 };
-extern uint8_t sub_bms_1_lt_state;
-extern uint8_t sub_bms_2_lt_state;
 
 enum
 {
@@ -280,11 +289,6 @@ enum
 };
 extern uint8_t cang_wei;
 
-extern uint16_t bms_1_work_status ;
-extern uint16_t bms_2_work_status ;
-extern uint8_t bms_1_test_define_error;
-extern uint8_t bms_2_test_define_error;
-
 typedef struct
 {
 	uint32_t bms_err_timeout_cnt;
@@ -335,6 +339,9 @@ shark_bms_exit_code_t Is_Sub_BMS_2_Normal(void);
 int8_t Operate_Sub_BMS_1_CD(uint8_t on);
 
 int8_t Operate_Sub_BMS_2_CD(uint8_t on);
+int8_t Send_Sub_BMS_CMD_2(void);
+
+int8_t Operate_Sub_BMS_PING(uint32_t delay);
 
 uint8_t Sub_BMS_1_COM_Finish(void);
 
@@ -358,5 +365,10 @@ 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);
+
 #endif
 

+ 9 - 63
Source/app_rs485_2.c

@@ -16,14 +16,8 @@ SUB_BMS_INFO sub_bms_info_2;
 
 uint8_t RS485_busy_2 = 0;
 
-uint8_t sub_bms_2_lt_state = SUB_BMS_INVALID_STATUS;	
-
 uint8_t sub_bms_2_connect = 0;
 
-uint16_t bms_2_work_status = 0;
-
-uint8_t bms_2_test_define_error = 0;
-
 static int8_t Get_Check_Sum_2(uint16_t*value,uint8_t*data,uint16_t size)
 {
 	uint32_t checksum;
@@ -65,11 +59,11 @@ void RS485_Communication_Time_Out_2(void)
 {
 	if(sub_bms_info_2.rs485_connect)
 	{
-		sub_bms_2_lt_state = SUB_BMS_CONT_NO485;
+		sub_bms_info_2.conn_state = SUB_BMS_CONT_NO485;
 	}
 	else
 	{
-		sub_bms_2_lt_state = SUB_BMS_DISC_NO485;
+		sub_bms_info_2.conn_state = SUB_BMS_DISC_NO485;
 	}
 
 	
@@ -119,11 +113,11 @@ static int8_t Handle_Sub_BMS_CMD_2(uint8_t *data)
 
 		if(sub_bms_info_2.rs485_connect)
 		{
-			sub_bms_2_lt_state = SUB_BMS_CONT_HV485;
+			sub_bms_info_2.conn_state = SUB_BMS_CONT_HV485;
 		}
 		else
 		{
-			sub_bms_2_lt_state = SUB_BMS_DISC_HV485;
+			sub_bms_info_2.conn_state = SUB_BMS_DISC_HV485;
 		}
 		
 		//CRC 
@@ -233,7 +227,7 @@ static int8_t Handle_Sub_BMS_CMD_2(uint8_t *data)
 
 
 
-static int8_t Send_Sub_BMS_CMD_2(void)
+int8_t Send_Sub_BMS_CMD_2(void)
 {
 	int8_t bStatus;// ĬÈÏÐèÒª»Ø¸´
 	COMMAND_BODY*body = (COMMAND_BODY*)app_rs485_buf;
@@ -390,7 +384,7 @@ void Check_Sub_BMS_2(void)
 	{
 		if(sub_bms_info_2.rs485_connect)
 		{
-			memset(&sub_bms_info_2,0x00,sizeof(sub_bms_info_2));
+			// memset(&sub_bms_info_2,0x00,sizeof(sub_bms_info_2));
 			memset(&sub_rs485_time_out_2,0x00,sizeof(sub_rs485_time_out_2));
 			RS485_busy_2 = 0;
 			//sub_bms_2_lt_state = SUB_BMS_DISC_NO485;
@@ -451,7 +445,7 @@ void Sub_BMS_2_Initial(void)
 
 void  Sub_BMS_2_lt_State(void)
 {
-	switch(sub_bms_2_lt_state)
+	switch(sub_bms_info_2.conn_state)
 	{
 		case SUB_BMS_INVALID_STATUS:
 			break;
@@ -469,55 +463,7 @@ void  Sub_BMS_2_lt_State(void)
 
 uint8_t Is_Sub_BMS_2_Normal(void)
 {
-	uint16_t work_sta = sub_bms_info_2.packet_common.work_status;
-
-	work_sta &= ~ST_CHRG_CUR;
-	work_sta &= ~ST_DISCHRG_CUR;
-	work_sta &= ~ST_OVRDISCHRG_CUR;
-	work_sta &= ~ST_SMALL_CURRENT_OVER;
-	if(IS_CHARGER_ON())
-	//if(IS_CHARGE_IN())
-	{
-		work_sta &= ~ST_OVRDISCHRG_VOL;
-		work_sta &= ~ST_PDOWN;
-		work_sta &= ~ST_UDR_TEMPE_DISCHRG;
-		work_sta &= ~ST_OVR_TEMPE_DISCHRG;
-	}
-	else
-	{
-		work_sta &= ~ST_OVRCHRG_VOL;
-		work_sta &= ~ST_OVR_TEMPE_CHRG;
-		work_sta &= ~ST_UDR_TEMPE_CHRG;
-	}
-
-	if(update_bat.ub_bat == UPDATE_BAT_2) {
-		return SHARK_BMS_EXIT_UPGRADE;
-	}
-
-	if(define_bms_2_error != D_BMS_ERROR_NO) {			
-		return SHARK_BMS_EXIT_ERROR;
-	}
-
-	if(Is_Soak()) {
-		return SHARK_BMS_EXIT_SOAK;
-	}
-
-	if(work_sta)
-	{
-		bms_2_work_status = sub_bms_info_2.packet_common.work_status;
-		return SHARK_BMS_EXIT_ERROR;
-	}
-
-	if(sub_bms_2_lt_state != SUB_BMS_CONT_HV485) {
-		return SHARK_BMS_EXIT_485;
-	}
-
-	if(bms_2_test_define_error != 0) {
-		return SHARK_BMS_EXIT_ERROR;
-	}
-
-	return SHARK_BMS_EXIT_SUCCESS;
-	
+	return shark_battery_is_normal(&sub_bms_info_2);
 }
 
 
@@ -624,6 +570,6 @@ int8_t Update_Sub_BMS_2_Software(uint8_t step)
 
 uint8_t Sub_BMS_2_COM_Finish(void)
 {
-	return sub_bms_2_lt_state;
+	return sub_bms_info_1.conn_state;
 }
 

+ 4 - 12
Source/delay.c

@@ -87,20 +87,12 @@ void SysTick_Handler(void)
 
 	//uint8_t i,j;
 
-	if (BAT1_IS_OPEN()) {
-		if (sub_bms_info_1.open_times < 0xFFFF) {
-			sub_bms_info_1.open_times++;
-		}
-	} else if (sub_bms_info_1.open_times > 0) {
-		sub_bms_info_1.open_times--;
+	if (BAT1_IS_OPEN() && sub_bms_info_1.open_times < 0xFFFF) {
+		sub_bms_info_1.open_times++;
 	}
 
-	if (BAT2_IS_OPEN()) {
-		if (sub_bms_info_2.open_times < 0xFFFF) {
-			sub_bms_info_2.open_times++;
-		}
-	} else if (sub_bms_info_2.open_times > 0) {
-		sub_bms_info_2.open_times--;
+	if (BAT2_IS_OPEN() && sub_bms_info_2.open_times < 0xFFFF) {
+		sub_bms_info_2.open_times++;
 	}
 
 	if(++s_ms >= 1000)

+ 1 - 2
Source/drv_io.c

@@ -75,7 +75,6 @@ void QD_Enable_From(uint8_t on,uint8_t from)
 	Check_S11(on,FROM_QD);
 	QD_Enable(on);
 	QD_switch_from = from;
-	shark_switch_disabled = on;
 }
 
 uint8_t ACC2_Is_On(void)
@@ -187,7 +186,7 @@ void E_CTR_Initial(void)
 	rcu_periph_clock_enable(RCU_GPIOD);
 	rcu_periph_clock_enable(RCU_AF);
 	gpio_pin_remap_config(GPIO_PD01_REMAP,ENABLE);
-	gpio_init(GPIOD,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0);
+	gpio_init(GPIOD,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_0);
 	//
 	gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_6|GPIO_PIN_7);
 	Left_Light_Enable(0);

+ 1 - 1
Source/sw_build_info.h

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