Bläddra i källkod

加入I2c的出错恢复和log

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 4 år sedan
förälder
incheckning
e5a0d0a28d
3 ändrade filer med 23 tillägg och 2 borttagningar
  1. 2 0
      Application/app/sox/state.c
  2. 11 1
      Application/bsp/AT24CXX.c
  3. 10 1
      Application/bsp/i2c.c

+ 2 - 0
Application/app/sox/state.c

@@ -23,6 +23,7 @@
 #define IGNORE_DISCHARGER_LOW_VOL 0 //ºöÂԷŵçǷѹ
 extern uint32_t bsp_get_rst_reson(void);
 extern uint32_t bsp_get_backup(void);
+extern void gd32_i2c_log(void);
 static void _current_notify(void);
 static void _voltage_notify(void);
 static void _temperature_notify(void);
@@ -137,6 +138,7 @@ void bms_state_log(void){
 	state_debug("Debug: %d, %d. uart reinit=%d\n", shark_uart_timeout(), io_state()->hall_detect, uart_reinit_count);
 	log_no_hall_time();
 	nv_storage_log();
+	gd32_i2c_log();
 #if 0
 	state_debug("Charging: %d\n", _bms_state.charging);
 	state_debug("WorkMode %d\n", _bms_state.work_mode);

+ 11 - 1
Application/bsp/AT24CXX.c

@@ -1,5 +1,6 @@
 #include "i2c.h"
 #include "AT24CXX.h"
+#include "libs/shark_task.h"
 
 void AT24CXX_Init(void)
 {
@@ -45,6 +46,11 @@ int AT24CXX_Read(uint16_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
 		if (try_count-- <= 0){
 			return -1;
 		}
+		if ((try_count % 20) == 0) {
+			AT24CXX_DeInit();
+			task_udelay(1000);
+			AT24CXX_Init();
+		}
 	};
 	return NumToRead;
 }  
@@ -57,7 +63,11 @@ static int AT24CXX_Write_Pages(uint16_t WriteAddr,uint8_t *pBuffer,uint16_t NumT
 		if (try_count-- <= 0){
 			return -1;
 		}
-
+		if ((try_count % 20) == 0) {
+			AT24CXX_DeInit();
+			task_udelay(1000);
+			AT24CXX_Init();
+		}
 	};
 	return 0;
 }

+ 10 - 1
Application/bsp/i2c.c

@@ -2,13 +2,15 @@
 #include "gd32f3x0_i2c.h"
 #include "gpio.h"
 #include "i2c.h"
+#include "libs/logger.h"
 
 static int _gd32_i2c_rw_bytes(uint32_t index, uint8_t address, uint8_t reg, uint8_t *buffer, int length, int write);
 
 #define iic_device(id) ((id == 0)?I2C0:I2C1)
 static uint32_t i2c_clk[2];
 static uint8_t i2c_busy_count[2];
-
+static int i2c_busy_error = 0;
+static int i2c_other_error = 0;
 static void _delay_1us(uint32_t n)
 {
 	while(n-->0)
@@ -59,6 +61,9 @@ static void gd32_i2c_busy_recovery(uint32_t i2c_periph){
 	i2c_software_reset_config(i2c_periph, 0);
 }
 
+void gd32_i2c_log(void) {
+	sys_debug("i2c error %d - %d\n", i2c_busy_error, i2c_other_error);
+}
 
 void gd32_i2c_init(uint32_t i2c_device, uint32_t rate){
 	uint32_t device = iic_device(i2c_device);
@@ -165,6 +170,7 @@ static int _gd32_i2c_rw_bytes(uint32_t i2c_index, uint8_t address, uint8_t reg,
 
 	if (gd32_i2c_wait_flags(device, I2C_FLAG_I2CBSY, RESET) < 0){
 		i2c_busy_count[i2c_index]++;
+		i2c_busy_error ++;
 		if (i2c_busy_count[i2c_index] >= 10) {
 			gd32_i2c_deinit(i2c_index);
 			gd32_i2c_init(i2c_index, i2c_clk[i2c_index]);
@@ -264,6 +270,9 @@ static int _gd32_i2c_rw_bytes(uint32_t i2c_index, uint8_t address, uint8_t reg,
 out_i2c_stop_on_bus:
  	i2c_stop_on_bus(device);
 	gd32_i2c_wait_stop(device);
+	if (ret < 0) {
+		i2c_other_error++;
+	}
  	return ret;
 }