|
@@ -498,7 +498,7 @@ static shark_battery_exit_t shark_battery_is_normal_raw(SUB_BMS_INFO *info)
|
|
|
return SHARK_BATT_EXIT_485;
|
|
return SHARK_BATT_EXIT_485;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (end_ctr_self_ss_new.xl_sta == 0) {
|
|
|
|
|
|
|
+ if (shark_bms_xl_times < SHARK_XL_FUZZ) {
|
|
|
return SHARK_BATT_EXIT_485;
|
|
return SHARK_BATT_EXIT_485;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -693,10 +693,6 @@ shark_battery_power_t shark_battery_get_power(SUB_BMS_INFO *info)
|
|
|
|
|
|
|
|
shark_bool shark_battery_check_power(SUB_BMS_INFO *info, shark_battery_power_t power)
|
|
shark_bool shark_battery_check_power(SUB_BMS_INFO *info, shark_battery_power_t power)
|
|
|
{
|
|
{
|
|
|
- if (info->conn_state != SUB_BMS_CONT_HV485) {
|
|
|
|
|
- return shark_false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
switch (power) {
|
|
switch (power) {
|
|
|
case SHARK_BATT_POWER_SMALL:
|
|
case SHARK_BATT_POWER_SMALL:
|
|
|
return SHARK_BOOL((info->packet_common.bms_status & BMS_POWER_SMALL) == BMS_POWER_SMALL);
|
|
return SHARK_BOOL((info->packet_common.bms_status & BMS_POWER_SMALL) == BMS_POWER_SMALL);
|
|
@@ -723,108 +719,127 @@ static void shark_battery_serial_wait_ready(void)
|
|
|
sub_bms_info_2.conn_state = SUB_BMS_DISC_HV485;
|
|
sub_bms_info_2.conn_state = SUB_BMS_DISC_HV485;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-shark_battery_mask_t shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2, shark_battery_mask_t mask)
|
|
|
|
|
|
|
+static void shark_battery_send_command(void)
|
|
|
{
|
|
{
|
|
|
- shark_battery_mask_t success = SHARK_BATT_MASK_NONE;
|
|
|
|
|
- u8 times;
|
|
|
|
|
-
|
|
|
|
|
- shark_battery_serial_wait_ready();
|
|
|
|
|
|
|
+ g_event &= ~(RS485_RECEIVE_END_EVENT | RS485_2_RECEIVE_END_EVENT | SUB_BMS_1_RS485_DISC_EVENT | SUB_BMS_2_RS485_DISC_EVENT);
|
|
|
|
|
|
|
|
- for (times = 0; times < 3; times++) {
|
|
|
|
|
- u64 time = shark_get_time() + 200;
|
|
|
|
|
|
|
+ Send_Sub_BMS_CMD_1();
|
|
|
|
|
+ Send_Sub_BMS_CMD_2();
|
|
|
|
|
|
|
|
- shark_battery_set_power_param(&sub_bms_info_1, power1);
|
|
|
|
|
- g_event &= ~RS485_RECEIVE_END_EVENT;
|
|
|
|
|
|
|
+ sub_rs485_time_out_1.set = 0;
|
|
|
|
|
+ sub_rs485_time_out_2.set = 0;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- shark_battery_set_power_param(&sub_bms_info_2, power2);
|
|
|
|
|
- g_event &= ~RS485_2_RECEIVE_END_EVENT;
|
|
|
|
|
|
|
+static shark_battery_mask_t shark_battery_wait_response(void)
|
|
|
|
|
+{
|
|
|
|
|
+ shark_battery_mask_t success = SHARK_BATT_MASK_NONE;
|
|
|
|
|
+ u64 time = shark_get_time() + 100;
|
|
|
|
|
|
|
|
- Send_Sub_BMS_CMD_1();
|
|
|
|
|
- Send_Sub_BMS_CMD_2();
|
|
|
|
|
|
|
+ while (shark_true) {
|
|
|
|
|
+ if (g_event & RS485_RECEIVE_END_EVENT) {
|
|
|
|
|
+ g_event &= ~RS485_RECEIVE_END_EVENT;
|
|
|
|
|
|
|
|
- while (shark_true) {
|
|
|
|
|
- if(g_event & RS485_RECEIVE_END_EVENT) {
|
|
|
|
|
- g_event &= ~RS485_RECEIVE_END_EVENT;
|
|
|
|
|
- Handle_RS485_1_Data();
|
|
|
|
|
|
|
+ Handle_RS485_1_Data();
|
|
|
|
|
|
|
|
- if (shark_battery_check_power(&sub_bms_info_1, power1)) {
|
|
|
|
|
- success |= SHARK_BATT_MASK_BAT1;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485) {
|
|
|
|
|
+ success |= SHARK_BATT_MASK_BAT1;
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if (g_event & RS485_2_RECEIVE_END_EVENT) {
|
|
|
|
|
- g_event &= ~RS485_2_RECEIVE_END_EVENT;
|
|
|
|
|
- Handle_RS485_2_Data();
|
|
|
|
|
|
|
+ if (g_event & RS485_2_RECEIVE_END_EVENT) {
|
|
|
|
|
+ g_event &= ~RS485_2_RECEIVE_END_EVENT;
|
|
|
|
|
|
|
|
- if (shark_battery_check_power(&sub_bms_info_2, power2)) {
|
|
|
|
|
- success |= SHARK_BATT_MASK_BAT2;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ Handle_RS485_2_Data();
|
|
|
|
|
|
|
|
- if ((success & mask) == mask) {
|
|
|
|
|
- return mask;
|
|
|
|
|
|
|
+ if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
|
|
|
|
|
+ success |= SHARK_BATT_MASK_BAT2;
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if (time < shark_get_time_safe()) {
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (success == SHARK_BATT_MASK_BOTH) {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (time < shark_get_time_safe()) {
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ RS485_busy_1 = 0;
|
|
|
|
|
+ RS485_busy_2 = 0;
|
|
|
|
|
+
|
|
|
return success;
|
|
return success;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-shark_battery_mask_t shark_battery_detect(void)
|
|
|
|
|
|
|
+shark_battery_mask_t shark_battery_set_power(shark_battery_power_t power1, shark_battery_power_t power2, shark_battery_mask_t mask)
|
|
|
{
|
|
{
|
|
|
shark_battery_mask_t success = SHARK_BATT_MASK_NONE;
|
|
shark_battery_mask_t success = SHARK_BATT_MASK_NONE;
|
|
|
u8 times;
|
|
u8 times;
|
|
|
|
|
|
|
|
shark_battery_serial_wait_ready();
|
|
shark_battery_serial_wait_ready();
|
|
|
|
|
|
|
|
- for (times = 0; times < 5; times++) {
|
|
|
|
|
- u64 time = shark_get_time() + 200;
|
|
|
|
|
|
|
+ for (times = 0; times < 3; times++) {
|
|
|
|
|
+ shark_battery_mask_t response;
|
|
|
|
|
|
|
|
- sub_bms_info_1.sub_bms_cmd.operate = OP_READ_INFO;
|
|
|
|
|
- g_event &= ~RS485_RECEIVE_END_EVENT;
|
|
|
|
|
|
|
+ shark_battery_set_power_param(&sub_bms_info_1, power1);
|
|
|
|
|
+ shark_battery_set_power_param(&sub_bms_info_2, power2);
|
|
|
|
|
+ shark_battery_send_command();
|
|
|
|
|
|
|
|
- sub_bms_info_2.sub_bms_cmd.operate = OP_READ_INFO;
|
|
|
|
|
- g_event &= ~RS485_2_RECEIVE_END_EVENT;
|
|
|
|
|
|
|
+ response = shark_battery_wait_response();
|
|
|
|
|
|
|
|
- Send_Sub_BMS_CMD_1();
|
|
|
|
|
- Send_Sub_BMS_CMD_2();
|
|
|
|
|
|
|
+ if ((response & SHARK_BATT_MASK_BAT1) != 0 && shark_battery_check_power(&sub_bms_info_1, power1)) {
|
|
|
|
|
+ success |= SHARK_BATT_MASK_BAT1;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- while (shark_true) {
|
|
|
|
|
- if(g_event & RS485_RECEIVE_END_EVENT) {
|
|
|
|
|
- g_event &= ~RS485_RECEIVE_END_EVENT;
|
|
|
|
|
- Handle_RS485_1_Data();
|
|
|
|
|
|
|
+ if ((response & SHARK_BATT_MASK_BAT2) != 0 && shark_battery_check_power(&sub_bms_info_2, power2)) {
|
|
|
|
|
+ success |= SHARK_BATT_MASK_BAT2;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if (sub_bms_info_1.conn_state == SUB_BMS_CONT_HV485) {
|
|
|
|
|
- success |= SHARK_BATT_MASK_BAT1;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if ((success & mask) == mask) {
|
|
|
|
|
+ return mask;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if (g_event & RS485_2_RECEIVE_END_EVENT) {
|
|
|
|
|
- g_event &= ~RS485_2_RECEIVE_END_EVENT;
|
|
|
|
|
- Handle_RS485_2_Data();
|
|
|
|
|
|
|
+ return success;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- if (sub_bms_info_2.conn_state == SUB_BMS_CONT_HV485) {
|
|
|
|
|
- success |= SHARK_BATT_MASK_BAT2;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+shark_battery_mask_t shark_battery_detect(u8 times)
|
|
|
|
|
+{
|
|
|
|
|
+ shark_battery_mask_t success;
|
|
|
|
|
|
|
|
- if (success == SHARK_BATT_MASK_BOTH) {
|
|
|
|
|
- return SHARK_BATT_MASK_BOTH;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ shark_battery_serial_wait_ready();
|
|
|
|
|
|
|
|
- if (time < shark_get_time_safe()) {
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ for (success = SHARK_BATT_MASK_NONE; times > 0; times--) {
|
|
|
|
|
+ sub_bms_info_1.sub_bms_cmd.operate = OP_READ_INFO;
|
|
|
|
|
+ sub_bms_info_2.sub_bms_cmd.operate = OP_READ_INFO;
|
|
|
|
|
+ shark_battery_send_command();
|
|
|
|
|
+
|
|
|
|
|
+ success |= shark_battery_wait_response();
|
|
|
|
|
+ if (success == SHARK_BATT_MASK_BOTH) {
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return success;
|
|
return success;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+shark_bool shark_battery_ping(u8 times)
|
|
|
|
|
+{
|
|
|
|
|
+ while (shark_true) {
|
|
|
|
|
+ if (shark_battery_detect(1) != SHARK_BATT_MASK_NONE) {
|
|
|
|
|
+ return shark_true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (times > 0) {
|
|
|
|
|
+ times--;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return shark_false;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
int8_t Update_Sub_BMS_1_Software(uint8_t step)
|
|
int8_t Update_Sub_BMS_1_Software(uint8_t step)
|
|
|
{
|
|
{
|
|
|
uint8_t rtn;
|
|
uint8_t rtn;
|