Przeglądaj źródła

add workmode for bms, aging test, pcba test, pack test...

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 lat temu
rodzic
commit
02ae5c241e

+ 9 - 0
Application/app/bms_message.c

@@ -107,6 +107,15 @@ void process_bms_message(can_frame_t *frame, int len){
 		case CAN_KEY_BMS_GET_HEALTH_STAT:
 			data = (uint8_t *)bms_health();
 			data_len = sizeof(*bms_health());
+			break;
+		case CAN_KEY_BMS_SET_WORK_MODE:
+			if (len != 2) {
+				result = 1;
+			}else {
+				result = bms_work_mode_set(frame->data[0], frame->data[1]);
+			}
+			protocol_send_ack(frame->head.can_addr, frame->key, result);
+			break;
 		case CAN_KEY_SET_SN:
 			protocol_send_ack(frame->head.can_addr, frame->key, result);
 			break;

+ 1 - 0
Application/app/protocol.h

@@ -90,6 +90,7 @@ typedef struct {
 #define CAN_KEY_BMS_CLEAR   0xa3 //clear some flags used by PSxxx, exp: stat_cmd_resp_t.insert
 #define CAN_KEY_BMS_GET_HEALTH_STAT 0xa4 //return bms_health_t
 #define CAN_KEY_BMS_GET_TIME      0xa5 //return bms running times(second) uint32_t
+#define CAN_KEY_BMS_SET_WORK_MODE     0xa6 //byte0=mode, byte1=start/stop
 #define CAN_KEY_GET_VERSION 0x0c //return string
 #define CAN_KEY_SET_SN      0x06 //string
 #define CAN_KEY_GET_SN      0x05 //return string

+ 42 - 1
Application/app/sox/state.c

@@ -43,6 +43,39 @@ bms_state_t *bms_state_get(void){
 	return &_bms_state;
 }
 
+int bms_work_is_normal(void){
+	return _bms_state.work_mode == WORK_MODE_NORMAL;
+}
+
+int bms_work_is_aging_test(void){
+	return _bms_state.work_mode == WORK_MODE_AGING_TEST;
+}
+
+int bms_work_is_pcba_test(void){
+	return _bms_state.work_mode == WORK_MODE_PCBA_TEST;
+}
+
+int bms_work_is_pack_test(void){
+	return _bms_state.work_mode == WORK_MODE_PCBA_TEST;
+}
+
+int bms_work_is_calibrating(void){
+	return _bms_state.work_mode == WORK_MODE_CALIBRATE;
+}
+
+
+int bms_work_mode_set(int mode, int start){
+	if (mode < WORK_MODE_AGING_TEST || mode > WORK_MODE_CALIBRATE){
+		return 1;
+	}
+	if (start){
+		_bms_state.work_mode = mode;
+	}else {
+		_bms_state.work_mode = WORK_MODE_NORMAL;
+	}
+	return 0;
+}
+
 /*
  放电mos和充电mos的开关要小心:
  1. 大部分的情况下,尽量能做到同时开关,主要是用来保护被关闭那路mos的体二极管(不能过大电流)
@@ -190,8 +223,16 @@ static void _process_deepsleep(s32 health){
 #endif	
 }
 
+/*when work as test mode, we do'n need close the discharger */
+static int _can_close_mos_no_hall(void){
+	if (bms_work_is_normal()){
+		return 1;
+	}
+	return 0;
+}
+
 static void _process_iostate_changed(void){
-	if (!(io_state()->hall_detect)){
+	if (!(io_state()->hall_detect) && _can_close_mos_no_hall()){
 		if (ml5238_is_discharging()){
 			discharger_open(0);
 		}

+ 8 - 0
Application/app/sox/state.h

@@ -31,8 +31,15 @@ typedef struct{
 	uint8_t  cell_index_of_max_vol;
 	int      used_by;//where this battery is used for: on motor, on charger docker, on charger box, NONE
 	uint32_t user_request;
+	uint32_t work_mode;//正常模式,老化测试模式,pcba测试模测试,整机测试模式
 }bms_state_t;
 
+#define WORK_MODE_NORMAL 0      //正常模式
+#define WORK_MODE_AGING_TEST 1  //老化测试模式
+#define WORK_MODE_PCBA_TEST 2   //PCBA测试模式
+#define WORK_MODE_PACK_TEST 3   //整机测试模式
+#define WORK_MODE_CALIBRATE 4   //adc校准模式
+
 #define USER_REQUEST_PENDING BIT(31) //是否有用户请求
 #define USER_REQUEST_CHARGER BIT(0)
 #define USER_REQUEST_DISCHARGER BIT(1)
@@ -69,6 +76,7 @@ typedef enum {
 #define debounce_dec(dt) {if (dt.count > 0) dt.count--;}
 void bms_state_init(void);
 bms_state_t * bms_state_get(void);
+int bms_work_mode_set(int mode, int start);
 
 #endif /* _BMS_STATE_H__ */