Bläddra i källkod

can use polling mode

Signed-off-by: FuangCao <cavan.cao@foxmail.com>
FuangCao 5 år sedan
förälder
incheckning
4f3d42a6e6
9 ändrade filer med 81 tillägg och 45 borttagningar
  1. 1 1
      Project/version.txt
  2. 5 3
      Source/app_rs485_1.c
  3. 22 31
      Source/drv_can.c
  4. 1 0
      Source/drv_can.h
  5. 2 0
      Source/drv_usart.c
  6. 2 1
      Source/main.c
  7. 45 8
      Source/shark_charge.c
  8. 2 0
      Source/shark_charge.h
  9. 1 1
      Source/sw_build_info.h

+ 1 - 1
Project/version.txt

@@ -1 +1 @@
-PS100XX_V11_11201916
+PS100XX_V11_11202057

+ 5 - 3
Source/app_rs485_1.c

@@ -49,6 +49,8 @@ static int8_t Get_Check_Sum_1(uint16_t*value, const uint8_t*data,uint16_t size)
 
 void shark_battery_clear(SUB_BMS_INFO *info)
 {
+	shark_battery_full = shark_false;
+
 	info->update_mask = 0xFF;
 	info->sub_bms_cmd.operate = OP_READ_INFO;
 
@@ -81,15 +83,15 @@ static int8_t Handle_Sub_BMS_CMD_1(SUB_BMS_INFO *info, const u8 *buff, u8 length
 			break;
 		}
 
-		info->connected = CONFIG_UART_GOOD;
-		info->send_state = SHARK_SEND_SUCCESS;
-
 		//handle frame
 		count = sizeof(COMMAND_BODY);
 		
 		memcpy(&info->packet_common, buff + count,sizeof(info->packet_common));
 		count += sizeof(info->packet_common);
 
+		info->connected = CONFIG_UART_GOOD;
+		info->send_state = SHARK_SEND_SUCCESS;
+
 		if (shark_battery_charge_in(info)) {
 			shark_charger_valid = shark_true;
 		}

+ 22 - 31
Source/drv_can.c

@@ -28,6 +28,7 @@ CAN_FRAME can_test_bro;
 static shark_can_frame_t shark_can_tx_queue[200];
 static shark_u8 shark_can_tx_head;
 static shark_u8 shark_can_tx_tail;
+static shark_u16 shark_can_tx_err;
 
 static shark_bool shark_can_tx_frame(shark_can_frame_t *frame)
 {
@@ -40,9 +41,21 @@ static shark_bool shark_can_tx_frame(shark_can_frame_t *frame)
 	} else if (CAN_TSTAT_TME2 == (CAN_TSTAT(CAN0) & CAN_TSTAT_TME2)) {
 		mailbox = CAN_MAILBOX2;
 	} else {
+		if (shark_can_tx_err < 20000) {
+			shark_can_tx_err++;
+		} else {
+			shark_can_tx_err = 0;
+			Can_Power_Enable(0);
+			can_deinit(CAN0);
+			CAN_Config_HW();
+			Can_Power_Enable(1);
+		}
+
 		return shark_false;
 	}
 
+	shark_can_tx_err = 0;
+
 	CAN_TMDATA0(CAN0, mailbox) = frame->values[0];
 	CAN_TMDATA1(CAN0, mailbox) = frame->values[1];
 
@@ -53,24 +66,22 @@ static shark_bool shark_can_tx_frame(shark_can_frame_t *frame)
 	return shark_true;
 }
 
+void shark_can_tx_flush(void)
+{
+	while (shark_can_tx_head != shark_can_tx_tail && shark_can_tx_frame(shark_can_tx_queue + shark_can_tx_head)) {
+		shark_can_tx_head = (shark_can_tx_head + 1) % NELEM(shark_can_tx_queue);
+	}
+}
+
 shark_bool shark_can_send_frame(shark_can_efid_t efid, const void *buff, u8 length)
 {
 	u8 tail = (shark_can_tx_tail + 1) % NELEM(shark_can_tx_queue);
 	shark_can_frame_t *frame;
-	u32 times = 20000;
 
-	if (work_normal == 0) {
+	if (tail == shark_can_tx_head || work_normal == 0) {
 		return shark_false;
 	}
 
-	while (tail == shark_can_tx_head) {
-		if (times > 0) {
-			times--;
-		} else {
-			return shark_false;
-		}
-	}
-
 	frame = shark_can_tx_queue + shark_can_tx_tail;
 	memcpy(frame->data, buff, length);
 	frame->efid.value = efid.value;
@@ -80,7 +91,6 @@ shark_bool shark_can_send_frame(shark_can_efid_t efid, const void *buff, u8 leng
 	}
 
 	shark_can_tx_tail = tail;
-	can_interrupt_enable(CAN0, CAN_INT_TME);
 
 	return shark_true;
 }
@@ -188,9 +198,7 @@ static void Can_NVIC_Config(void)
   * @retval None
   */
 void CAN_Config_HW(void)
-{   
-
-
+{
 	/* enable CAN clock */
     rcu_periph_clock_enable(RCU_CAN0);
     rcu_periph_clock_enable(RCU_GPIOB);
@@ -405,23 +413,6 @@ void CAN_Config(void)
     
 }
 
-
-void USBD_HP_CAN0_TX_IRQHandler(void)
-{
-	while (shark_true) {
-		if (shark_can_tx_head == shark_can_tx_tail) {
-			can_interrupt_disable(CAN0, CAN_INT_TME);
-			break;
-		}
-
-		if (shark_can_tx_frame(shark_can_tx_queue + shark_can_tx_head)) {
-			shark_can_tx_head = (shark_can_tx_head + 1) % NELEM(shark_can_tx_queue);
-		} else {
-			break;
-		}
-	}
-}
-
 void USBD_LP_CAN0_RX0_IRQHandler(void)
 {
 	can_receive_message_struct Rxmessage;

+ 1 - 0
Source/drv_can.h

@@ -124,6 +124,7 @@ void Can_Stop_Send(void);
 
 shark_bool shark_can_send_frame(shark_can_efid_t efid, const void *buff, u8 length);
 shark_bool shark_can_send(u8 dest, u8 src, u8 type, const u8 *buff, u16 length);
+void shark_can_tx_flush(void);
 
 #endif
 

+ 2 - 0
Source/drv_usart.c

@@ -1,6 +1,7 @@
 #include "drv_usart.h"
 #include "app_rs485_1.h"
 #include "app_can.h"
+#include "drv_can.h"
 
 static u16 shark_uart_poll_ticks;
 static u8 shark_uart_poll_index;
@@ -210,6 +211,7 @@ void shark_uart_poll_safe(void)
 	fwdgt_counter_reload();
 	Handle_Can_Data();
 	shark_uart_poll();
+	shark_can_tx_flush();
 }
 
 void USART0_IRQHandler(void)

+ 2 - 1
Source/main.c

@@ -213,7 +213,8 @@ int main(void)
 
 		shark_uart_poll();
 		shark_charge_poll();
-		
+		shark_can_tx_flush();
+
 		if(g_event & BMS_1_RESEND_CMD_EVENT)
 		{
 			if(Resend_can_bms_1_frame())

+ 45 - 8
Source/shark_charge.c

@@ -6,12 +6,12 @@
 shark_charger_state_t shark_charger_state;
 shark_bool shark_charger_enabled;
 shark_bool shark_charger_valid;
+shark_bool shark_battery_full;
 shark_u16 shark_charge_times;
 shark_u16 shark_charge_skip;
 
 static shark_u16 shark_charger_remove;
 static shark_u16 shark_charger_insert;
-static shark_bool shark_battery_full;
 
 void shark_charge_init(void)
 {
@@ -23,6 +23,41 @@ void shark_charge_init(void)
 	gpio_init(GPIO_PORT_CHG_EN, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_CHG_EN);
 }
 
+shark_bool shark_battery_charge_full(void)
+{
+	if (sub_bms_info_1.connected) {
+		if (sub_bms_info_2.connected) {
+			if (sub_bms_info_1.packet_common.m_percent > 99 && sub_bms_info_2.packet_common.m_percent > 99) {
+				shark_battery_full = shark_true;
+			}
+
+			if (sub_bms_info_1.packet_common.m_percent < 97 || sub_bms_info_2.packet_common.m_percent < 97) {
+				shark_battery_full = shark_false;
+			}
+		} else {
+			if (sub_bms_info_1.packet_common.m_percent > 99) {
+				shark_battery_full = shark_true;
+			}
+
+			if (sub_bms_info_1.packet_common.m_percent < 97) {
+				shark_battery_full = shark_false;
+			}
+		}
+	} else if (sub_bms_info_2.connected) {
+		if (sub_bms_info_2.packet_common.m_percent > 99) {
+			shark_battery_full = shark_true;
+		}
+
+		if (sub_bms_info_2.packet_common.m_percent < 97) {
+			shark_battery_full = shark_false;
+		}
+	} else {
+		return shark_false;
+	}
+
+	return shark_battery_full;
+}
+
 shark_bool shark_charger_is_normal(void)
 {
 	return shark_charger_enabled && (shark_battery_charge_in1() || shark_battery_charge_in2());
@@ -30,6 +65,10 @@ shark_bool shark_charger_is_normal(void)
 
 void shark_charger_set_state(shark_charger_state_t state)
 {
+	if (shark_battery_charge_full()) {
+		state = SHARK_CHG_REMOVE;
+	}
+
 	if (shark_charger_state != state) {
 		shark_charger_state = state;
 		println("charger: state%d", state);
@@ -38,15 +77,12 @@ void shark_charger_set_state(shark_charger_state_t state)
 
 void shark_charger_set_enable(shark_bool enable)
 {
-	if (sub_bms_info_1.packet_common.m_percent > 99 && sub_bms_info_2.packet_common.m_percent > 99) {
-		shark_battery_full = shark_true;
-	}
-
-	if (sub_bms_info_1.packet_common.m_percent < 97 || sub_bms_info_2.packet_common.m_percent < 97) {
-		shark_battery_full = shark_false;
+	if (shark_battery_charge_full()) {
+		shark_charger_set_state(SHARK_CHG_REMOVE);
+		enable = shark_false;
 	}
 
-	if (shark_battery_full || cb_operate_state == CB_BAT1_BAT2_SERIES) {
+	if (cb_operate_state == CB_BAT1_BAT2_SERIES) {
 		enable = shark_false;
 	}
 
@@ -102,6 +138,7 @@ void shark_charge_tick(void)
 
 		if (shark_charger_remove > SHARK_CHG_REMOVE_MIN) {
 			shark_charger_set_state(SHARK_CHG_REMOVE);
+			shark_battery_full = shark_false;
 		} else {
 			shark_charger_remove++;
 		}

+ 2 - 0
Source/shark_charge.h

@@ -31,8 +31,10 @@ typedef enum {
 extern shark_charger_state_t shark_charger_state;
 extern shark_bool shark_charger_enabled;
 extern shark_bool shark_charger_valid;
+extern shark_bool shark_battery_full;
 extern shark_u16 shark_charge_times;
 
+shark_bool shark_battery_charge_full(void);
 void shark_charger_set_enable(shark_bool enable);
 void shark_charger_set_state(shark_charger_state_t state);
 shark_bool shark_charger_is_normal(void);

+ 1 - 1
Source/sw_build_info.h

@@ -1,3 +1,3 @@
 #pragma once
 
-#define CONFIG_VERSION "PS100XX_V11_11201916"
+#define CONFIG_VERSION "PS100XX_V11_11202057"