|
|
@@ -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;
|
|
|
+}
|
|
|
+
|