Просмотр исходного кода

cs1180&io state function

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 лет назад
Родитель
Сommit
4a9e2620c7

+ 129 - 0
Application/app/sox/iostate.c

@@ -0,0 +1,129 @@
+#include "bsp/gpio.h"
+#include "libs/shark_task.h"
+#include "state.h"
+#include "iostate.h"
+
+typedef struct io_timer{
+	shark_timer_t _timer;
+	u16           detect_cnt;
+	u8            value;
+}io_timer_t;
+
+#define io_detect_intv_time 1
+#define io_debounce_time 50
+
+static io_timer_t hall_io;
+static io_timer_t charger_io;
+static io_timer_t aux_short_io;
+static io_timer_t dcdc_pwr_io;
+
+static void io_timer_handler(shark_timer_t *t);
+
+
+void io_state_init(void){
+	bms_state_get()->hall_detect = IS_HALL1_DETECTED()|| IS_HALL2_DETECTED();
+	bms_state_get()->charger_detect = IS_CHARGER_IN();
+	bms_state_get()->dcdc_good_detect= IS_DCDC_POWER_GOOD();
+	bms_state_get()->aux_lock_detect = IS_AUX_VOL_LOCKED();
+	hall_io._timer.handler = io_timer_handler;
+	charger_io._timer.handler = io_timer_handler;
+	aux_short_io._timer.handler = io_timer_handler;
+	dcdc_pwr_io._timer.handler = io_timer_handler;
+	shark_timer_post(&hall_io._timer, io_detect_intv_time);
+	shark_timer_post(&charger_io._timer, io_detect_intv_time);
+	shark_timer_post(&aux_short_io._timer, io_detect_intv_time);
+	shark_timer_post(&dcdc_pwr_io._timer, io_detect_intv_time);
+}
+
+static int _get_io_value(io_timer_t *t){
+	if (t == &hall_io) {
+		return IS_HALL1_DETECTED()|| IS_HALL2_DETECTED();
+	}
+	if (t == &charger_io){
+		return IS_CHARGER_IN();
+	}
+	if (t == &aux_short_io){
+		return IS_AUX_VOL_LOCKED();
+	}
+	if (t == &dcdc_pwr_io){
+		return IS_DCDC_POWER_GOOD();
+	}
+	return -1;
+}
+
+static void _set_io_value(io_timer_t *t){
+	__disable_irq();
+	if (t == &hall_io) {
+		bms_state_get()->hall_detect = t->value;
+		hall_1_detect_irq_enable(1);
+		hall_2_detect_irq_enable(1);
+	}
+	if (t == &charger_io){
+		bms_state_get()->charger_detect = t->value;
+		charger_detect_irq_enable(1);
+	}
+	if (t == &aux_short_io){
+		bms_state_get()->aux_lock_detect = t->value;
+		small_current_short_irq_enable(1);
+	}
+	if (t == &dcdc_pwr_io){
+		bms_state_get()->dcdc_good_detect = t->value;
+		dcdc_pwr_detect_irq_enable(1);
+	}
+	/* 可以解决丢中断的风险,如果开启中断的过程中,来IO中断,这个中断可能会被丢弃,
+	 * 所以,我们这里要再次检查io的状态和代码保存的状态是否一致,如果不一致需要重新
+	 * 启动定时间
+	*/
+	if (t->value != _get_io_value(t)){
+		shark_timer_post(&t->_timer, io_detect_intv_time);
+	}
+	__enable_irq();
+}
+
+
+static void io_timer_handler(shark_timer_t *t){
+	io_timer_t *io_t = (io_timer_t *)t;
+	if (io_t->value == _get_io_value(io_t)){
+		io_t->detect_cnt ++;
+	}else{
+		io_t->value = _get_io_value(io_t);
+		io_t->detect_cnt = 0;
+	}
+	if (io_t->detect_cnt >= io_debounce_time){
+		io_t->detect_cnt = 0;
+		_set_io_value(io_t);
+	}else{
+		shark_timer_post(t, io_detect_intv_time);
+	}
+}
+void charger_detect_irq_handler(void){
+	charger_io.value = IS_CHARGER_IN();
+	charger_io.detect_cnt = 0;
+	shark_timer_post(&charger_io._timer, io_detect_intv_time);
+	charger_detect_irq_enable(0);
+}
+void hall1_detect_irq_handler(void){
+	hall_io.value = IS_HALL1_DETECTED()|| IS_HALL2_DETECTED();
+	hall_io.detect_cnt = 0;
+	shark_timer_post(&hall_io._timer, io_detect_intv_time);
+	hall_1_detect_irq_enable(0);
+}
+void hall2_detect_irq_handler(void){
+	hall_io.value = IS_HALL1_DETECTED()|| IS_HALL2_DETECTED();
+	hall_io.detect_cnt = 0;
+	shark_timer_post(&hall_io._timer, io_detect_intv_time);
+	hall_2_detect_irq_enable(0);
+}
+void small_current_short_handler(void){
+	aux_short_io.value = IS_AUX_VOL_LOCKED();
+	aux_short_io.detect_cnt = 0;
+	shark_timer_post(&aux_short_io._timer, io_detect_intv_time);
+	small_current_short_irq_enable(0);
+}
+void dcdc_pwr_detect_irq_handler(void) {
+	dcdc_pwr_io.value = IS_DCDC_POWER_GOOD();
+	dcdc_pwr_io.detect_cnt = 0;
+	shark_timer_post(&dcdc_pwr_io._timer, io_detect_intv_time);
+	dcdc_pwr_detect_irq_enable(0);
+}
+

+ 7 - 0
Application/app/sox/iostate.h

@@ -0,0 +1,7 @@
+#ifndef _IO_state_H__
+#define _IO_state_H__
+
+void io_state_init(void);
+
+#endif /* _IO_state_H__ */
+

+ 19 - 10
Application/app/sox/sense_measure.c → Application/app/sox/measure.c

@@ -1,4 +1,4 @@
-#include "sense_measure.h"
+#include "measure.h"
 #include "bsp/ml5238.h"
 #include "bsp/cs1180.h"
 #include "bsp/gd32_adc.h"
@@ -50,22 +50,22 @@ static int __inline__ _is_x10_gain(void){
 static void current_10x_calibrate(void){
 	/* calibrate the 10x gain */
 	ML5238_IMON_OUT_ZERO_10X();
-	vim0_10x = adc_sample_avg(ADC_CHAN_IMON, 130);
+	vim0_10x = adc_sample_avg(ADC_CHAN_IMON, 10);
 	ML5238_IMON_OUT_V2000_10X();
-	float vim1 = adc_sample_avg(ADC_CHAN_IMON, 130);
+	float vim1 = adc_sample_avg(ADC_CHAN_IMON, 10);
 	ML5238_IMON_OUT_V100_10X();
-	float vr = adc_sample_avg(ADC_CHAN_IMON, 130);
+	float vr = adc_sample_avg(ADC_CHAN_IMON, 10);
 	imon_gain_10x = ML5238_GAIN(vim0_10x, vim1, vr);
 }
 
 static void current_50x_calibrate(void){
 	/* calibrate the 50x gain */
 	ML5238_IMON_OUT_ZERO_50X();
-	vim0_50x = adc_sample_avg(ADC_CHAN_IMON, 130);
+	vim0_50x = adc_sample_avg(ADC_CHAN_IMON, 10);
 	ML5238_IMON_OUT_V2000_50X();
-	float vim1 = adc_sample_avg(ADC_CHAN_IMON, 130);
+	float vim1 = adc_sample_avg(ADC_CHAN_IMON, 10);
 	ML5238_IMON_OUT_V100_50X();
-	float vr = adc_sample_avg(ADC_CHAN_IMON, 130);
+	float vr = adc_sample_avg(ADC_CHAN_IMON, 10);
 	imon_gain_50x = ML5238_GAIN(vim0_50x, vim1, vr);
 }
 
@@ -92,15 +92,15 @@ void measure_system_init(void){
 
 /* get battery pack's current (mA) */
 static float get_pack_current_by_gd(void){
-	float adc = adc_sample_avg(ADC_CHAN_IMON, 130);
+	float adc = adc_sample_avg(ADC_CHAN_IMON, 10);
 	if (adc >= 0xFFF0 && (!_is_x10_gain())){//overflow, use 10x gain
 		current_10x_calibrate();
 		select_gain_10x(1);
-		adc = adc_sample_avg(ADC_CHAN_IMON, 130);
+		adc = adc_sample_avg(ADC_CHAN_IMON, 10);
 	}else if (adc <= 0x1F && (_is_x10_gain())){// is too small, select 50x gain
 		current_50x_calibrate();
 		select_gain_10x(0); 
-		adc = adc_sample_avg(ADC_CHAN_IMON, 130);		
+		adc = adc_sample_avg(ADC_CHAN_IMON, 10);		
 	}
 	float cali_adc = ML5238_V_RSENSER(adc, vim0_now, imon_gain_now);
 
@@ -121,6 +121,15 @@ float get_pack_current(void){
 	return get_pack_current_by_gd();
 }
 
+/*
+ * select the gd32 internel adc or cs1180 adc
+*/
+void adc_select_for_pack_current(int adc){
+	if (adc != GD32_ADC && adc != CS1180_ADC){
+		return;
+	}
+	adc_used = adc;
+}
 
 
 /* get cell's voltage (mV) */

+ 1 - 0
Application/app/sox/sense_measure.h → Application/app/sox/measure.h

@@ -1,6 +1,7 @@
 #ifndef _IV_Measure_H__
 #define _IV_Measure_H__
 void measure_system_init(void);
+void adc_select_for_pack_current(int adc);
 float get_pack_current(void);
 float get_cell_voltage(int cell);
 float get_small_current(void);

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

@@ -1,7 +1,9 @@
 #include "bsp/gpio.h"
-#include "app/sox/sense_measure.h"
+#include "app/sox/measure.h"
 #include "libs/shark_task.h"
 #include "state.h"
+#include "iostate.h"
+
 static bms_state_t _bms_state;
 
 struct means_task {
@@ -15,9 +17,11 @@ static void init_temp_task(void);
 
 void bms_state_init(void){
 	measure_system_init();
+	adc_select_for_pack_current(CS1180_ADC);
 	init_pack_current_task();
 	init_cell_task();
 	init_temp_task();
+	io_state_init();
 }
 
 bms_state_t * bms_state_get(void){
@@ -89,3 +93,4 @@ static u32 temp_task_handler(void){
 	}
 	return _temp_task.delay;
 }
+

+ 5 - 3
Application/app/sox/state.h

@@ -8,11 +8,13 @@
 #define HATT_USED_BY_CHARGER_BOX 3
 
 typedef struct{
-	uint32_t hall_1_detect:1;
-	uint32_t hall_2_detect:1;
+	uint32_t hall_detect:1;
+	uint32_t charger_detect :1;
+	uint32_t aux_lock_detect:1;
+	uint32_t pwr_good_detect:1;
+	uint32_t dcdc_good_detect:1;
 	uint32_t discharging :1;
 	uint32_t charging: 1;
-	uint32_t charger_detect :1;
 	uint32_t pack_balancing:1;
 	uint32_t mosfet_charger:1; //charger MOS open/close, synced with 5238
 	uint32_t mosfet_discharger:1; //discharger MOS open/close, synced with 5238

+ 1 - 0
Application/bsp/bsp.c

@@ -13,6 +13,7 @@ const char iap_fw_name[] __attribute__((at(0x08002C00))) = "App";
 void bsp_init(void){
 	wdog_start(4);
 	gpio_init();
+	DCDC_VOL_OPEN(1);
 }
 
 void wdog_start(int timeout){

+ 53 - 24
Application/bsp/cs1180.c

@@ -19,11 +19,18 @@
 #define CS1180_RESET    0xfe
 
 static float _cs1180_gain = 1.0f;
-#define CS1180_INIT_GAIN CS1180_GAIN_128X
+#define CS1180_INIT_GAIN CS1180_GAIN_64X
 
 static int cs1180_send_cmd(uint8_t data);
 static uint8_t cs1180_read_data(uint8_t data);
 
+void cs_delay(void)
+{
+	uint32_t  count = 60;
+	while(count--); 
+}
+
+
 static void spi_write_reg(uint8_t reg, uint8_t *data, uint8_t len){
 	cs1180_send_cmd(CS1180_WREG|reg);
 	cs1180_send_cmd(len - 1);
@@ -48,14 +55,16 @@ static void spi_read_reg(uint8_t reg, uint8_t *data, uint8_t len){
 static void cs1180_self_calibrate(void)
 {
 	cs1180_cs(0);
-	delay_us(10);
+	cs_delay();
 	cs1180_send_cmd(CS1180_CALSELF);
-	delay_us(1);
+	cs_delay();
 	cs1180_cs(1);
 	delay_us(50);
 	/* wait calibrate finished */
 	while (IS_CS1180_READY());
 	while (!IS_CS1180_READY());
+	delay_us(50 * 1000);
+	while (IS_CS1180_READY()); //drop first data
 }
 
 /* 对芯片的偏移误差进行纠正 */
@@ -83,17 +92,20 @@ __attribute__((unused)) static void cs1180_self_gain_calibrate(void)
 }
 
 /* 对系统的失调误差(偏移误差)进行纠正, 必须要求输入为差分电压为0,
- * 可以设置ML5238上的ISP,ISM输出0
 */
 void cs1180_sys_offset_calibrate(void)
 {
 	cs1180_cs(0);
+	cs_delay();
 	cs1180_send_cmd(CS1180_OCALSYS);
+	delay_us(50);
 	cs1180_cs(1);
 	delay_us(50);
 	/* wait calibrate finished */
 	while (IS_CS1180_READY());
 	while (!IS_CS1180_READY());
+	delay_us(10 * 1000);
+	while (IS_CS1180_READY()); //drop first data	
 }
 
 /* 对系统的增益误差进行纠正,必须输入正满幅度的电压, SP700,SP600未提供满辐电压,故这一项不做 */
@@ -115,64 +127,81 @@ void cs1180_adc_set_gain(int gain){
 	uint8_t data[] = {0x00, 0x01, 0x00};
 	data[0] = 0xF & gain;
 	cs1180_cs(0);
-	delay_us(10);
+	cs_delay();
 	spi_write_reg(0x00, data, 3);
-	delay_us(1);
+	cs_delay();
 	cs1180_cs(1);
-	
-	cs1180_self_calibrate();
-
 	_cs1180_gain = 1 << gain;
 }
 
 static void cs1180_reset(void){
 	cs1180_cs(0);
-	delay_us(10);
+	cs_delay();
 	cs1180_send_cmd(CS1180_RESET);
-	delay_us(1);
+	cs_delay();
 	cs1180_cs(1);
 }
-
+static uint8_t cs1180_dumy_read(void){
+	uint8_t data[16] = {0x5A, 0x5A, 0x5A};
+	while (IS_CS1180_READY());
+	cs1180_cs(0);
+	cs_delay();
+	spi_read_reg(0x0, data, 16);
+	cs_delay();
+	cs1180_cs(1);
+	return data[0];
+}
 void cs1180_adc_init(void){
+	CS1180_PWR_ENABLE(0);
+	delay_us(100 * 1000);
 	CS1180_PWR_ENABLE(1);
+	delay_us(200 * 1000);
 	spi1_init();
 	delay_us(10);
 	int count = 0;
 	do {
 		cs1180_reset();
-		delay_us(100);
+		delay_us(10);
+	
 		cs1180_adc_set_gain(CS1180_INIT_GAIN);
-		uint8_t data[3] = {0x5A, 0x5A, 0x5A};
-		cs1180_cs(0);
-		spi_read_reg(0x0, data, 3);
-		cs1180_cs(1);
-		if (data[0] == 0x7){
+		delay_us(10);
+
+		if (cs1180_dumy_read() == CS1180_INIT_GAIN){
 			break;
 		}
 		count ++;
 	}while(count <= 20);
+	cs1180_self_calibrate();
+	cs1180_dumy_read();
+	delay_us(10 * 1000);
+	cs1180_sys_offset_calibrate();
+
+	cs1180_dumy_read();
 }
 
 
 float cs1180_adc_sample(void)
 {
 	uint8_t data[3] = {0,0,0};
-	uint32_t a = 0;
+	int a = 0;
 
 	while (IS_CS1180_READY()); //当drdy 为高时,不读取数据
 
 	cs1180_cs(0);
-	delay_us(5);
-	spi_read_reg(0, data, 3);
-	spi_read_reg(0xD, data, 3);
+	//spi_read_reg(0xD, data, 3);
+	cs1180_send_cmd(CS1180_RDATA);
+	data[0] = cs1180_read_data(0xFF);
+	data[1] = cs1180_read_data(0xFF);
+	data[2] = cs1180_read_data(0xFF);
 	cs1180_cs(1);
 	a = (data[0] << 16) | (data[1] << 8) | data[2];
 	a >>= 4;
 
 	if (a & 0x80000) {
-		a = -(a & (~0xFFF80000));
+		a = ~a;
+		a = - (a&0x7FFFF);
 	}else {
-		a = (a & (~0xFFF80000));
+		a = a&0x7FFFF;
 	}
 	return ((float)a) / _cs1180_gain;	
 }

+ 93 - 4
Application/bsp/gpio.c

@@ -22,6 +22,8 @@ void gpio_init(void){
 	gpio_mode_input(GPIOA, GPIO_PUPD_NONE, GPIO_PIN_0);
 	//CS1180 cs
 	gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
+	cs1180_cs(1);
+	gpio_mode_analog_input(GPIOA, GPIO_PIN_8);
 	
 #elif (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600)
 	//rs485 INT ,this can be used detect rs485 in/out, then open rs485 power, and then detect GPIOF0
@@ -36,16 +38,13 @@ void gpio_init(void){
 	gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_12);		
 	//CS1180 cs
 	gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
-
+	cs1180_cs(1);
 	//LED 0,1,2
 	gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2|GPIO_PIN_3);
 	gpio_mode_output(GPIOF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_6);
 	//LED3,4
 	gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10|GPIO_PIN_9);
 #endif
-	//CS1180_PWR_ENABLE(0);
-	//power good detect
-	gpio_mode_input(GPIOF, GPIO_PUPD_NONE, GPIO_PIN_7);
 	//temp senser enable
 	gpio_mode_output(GPIOF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_1);
 	//charger detect
@@ -62,7 +61,97 @@ void gpio_init(void){
 	gpio_mode_input(GPIOA, GPIO_PUPD_NONE, GPIO_PIN_12);
 	//ML5238 cs
 	gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
+#if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600)
+	RS485_PWR_ENABLE(1);
+#endif
+}
+
+void charger_detect_irq_enable(int enable){
+	if (enable){
+		syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN10);
+		exti_init(EXTI_10, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
+		nvic_irq_enable(EXTI4_15_IRQn, 4U, 0U);
+		exti_interrupt_flag_clear(EXTI_10);
+		exti_interrupt_enable(EXTI_10);
+	}else {
+		//nvic_irq_disable(EXTI4_15_IRQn);
+		exti_interrupt_disable(EXTI_10);
+		exti_interrupt_flag_clear(EXTI_10);
+	}
+}
+
+void ml5238_irq_enable(int enable){
+	if (enable){
+		syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN12);
+		exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
+		nvic_irq_enable(EXTI4_15_IRQn, 4U, 0U);
+		exti_interrupt_flag_clear(EXTI_12);
+		exti_interrupt_enable(EXTI_12);
+	}else {
+		//nvic_irq_disable(EXTI4_15_IRQn);
+		exti_interrupt_disable(EXTI_12);
+		exti_interrupt_flag_clear(EXTI_12);
+	}
+}
+#if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700)
+void hall_1_detect_irq_enable(int enable){
+	if (enable){
+		syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN15);
+		exti_init(EXTI_15, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
+		nvic_irq_enable(EXTI4_15_IRQn, 4U, 0U);
+		exti_interrupt_flag_clear(EXTI_15);
+		exti_interrupt_enable(EXTI_15);
+	}else {
+		//nvic_irq_disable(EXTI4_15_IRQn);
+		exti_interrupt_disable(EXTI_15);
+		exti_interrupt_flag_clear(EXTI_15);
+	}
+}
+#else
+void hall_1_detect_irq_enable(int enable){
+}
+#endif
+void hall_2_detect_irq_enable(int enable){
+	if (enable){
+		syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN13);
+		exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
+		nvic_irq_enable(EXTI4_15_IRQn, 4U, 0U);
+		exti_interrupt_flag_clear(EXTI_13);
+		exti_interrupt_enable(EXTI_13);
+	}else {
+		//nvic_irq_disable(EXTI4_15_IRQn);
+		exti_interrupt_disable(EXTI_13);
+		exti_interrupt_flag_clear(EXTI_13);
+	}
+}
+
+
+void small_current_short_irq_enable(int enable){
+	if (enable){
+		syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN11);
+		exti_init(EXTI_11, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
+		nvic_irq_enable(EXTI4_15_IRQn, 4U, 0U);
+		exti_interrupt_flag_clear(EXTI_11);
+		exti_interrupt_enable(EXTI_11);
+	}else {
+		//nvic_irq_disable(EXTI4_15_IRQn);
+		exti_interrupt_disable(EXTI_11);
+		exti_interrupt_flag_clear(EXTI_11);
+	}
+}
 
+void dcdc_pwr_detect_irq_enable(int enable){
+	if (enable){
+		syscfg_exti_line_config(EXTI_SOURCE_GPIOF, EXTI_SOURCE_PIN7);
+		exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
+		nvic_irq_enable(EXTI4_15_IRQn, 4U, 0U);
+		exti_interrupt_flag_clear(EXTI_7);
+		exti_interrupt_enable(EXTI_7);
+	}else {
+		//nvic_irq_disable(EXTI4_15_IRQn);
+		exti_interrupt_disable(EXTI_7);
+		exti_interrupt_flag_clear(EXTI_7);
+	}
 }
 
 

+ 10 - 1
Application/bsp/gpio.h

@@ -10,10 +10,12 @@ void gpio_init(void);
 #define TEMP_OPEN(x) gpio_bit_write(GPIOF,GPIO_PIN_1,(bit_status)(x))
 /*switch for small current aux */
 #define AUX_VOL_OPEN(x) gpio_bit_write(GPIOB,GPIO_PIN_2,(bit_status)(x))
+/*aux pwr is locked */
+#define IS_AUX_VOL_LOCKED() gpio_input_bit_get(GPIOB, GPIO_PIN_11)
 /*switch for larger current DCDC  */
 #define DCDC_VOL_OPEN(x) gpio_bit_write(GPIOA,GPIO_PIN_11,(bit_status)(x))
 /* DCDC output power good detect */
-#define DCDC_POWER_GOOD() gpio_input_bit_get(GPIOF, GPIO_PIN_7)
+#define IS_DCDC_POWER_GOOD() gpio_input_bit_get(GPIOF, GPIO_PIN_7)
 /*detect for charger in/out */
 #define IS_CHARGER_IN() !gpio_input_bit_get(GPIOB,GPIO_PIN_10)
 /*spi chip select for ml5238*/
@@ -78,5 +80,12 @@ static __inline__ void gpio_mode_af(uint32_t gpio_periph, uint32_t pull_up_down,
 	gpio_mode_set(gpio_periph, GPIO_MODE_AF, pull_up_down, pin);
 }
 
+void charger_detect_irq_enable(int enable);
+void ml5238_irq_enable(int enable);
+void hall_1_detect_irq_enable(int enable);
+void hall_2_detect_irq_enable(int enable);
+void small_current_short_irq_enable(int enable);
+void dcdc_pwr_detect_irq_enable(int enable);
+
 #endif /* _GPIO_H__ */
 

+ 2 - 0
Application/bsp/irqs.c

@@ -93,6 +93,7 @@ void __weak charger_detect_irq_handler(void){}
 void __weak hall1_detect_irq_handler(void){}
 void __weak hall2_detect_irq_handler(void){}
 void __weak small_current_short_handler(void){}
+void __weak dcdc_pwr_detect_irq_handler(void) {}
 void EXTI4_15_IRQHandler(void){
 	if(RESET != exti_interrupt_flag_get(EXTI_4)){
 		exti_interrupt_flag_clear(EXTI_4);
@@ -105,6 +106,7 @@ void EXTI4_15_IRQHandler(void){
 	}	
 	if(RESET != exti_interrupt_flag_get(EXTI_7)){
 		exti_interrupt_flag_clear(EXTI_7);
+		dcdc_pwr_detect_irq_handler();
 	}
 	if(RESET != exti_interrupt_flag_get(EXTI_8)){
 		exti_interrupt_flag_clear(EXTI_8);

+ 4 - 4
Application/bsp/spi.c

@@ -13,6 +13,7 @@ void spi0_init(void){
 
 	ml5238_cs(1);
 
+	spi_i2s_deinit(SPI0);
 	spi_parameter_struct spi_init_struct;
 
     /* SPI0 parameter config */
@@ -44,9 +45,8 @@ void spi1_init(void){
 	gpio_mode_af(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
 	gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
 	gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13|GPIO_PIN_15);
-	
-	cs1180_cs(1);
-	
+
+	spi_i2s_deinit(SPI1);
 	spi_parameter_struct spi_init_struct;
 
     /* SPI1 parameter config */
@@ -55,7 +55,7 @@ void spi1_init(void){
     spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
     spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
     spi_init_struct.nss                  = SPI_NSS_SOFT;
-    spi_init_struct.prescale             = SPI_PSC_32 ;
+    spi_init_struct.prescale             = SPI_PSC_64 ;
     spi_init_struct.endian               = SPI_ENDIAN_MSB;
     spi_init(SPI1, &spi_init_struct);
 

+ 31 - 6
Project/SP700.uvoptx

@@ -155,7 +155,20 @@
           <WinNumber>1</WinNumber>
           <ItemText>_bms_state,0x0A</ItemText>
         </Ww>
+        <Ww>
+          <count>1</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>SystemCoreClock,0x0A</ItemText>
+        </Ww>
       </WatchWindow1>
+      <MemoryWindow1>
+        <Mm>
+          <WinNumber>1</WinNumber>
+          <SubType>0</SubType>
+          <ItemText>0x40003880</ItemText>
+          <AccSizeX>0</AccSizeX>
+        </Mm>
+      </MemoryWindow1>
       <Tracepoint>
         <THDelay>0</THDelay>
       </Tracepoint>
@@ -363,7 +376,7 @@
 
   <Group>
     <GroupName>Libs</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -691,7 +704,7 @@
 
   <Group>
     <GroupName>StartUp</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -734,8 +747,8 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\app\sox\sense_measure.c</PathWithFileName>
-      <FilenameWithoutPath>sense_measure.c</FilenameWithoutPath>
+      <PathWithFileName>..\Application\app\sox\state.c</PathWithFileName>
+      <FilenameWithoutPath>state.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
@@ -746,8 +759,20 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\app\sox\state.c</PathWithFileName>
-      <FilenameWithoutPath>state.c</FilenameWithoutPath>
+      <PathWithFileName>..\Application\app\sox\iostate.c</PathWithFileName>
+      <FilenameWithoutPath>iostate.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>43</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Application\app\sox\measure.c</PathWithFileName>
+      <FilenameWithoutPath>measure.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>

+ 10 - 5
Project/SP700.uvprojx

@@ -313,7 +313,7 @@
           </ArmAdsMisc>
           <Cads>
             <interw>1</interw>
-            <Optim>1</Optim>
+            <Optim>2</Optim>
             <oTime>0</oTime>
             <SplitLS>0</SplitLS>
             <OneElfS>1</OneElfS>
@@ -609,14 +609,19 @@
           <GroupName>SOX</GroupName>
           <Files>
             <File>
-              <FileName>sense_measure.c</FileName>
+              <FileName>state.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\Application\app\sox\sense_measure.c</FilePath>
+              <FilePath>..\Application\app\sox\state.c</FilePath>
             </File>
             <File>
-              <FileName>state.c</FileName>
+              <FileName>iostate.c</FileName>
               <FileType>1</FileType>
-              <FilePath>..\Application\app\sox\state.c</FilePath>
+              <FilePath>..\Application\app\sox\iostate.c</FilePath>
+            </File>
+            <File>
+              <FileName>measure.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Application\app\sox\measure.c</FilePath>
             </File>
           </Files>
         </Group>