From 59a4e01d92da432e9736b24c085089cd31963833 Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期三, 21 五月 2025 15:19:22 +0800 Subject: [PATCH] 修改了串口读取的bug,现在是通过飞线控制的 PCA蓝牙IRQ拉低,修改灯的闪灯逻辑, --- keil/include/drivers/PCA9555.c | 285 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 214 insertions(+), 71 deletions(-) diff --git a/keil/include/drivers/PCA9555.c b/keil/include/drivers/PCA9555.c index 5a0e901..b05146c 100644 --- a/keil/include/drivers/PCA9555.c +++ b/keil/include/drivers/PCA9555.c @@ -1,23 +1,29 @@ #include "PCA9555.h" +#include "mk_power.h" +//#include "DBG.h" +#include "lora_3029.h" uint8_t gps_led_output_state,tts_enbale_output_state,wake_up_output_state,air780e_enable_output_state,sos_enable_output_state,gps_backup_output_state,gps_power_output_state,main_ri_output_state;//1组output IO口从左到右1.0~1.7 uint8_t mcu_a_output_state,chg_g_output_state,lora_irq_output_state,lora_nrst_output_state,adc_minius_output_state,input_5v_output_state,pwr_on_output_state,pwr_enable_output_state;//2组output IO口从左到右0.0~0.7 uint8_t pca9555writedata_config[10];//暂存寄存器所有配置的数组 uint8_t pca9555writedata_output[10];//暂存输出高低电平配置的数组 uint8_t pca9555writedata_input[10];//暂存输入寄存器所有配置的数组 uint8_t pca9555writedata_polarity[10];//暂存输入极性反转寄存器所有配置的数组 -void IIC_gpio_pca_init(void) -{ - io_pin_mux_set(SDA_PIN, IO_FUNC0); - io_pin_mux_set(SCL_PIN, IO_FUNC0); +uint8_t pin_flag=0; +//float WAKE_UP_count; +extern float nomove_count; +//void IIC2_Init(void) +//{ +// io_pin_mux_set(SDA_PIN, IO_FUNC0); +// io_pin_mux_set(SCL_PIN, IO_FUNC0); - gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1); - //io_open_drain_set(SDA_PIN, 1); - io_pull_set(SDA_PIN , IO_PULL_UP, IO_PULL_UP_LEVEL2);//输出高阻态 +// gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1); +// //io_open_drain_set(SDA_PIN, 1); +// io_pull_set(SDA_PIN , IO_PULL_UP, IO_PULL_UP_LEVEL2);//输出高阻态 - gpio_pin_set_dir(SCL_PIN , GPIO_DIR_OUT, 1); - //io_open_drain_set(SCL_PIN, 1); - io_pull_set(SCL_PIN , IO_HIGH_Z, IO_PULL_UP_NONE); -} +// gpio_pin_set_dir(SCL_PIN , GPIO_DIR_OUT, 1); +// //io_open_drain_set(SCL_PIN, 1);//设置开漏输出 +// io_pull_set(SCL_PIN , IO_HIGH_Z, IO_PULL_UP_NONE); +//} void IIC2_pca_Start(void) { @@ -102,7 +108,7 @@ void IIC2_pca_send_Ack(void) { SCL_0; - SDA_0;//读取SDA电平为低则有应答 +/// SDA_0;//读取SDA电平为低则有应答 delay_us(10); SCL_1; delay_us(10); @@ -457,29 +463,63 @@ /*读取5V引脚的输入高低电平 返回值 高1 低0 电平 */ +uint16_t gpio_state111; +extern uint8_t input5v_time; +uint8_t _5VState = 0; +uint8_t Get5VState() +{ + return _5VState; +} + +void Set5VState(uint8_t state) +{ +// if(_5VState != state) +// { +// DBG_SetMode(DBG_MODE_CHARGE); +// } + _5VState = state; +} + int read_5v_input_pca(void) -{PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 - uint16_t gpio_state; - gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1]; - if(INPUT_5V_POSITION&gpio_state) - return 1; - else { +{ + if(input5v_time) + { + input5v_time=0; + PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 + uint16_t gpio_state; + gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1]; + gpio_state111=gpio_state; + if(gpio_state==0xFFFF) + {return 0;} + if(IN_5V_POSITION&gpio_state) + { + Set5VState(1); + return 1; + } + else + { + Set5VState(0); + return 0; + } + } + else { + Set5VState(0); return 0; } } /*读取供电引脚的输入高低电平 返回值 高1 低0 电平 */ -int read_powerkey_input_pca(void) -{PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 - uint16_t gpio_state; - gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1]; - if(PWR_ON_POSITION&gpio_state) - return 1; - else { - return 0; - } -} +//int read_powerkey_input_pca(void) +//{PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 +// uint16_t gpio_state; +// gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1]; +// if(PWR_ON_POSITION&gpio_state) +// return 1; +// else { +// return 0; +// } +//} /*读取SOS引脚的输入高低电平 返回值 高1 低0 电平 */ @@ -497,47 +537,100 @@ } } -int read_userkey_input_pca_lora(uint8_t flag) +/*读取LORA_IRQ引脚的输入高低电平 + 返回值 高1 低0 电平 +*/ +int read_userkey_input_pca_lora() { PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 uint16_t gpio_state; gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1]; - if(SOS_ENBALE_POSITION&gpio_state) + if(LORA_IRQ_POSITION&gpio_state) { - return flag=1; + return 1; } else { - return flag=0; + return 0; } } void PCA9555_init() { -//IIC_gpio_pca_init();//配置IIC管脚 +// IIC_gpio_pca_init();//配置IIC管脚 + PCA9555_Set_One_Value_Config(LORA_LED,0); //设置LORALED为输出 + PCA9555_Set_One_Value_Config(UWB_LED,0); //设置UWBLED为输出 + PCA9555_Set_One_Value_Config(BT_LED,0); //设置BT_LED为输出 + PCA9555_Set_One_Value_Config(RED_LED,0); //设置RED_LED为输出 + PCA9555_Set_One_Value_Config(GREEN_LED,0); //设置GREEN_LED为输出 + //管脚 + PCA9555_Set_One_Value_Config(LORA_NRST,0); //设置LORA_NRST为输出 + PCA9555_Set_One_Value_Config(BT_EN,0); //设置BT_EN为输出 + PCA9555_Set_One_Value_Output(BT_EN,1); + PCA9555_Set_One_Value_Config(MOTO,0); //设置MOTO为输出 - //PCA9555_write_config_port_data(PCA9555_DEVICE_ADDR,PCA_OUTPUT_CONFIG_MASK,PCA_OUTPUT_CONFIG_MASK);//全配置为输出 - //PCA9555_Set_One_Value_Polarity_input(PWR_ON,0); - //PCA9555_write_config_port_data(PCA9555_DEVICE_ADDR,PCA_INPUT_CONFIG_MASK,PCA_INPUT_CONFIG_MASK);//全配置为输入 - //PCA9555_write_polarity_port_data(PCA9555_DEVICE_ADDR,0x00,0x00);//翻转 - //PCA9555_Set_One_Value_Config(WAKE_UP,1); - //PCA9555_Set_All_Output(1); + PCA9555_Set_One_Value_Config(PWR_GND,0); //设置PWR_GND为输出 + PCA9555_Set_One_Value_Output(PWR_GND,0); //拉低 - PCA9555_Set_One_Value_Config(GPS_POWER,0);//设置GPS为输出 - PCA9555_Set_One_Value_Output(GPS_POWER,1);//拉高GPS - PCA9555_Set_One_Value_Config(ADC_MINIUS,0);//设置ADC输出 - PCA9555_Set_One_Value_Output(ADC_MINIUS,1);//默认拉高 - PCA9555_Set_One_Value_Config(MCU_A,0);//设置串口复用芯片切换 - PCA9555_Set_One_Value_Output(MCU_A,1);//输出高电平为uart通讯 - PCA9555_Set_One_Value_Config(INPUT_5V,1);//设置5V输入检测 - PCA9555_Set_One_Value_Config(GPS_LED,0);//设置LED灯输出 - PCA9555_Set_One_Value_Output(GPS_LED,1);//输出高电平开启LED通闪烁 - PCA9555_Set_One_Value_Config(PWR_ENABLE,0);//设置电池上电是否给单片机供电 - PCA9555_Set_One_Value_Output(PWR_ENABLE,1);//高电平默认导通单片机供电 - PCA9555_Set_One_Value_Config(PWR_ON,1);//设置开关机按键输入 - - PCA9555_Set_One_Value_Config(SOS_ENBALE,1);//设置SOS按钮输入 -// PCA9555_Set_One_Value_Output(PWR_ON,0);//拉低 + //PCA9555_Set_One_Value_Config(LORA_IRQ,1); //设置LORAIRQ为输入 + + PCA9555_Set_One_Value_Config(WK_UP,1); //设置WK_UP为输入 + PCA9555_Set_One_Value_Config(SOS_ENBALE,1); //设置SOS为输入 + PCA9555_Set_One_Value_Config(IN_5V,1); //设置IN_5V为输入 + PCA9555_Set_One_Value_Config(CHGN,1); //设置CHGN为输入 //充电芯片输入芯片IIC输入脚 + PCA9555_Set_One_Value_Config(BT_IRQ,0); + PCA9555_Set_One_Value_Output(BT_IRQ,0); + PCA9555_Set_One_Value_Config(IO_KONG,0); + PCA9555_Set_One_Value_Output(IO_KONG,1); +// PCA9555_Set_One_Value_Output(IO_KONG,0); +//BT_ON; +//BT_OFF; +// PCA9555_Set_One_Value_Output(BT_LED,0); +// PCA9555_Set_One_Value_Output(UWB_LED,0); +// PCA9555_Set_One_Value_Config(GPS_POWER,0);//设置GPS为输出 +// PCA9555_Set_One_Value_Output(GPS_POWER,1);//拉高GPS +// PCA9555_Set_One_Value_Config(ADC_MINIUS,0);//设置ADC输出 +// PCA9555_Set_One_Value_Output(ADC_MINIUS,1);//默认拉高 +// PCA9555_Set_One_Value_Config(MCU_A,0);//设置串口复用芯片切换 +// PCA9555_Set_One_Value_Output(MCU_A,1);//输出高电平为uart通讯 +// PCA9555_Set_One_Value_Config(INPUT_5V,1);//设置5V输入检测 +// PCA9555_Set_One_Value_Config(GPS_LED,0);//设置LED灯输出 +// PCA9555_Set_One_Value_Output(GPS_LED,1);//输出高电平开启LED通闪烁 +// PCA9555_Set_One_Value_Config(PWR_ENABLE,0);//设置电池上电是否给单片机供电 +// PCA9555_Set_One_Value_Output(PWR_ENABLE,1);//高电平默认导通单片机供电 +// PCA9555_Set_One_Value_Config(PWR_ON,1);//设置开关机按键输入 +// +// PCA9555_Set_One_Value_Config(TTS_ENABLE,0); +// PCA9555_Set_One_Value_Config(WAKE_UP,0); + + +// LORA_LED_ON; +// UWB_LED_ON; +// GREEN_LED_ON; +// RED_LED_ON; +// BT_LED_ON; +//存在复位问题 + +// PCA9555_Set_One_Value_Config(SOS_ENBALE,1);//设置SOS按钮输入 + LORA_NRST_UP; + LORA_NRST_DOWN; + LORA_LED_OFF; + GREEN_LED_OFF; + UWB_LED_OFF; + RED_LED_OFF; + BT_LED_OFF; +// LORA_LED_ON; +// GREEN_LED_ON; +// UWB_LED_ON; +// RED_LED_ON; +// BT_LED_ON; +// LORA_NRST_DOWN; +// delay_us(10000); + +// MOTO_OFF; + + + //PCA9555_Set_One_Value_Output(LORA_NRST,1);//拉高 //PCA9555_readdata_from_output_register(PCA9555_DEVICE_ADDR,pca9555writedata_input); //PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0); //PCA9555_Set_One_Value_Output(PWR_ON,0); @@ -547,35 +640,85 @@ //PCA9555_readdata_from_config_register(PCA9555_DEVICE_ADDR,pca9555writedata_config); // PCA9555_Set_All_Output(0);//全部拉低 - + //PCA9555_Set_One_Value_Output(TTS_ENABLE,0); + //PCA9555_Set_One_Value_Output(WAKE_UP,0); //测试 //PCA9555_Set_All_Output(1);//全部拉高 //PCA9555_Set_All_Output(0);//全部拉低 } +uint8_t LORA_IRQ_flag=0; +uint8_t SOS_KEY_STATE=0; +extern uint16_t uwb_time_count; +void SOS_irq_callback() +{ + SOS_KEY_STATE=!SOS_KEY_STATE; + if(SOS_KEY_STATE) + { +// GREEN_LED_ON; +// onemin_onesecond_flag=1; +// uwb_time_count=0; +// CloseUWB(); + } + else + { +// onemin_onesecond_flag=0; +// GREEN_LED_OFF; +// uwb_time_count=0; +// CloseUWB(); + } + +} +//void WAKE_UP_irq_callback() +//{ +// WAKE_UP_count++; +//} +void move_handler() +{ + nomove_count=0; + +} + void check_input_change(void) { uint16_t gpio_state; gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1]; - if(LORA_IRQ_POSITION&gpio_state) - { - - } - //uart_change_check(gpio_state); +// if(BT_IRQ_POSITION&gpio_state) +// { + +// } + if(!(SOS_ENBALE_POSITION&gpio_state)) + { + SOS_irq_callback(); + } + if(WK_UP_POSITION&gpio_state) + { + //移动 + move_handler(); + } + if(BT_IRQ_POSITION&gpio_state) + { + + } + } -static void pca_handler(enum IO_PIN_T pin) -{ - PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 - check_input_change(); -} -//void pca_input_detection_init(GPIO_IRQ_HANDLER_T irq_handler) + + +//static void pca_input_detect_irq_handler(enum IO_PIN_T pin) //{ -// pca_input_detect_irq_handler=irq_handler; -// gpio_pin_set_dir(PCA_INPUT_DETECT , GPIO_DIR_IN, 0); -// io_pull_set(PCA_INPUT_DETECT, IO_PULL_UP, IO_PULL_UP_LEVEL2); -// gpio_enable_irq(PCA_INPUT_DETECT, GPIO_IRQ_TYPE_FALLING_EDGE, pca_input_detect_irq_handler); -// power_wakeup_enable((enum POWER_WAKEUP_SOURCE_T)PCA_INPUT_DETECT, POWER_WAKEUP_LEVEL_LOW); +// +// //} + +void pca_input_detection_init(GPIO_IRQ_HANDLER_T irq_handler) +{ + gpio_pin_set_dir(PCA_INPUT_DETECT , GPIO_DIR_IN, 0); + io_pull_set(PCA_INPUT_DETECT, IO_PULL_UP, IO_PULL_UP_LEVEL2); + gpio_enable_irq(PCA_INPUT_DETECT, GPIO_IRQ_TYPE_FALLING_EDGE, irq_handler); +// power_wakeup_enable((enum POWER_WAKEUP_SOURCE_T)PCA_INPUT_DETECT, POWER_WAKEUP_LEVEL_LOW); +} + + -- Gitblit v1.9.3