From cbc8875f9b4773f171a595d5195e7a903fee7769 Mon Sep 17 00:00:00 2001
From: zhangbo <zhangbo@qq.com>
Date: 星期一, 14 七月 2025 15:49:28 +0800
Subject: [PATCH] V2.12, 解决uwb不测距休眠功耗不对的问题。(1分钟不测距就30秒开一秒接收)

---
 keil/include/drivers/PCA9555.c |  637 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 511 insertions(+), 126 deletions(-)

diff --git a/keil/include/drivers/PCA9555.c b/keil/include/drivers/PCA9555.c
index a1fb3c7..b3e3df5 100644
--- a/keil/include/drivers/PCA9555.c
+++ b/keil/include/drivers/PCA9555.c
@@ -1,14 +1,18 @@
 #include "PCA9555.h"
-
+#include "DBG.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_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);
 
     gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1);
-//		io_open_drain_set(SDA_PIN, 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);
@@ -18,32 +22,49 @@
 
 void IIC2_pca_Start(void)
 {
-//		IIC2_SDA_OUT();     //sda线输出
+////		IIC2_SDA_OUT();     //sda线输出
+//    SDA_1;
+//		delay_us(10);
+//    SCL_1;
+//		delay_us(10);
+//    SDA_0;//START:when CLK is high,DATA change form high to low
+//    delay_us(10);
+
+    //		IIC2_SDA_OUT();     //sda线输出
     SDA_1;
-		delay_us(10);
+//		delay_us(10);
     SCL_1;
-		delay_us(10);
+//		delay_us(10);
     SDA_0;//START:when CLK is high,DATA change form high to low
     delay_us(10);
+    SCL_0;//钳住I2C总线,准备发送或接收数据
 }
 void IIC_pca_Ready(void)
 {
-   
-		SCL_1;	
-  	delay_us(10);
-		SDA_1;
-   	delay_us(10);
+
+    SCL_1;
+    delay_us(10);
+    SDA_1;
+    delay_us(10);
 }
 //产生IIC停止信号
 void IIC2_pca_Stop(void)
 {
 
-    SDA_0;//STOP:when CLK is high DATA change form low to high
-	
+//    SDA_0;//STOP:when CLK is high DATA change form low to high
+//
+//    delay_us(10);
+//    SCL_1;
+//		delay_us(10);
+//    SDA_1;//发送I2C总线结束信号
+//    delay_us(10);
+
+    SCL_0;
+    SDA_0;//sToP:when ClK is high DATA change form low to high
     delay_us(10);
     SCL_1;
-		delay_us(10);
-    SDA_1;//发送I2C总线结束信号
+    //delay_us(10);
+    SDA_1;//7发送I2C总线结束信号
     delay_us(10);
 }
 //等待应答信号到来
@@ -52,12 +73,16 @@
 uint8_t IIC2_Wait_pca_Ack(void)
 {
     uint8_t ucErrTime=0;
-//  IIC2_SDA_IN();     
-	gpio_pin_set_dir(SDA_PIN , GPIO_DIR_IN, 1); //SDA设置为输入等待接收端的应答信号
+//  IIC2_SDA_IN();
+
+    gpio_pin_set_dir(SDA_PIN,GPIO_DIR_IN,1); //SDA设置为输入等待接收端的应答信号
     SDA_1;
     delay_us(6);
     SCL_1;
     delay_us(6);
+//    SDA_1;
+//    delay_us(6);
+
 
     while(IIC2_READ_SDA)
     {
@@ -65,29 +90,32 @@
         if(ucErrTime>250)
         {
             IIC2_pca_Stop();
+            gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1);
             return 1;
         }
     }
-    gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1);
+    gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 0);
     SCL_0;//时钟输出0
     return 0;
-		
+
 }
 //产生ACK应答
 void IIC2_pca_send_Ack(void)
 {
-    SDA_0;
+    SCL_0;
+    SDA_0;//读取SDA电平为低则有应答
     delay_us(10);
-    SCL_1;//读取SDA电平为低则有应答
+    SCL_1;
     delay_us(10);
     SCL_0;
 }
 //不产生ACK应答
 void IIC2_pca_send_NAck(void)
 {
-    SDA_1;
+    SCL_0;
+    SDA_1;//读取SDA电平为高则无应答信号
     delay_us(10);
-    SCL_1;//读取SDA电平为高则无应答信号
+    SCL_1;
     delay_us(10);
     SCL_0;
 }
@@ -95,11 +123,13 @@
 //返回从机有无应答
 //1,有应答
 //0,无应答
+uint8_t statistic_num;
 void IIC2_Send_pca_Byte(uint8_t txd)
 {
     uint8_t t;
 //		IIC2_SDA_OUT();
     SCL_0;//拉低时钟开始数据传输
+//		delay_us(10);
     for(t=0; t<8; t++)
     {
         if((txd&0x80)>>7)
@@ -117,28 +147,41 @@
         SCL_0;
         delay_us(10);
     }
-		SDA_1;//新增sda拉高
-		delay_us(10);
+//		statistic_num=txd;
+//		SDA_1;//新增sda拉高
+//		delay_us(10);
 }
 
 //读1个字节,ack=1时,发送ACK,ack=0,发送nACK,不是一样的
 uint8_t IIC2_Read_pca_Byte(unsigned char ack)
 {
-    unsigned char i,receive=0;
-//	IIC2_SDA_IN();//SDA设置为输入
+    unsigned char i,receive=0,bit=0;
+    gpio_pin_set_dir(SDA_PIN,GPIO_DIR_IN,0); //设置为输入读取电平
+//		io_pull_set(SDA_PIN , IO_HIGH_Z, IO_PULL_UP_NONE);
     for(i=0; i<8; i++ )
     {
         SCL_0;
-        delay_us(10);
+        delay_us(6);//修改时间
         SCL_1;
-        receive<<=1;
-        if(IIC2_READ_SDA)receive++;
+        //receive<<=1;
+        if(IIC2_READ_SDA) {
+            bit=1<<i;
+            receive|=bit;
+        }
         delay_us(5);
     }
-    if (!ack)
-        IIC2_pca_send_NAck();//发送nACK
-    else
-        IIC2_pca_send_Ack(); //发送ACK
+    SCL_0;
+    if(ack==2) {
+        gpio_pin_set_dir(SDA_PIN,GPIO_DIR_OUT,0); //设置为输出恢复ACK
+    } else {
+        gpio_pin_set_dir(SDA_PIN,GPIO_DIR_OUT,1); //设置为输出恢复ACK
+    }
+
+//		io_pull_set(SDA_PIN , IO_PULL_UP, IO_PULL_UP_LEVEL2);//输出高阻态
+//    if (!ack)
+//        IIC2_pca_send_NAck();//发送nACK
+//    else
+//        IIC2_pca_send_Ack(); //发送ACK
     return receive;
 }
 
@@ -150,58 +193,107 @@
   high_byte  写入芯片的前后位数据
 *********************************************************/
 //写pca9555第一层,最底层驱动
+int temp_ack3,temp_ack4,temp_ack5,temp_ack6;
 void IIC_Write_Pca9555(unsigned char addr,unsigned char reg_addr,unsigned char low_byte,unsigned char high_byte)
 {
-	  IIC2_pca_Start();
-	  IIC2_Send_pca_Byte(addr & 0xfe);
-	  IIC2_Wait_pca_Ack();
-	  IIC2_Send_pca_Byte(reg_addr);
-	  IIC2_Wait_pca_Ack();
-	  IIC2_Send_pca_Byte(low_byte);
-	  IIC2_Wait_pca_Ack();
-	  IIC2_Send_pca_Byte(high_byte);
-	  IIC2_Wait_pca_Ack();
-	  IIC2_pca_Stop();
-}
+    IIC2_pca_Start();
+    IIC2_Send_pca_Byte(addr & 0xfe);
+    temp_ack3=IIC2_Wait_pca_Ack();
+    IIC2_Send_pca_Byte(reg_addr);
+    temp_ack4=IIC2_Wait_pca_Ack();
+    IIC2_Send_pca_Byte(low_byte);
+    temp_ack5=IIC2_Wait_pca_Ack();
+    IIC2_Send_pca_Byte(high_byte);
+    temp_ack6=IIC2_Wait_pca_Ack();
+    IIC2_pca_Stop();
 
+//  	  IIC2_Start();
+//    IIC2_Send_Byte(addr & 0xfe);	    //发送写命令
+//    temp_ack3=IIC2_Wait_pca_Ack();
+//    IIC2_Send_Byte(reg_addr);					//发送地址
+//    temp_ack4=IIC2_Wait_pca_Ack();
+//    IIC2_Send_Byte(low_byte);     //发送字节
+//    temp_ack5=IIC2_Wait_pca_Ack();
+//		IIC2_Send_Byte(high_byte);     //发送字节
+//		temp_ack6=IIC2_Wait_pca_Ack();
+//    IIC2_Stop();//产生一个停止条件
+
+}
+/*
+  //	  IIC2_Start();
+//    IIC2_Send_Byte(addr & 0xfe);	    //发送写命令
+//    temp_ack3=IIC2_Wait_Ack();
+//    IIC2_Send_Byte(reg_addr);					//发送地址
+//    temp_ack4=IIC2_Wait_Ack();
+//    IIC2_Send_Byte(low_byte);     //发送字节
+//    temp_ack5=IIC2_Wait_Ack();
+//		IIC2_Send_Byte(high_byte);     //发送字节
+//		temp_ack6=IIC2_Wait_Ack();
+//    IIC2_Stop();//产生一个停止条件
+*/
+int temp_ack,temp_ack1,temp_ack2;
+uint8_t temp=0;
 void IIC_Read_Pca9555(uint8_t addr,uint8_t reg_addr,uint8_t* pBuffer,uint16_t num)
 {
-	  IIC2_pca_Start();
-	  IIC2_Send_pca_Byte(addr & 0xfe);
-	  IIC2_Wait_pca_Ack();
-	  IIC2_Send_pca_Byte(reg_addr);
-	  IIC2_Wait_pca_Ack();
+    IIC2_pca_Start();
+    IIC2_Send_pca_Byte(addr & 0xfe);
+    temp_ack=IIC2_Wait_pca_Ack();
+    IIC2_Send_pca_Byte(reg_addr);
+    temp_ack1=IIC2_Wait_pca_Ack();
 
-	  IIC2_pca_Start();
-	  IIC2_Send_pca_Byte(addr | 0x01);
-	  IIC2_Wait_pca_Ack();
-	  while (num)
-	  {
-		    *pBuffer = IIC2_Read_pca_Byte(1);
-			if (num == 1)
-			{
-				IIC2_pca_send_NAck();
-			}
-			else
-			{ 
-				IIC2_pca_send_Ack();
-			}	
-		    pBuffer++;
-			num--;
-	  }
-	  IIC2_pca_Stop();
+    IIC2_pca_Start();
+    IIC2_Send_pca_Byte(addr | 0x01);
+    temp_ack2=IIC2_Wait_pca_Ack();
+
+//		if(num==2){
+//		pBuffer[0]=IIC2_Read_Byte(1);
+//		pBuffer[1]=IIC2_Read_Byte(0);
+//		}else{
+//		pBuffer[0]=IIC2_Read_Byte(0);
+//		}
+
+    while (num)
+    {
+        *pBuffer = IIC2_Read_pca_Byte(num);
+        if (num == 1)
+        {
+            IIC2_pca_send_NAck();
+            //IIC2_NAck();
+        }
+        else
+        {
+            IIC2_pca_send_Ack();
+            //IIC2_Ack();
+        }
+        pBuffer++;
+        num--;
+    }
+    IIC2_pca_Stop();
+
+
+//    IIC2_Start();
+//    IIC2_Send_Byte(addr & 0xfe);	     //发送写命令
+//    IIC2_Wait_pca_Ack();
+//    IIC2_Send_Byte(reg_addr);   //发送读地址
+//    IIC2_Wait_pca_Ack();
+//    IIC2_Start();
+//    IIC2_Send_Byte(0x41);       //发送读命令,进入接收模式
+//    IIC2_Wait_pca_Ack();
+//    temp=IIC2_Read_Byte(0);
+//    IIC2_Stop();								//产生一个停止条件
+
 }
 
 /*写pca9555第二层驱动,可辅助逻辑不破坏最底层驱动,该函数默认配置输出寄存器
   addr    芯片地址,0x40表示第一个芯片地址
   data_L  写入芯片的前八位数据
-  data_H  写入芯片的前后位数据
+  data_H  写入芯片的后八位数据
 */
 void PCA9555_write_output_port_data(unsigned char addr,unsigned char data_L,unsigned char data_H)
-{                        
-		IIC_Write_Pca9555(addr,PCA9555_REG_OUT0,data_L,data_H);//	PCA9555_REG_OUT0 输出寄存器0地址
-		pca9555writedata_output[0]=	data_L;//保存该次设置数据
-		pca9555writedata_output[0]=	data_H;	
+{
+    IIC_Write_Pca9555(addr,PCA9555_REG_OUT0,data_L,data_H);//	PCA9555_REG_OUT0 输出寄存器0地址
+    pca9555writedata_output[0]=	data_L;//保存该次设置数据
+    pca9555writedata_output[1]=	data_H;
 }
 
 /*写pca9555第二层驱动,可辅助逻辑不破坏最底层驱动,该函数默认配置输出寄存器
@@ -210,19 +302,54 @@
   data_H  写入芯片的前后位数据
 */
 void PCA9555_write_config_port_data(unsigned char addr,unsigned char data_L,unsigned char data_H)
-{                        
-		IIC_Write_Pca9555(addr,PCA9555_REG_CFG0,data_L,data_H);//	PCA9555_REG_OUT0 输出寄存器0地址 
-		pca9555writedata_config[0]=	data_L;//保存该次设置数据
-		pca9555writedata_config[0]=	data_H;
+{
+    IIC_Write_Pca9555(addr,PCA9555_REG_CFG0,data_L,data_H);//	PCA9555_REG_OUT0 输出寄存器0地址
+    pca9555writedata_config[0]=	data_L;//保存该次设置数据
+    pca9555writedata_config[1]=	data_H;
+}
+/*写pca9555第二层驱动,可辅助逻辑不破坏最底层驱动,该函数默认配置输入极性翻转寄存器 1翻转 2不变
+  addr    芯片地址,0x40表示第一个芯片地址
+  data_L  写入芯片的前八位数据
+  data_H  写入芯片的前后位数据
+*/
+void PCA9555_write_polarity_port_data(unsigned char addr,unsigned char data_L,unsigned char data_H)
+{
+    IIC_Write_Pca9555(addr,PCA9555_REG_POL0,data_L,data_H);//	PCA9555_REG_OUT0 输出寄存器0地址
+    pca9555writedata_polarity[0]=	data_L;//保存该次设置数据
+    pca9555writedata_polarity[1]=	data_H;
 }
 
 /*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动
   addr     芯片地址,0x40表示第一个芯片地址
-  pBuffer  读出芯片的数据 2个寄存器的gpio电平
+  pBuffer  读出芯片的数据 2个输入寄存器的值仅限输入模式使用
 */
 void PCA9555_readdata(unsigned char addr,unsigned char* pBuffer)
 {
-		IIC_Read_Pca9555(addr,PCA9555_REG_IN0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出   
+    IIC_Read_Pca9555(addr,PCA9555_REG_IN0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
+}
+/*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动
+  addr     芯片地址,0x40表示第一个芯片地址
+  pBuffer  读出芯片的数据 2个寄存器的值仅限输出模式,此模式下仅回复输入输出的控制模式的值,而非电平值
+*/
+void PCA9555_readdata_from_output_register(unsigned char addr,unsigned char* pBuffer)
+{
+    IIC_Read_Pca9555(addr,PCA9555_REG_OUT0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
+}
+/*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动
+  addr     芯片地址,0x40表示第一个芯片地址
+  pBuffer  读出芯片的数据 2个寄存器的值仅限输出模式,此模式下仅回复输入输出的控制模式的值,而非电平值
+*/
+void PCA9555_readdata_from_polarity_register(unsigned char addr,unsigned char* pBuffer)
+{
+    IIC_Read_Pca9555(addr,PCA9555_REG_POL0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
+}
+/*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动
+  addr     芯片地址,0x40表示第一个芯片地址
+  pBuffer  读出芯片的数据 配置2个寄存器的数值
+*/
+void PCA9555_readdata_from_config_register(unsigned char addr,unsigned char* pBuffer)
+{
+    IIC_Read_Pca9555(addr,PCA9555_REG_CFG0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
 }
 ///*配置芯片的对应管脚输入输出功能
 //  addr    芯片地址,0x40表示第一个芯片地址
@@ -230,8 +357,8 @@
 //  data_H  写入芯片的前后位数据
 //*/
 //void PCA9555_config_gpio(unsigned char addr,unsigned char data_L,unsigned char data_H)
-//{                        
-//		IIC_Write_Pca9555(addr,PCA9555_REG_CFG0,data_L,data_H);//	PCA9555_REG_OUT0 输出寄存器0地址    
+//{
+//		IIC_Write_Pca9555(addr,PCA9555_REG_CFG0,data_L,data_H);//	PCA9555_REG_OUT0 输出寄存器0地址
 //}
 
 
@@ -241,16 +368,16 @@
 */
 void PCA9555_Set_All_Output(unsigned char value)
 {
-		int i;
-		for(i=0;i<4;i++){
-			if(value==0)
-				pca9555writedata_output[i]=0;
-			else
-				pca9555writedata_output[i]=0xff;
-		}
-		PCA9555_write_output_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_output[0],pca9555writedata_output[1]);//全部输出为1或0 
-		//多芯片
-		//PCA9555_writedata(PCA9555_REG_OUT0,pca9555writedata[2],pca9555writedata[3]);
+    int i;
+    for(i=0; i<4; i++) {
+        if(value==0)
+            pca9555writedata_output[i]=0;
+        else
+            pca9555writedata_output[i]=0xff;
+    }
+    PCA9555_write_output_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_output[0],pca9555writedata_output[1]);//全部输出为1或0
+    //多芯片
+    //PCA9555_writedata(PCA9555_REG_OUT0,pca9555writedata[2],pca9555writedata[3]);
 }
 /*设置第一个芯片某一通道IO高低输出仅限输出
   num    控制的IO序号 1~16
@@ -258,20 +385,20 @@
 */
 void PCA9555_Set_One_Value_Output(unsigned char num,unsigned char value)
 {
-	 if(num >0 && num <17){//第一个芯片IO1-16控制
-		 if(num <9){
-				if(value)pca9555writedata_output[0] |= 0x01<<(num - 1);//赋值位高
-				else pca9555writedata_output[0] &= ~(0x01<<(num - 1));//赋值位低
-			}
-			else{
-				if(value)pca9555writedata_output[1] |= 0x01<<(num - 9);//赋值位高
-				else pca9555writedata_output[1] &= ~(0x01<<(num - 9));//赋值位低
-			}
-			PCA9555_write_output_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_output[0],pca9555writedata_output[1]);
-	 }else{//超出芯片控制
-	 		//error
-	 }
-	 //底下为多芯片逻辑
+    if(num >0 && num <17) { //第一个芯片IO1-16控制
+        if(num <9) {
+            if(value)pca9555writedata_output[0] |= 0x01<<(num - 1);//赋值位高
+            else pca9555writedata_output[0] &= ~(0x01<<(num - 1));//赋值位低
+        }
+        else {
+            if(value)pca9555writedata_output[1] |= 0x01<<(num - 9);//赋值位高
+            else pca9555writedata_output[1] &= ~(0x01<<(num - 9));//赋值位低
+        }
+        PCA9555_write_output_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_output[0],pca9555writedata_output[1]);
+    } else { //超出芯片控制
+        //error
+    }
+    //底下为多芯片逻辑
 //	 else if(num >16 && num <33){//第二个芯片IO1-16控制,使用更多IO以此类推,最多支持0x000~0x111 共8个芯片串联,共128个IO,如果不够可以使用PCA9505,40个IO,最多串联320个IO
 //	 		if(num <25){
 //				if(value)pca9555writedata[2] |= 0x01<<(num - 17);//赋值位高
@@ -280,7 +407,7 @@
 //			else{
 //				if(value)pca9555writedata[3] |= 0x01<<(num - 25);//赋值位高
 //				else pca9555writedata[3] &= ~(0x01<<(num - 25));//赋值位低
-//			}	
+//			}
 //			PCA9555_writedata(PCA9555_REG_OUT1,pca9555writedata[2],pca9555writedata[3]);
 //	 }
 //	 else{//超出芯片控制
@@ -289,30 +416,288 @@
 }
 /*设置第一个芯片某一通道IO输入或输出
   num    控制的IO序号 1~17
-  value  控制的IO输出状态 0:低电平 1:高电平
+  value  控制的IO输出状态 0:输出 1:输入
 */
-void PCA9555_Set_One_Value_Config(unsigned char num,unsigned char value) 
+void PCA9555_Set_One_Value_Config(unsigned char num,unsigned char value)
 {
-	
-	 if(num >0 && num <17){//第一个芯片IO1-16控制
-		 if(num <9){
-				if(value)pca9555writedata_config[0] |= 0x01<<(num - 1);//赋值位高
-				else pca9555writedata_config[0] &= ~(0x01<<(num - 1));//赋值位低
-			}
-			else{
-				if(value)pca9555writedata_config[1] |= 0x01<<(num - 9);//赋值位高
-				else pca9555writedata_config[1] &= ~(0x01<<(num - 9));//赋值位低
-			}
-			PCA9555_write_config_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_config[0],pca9555writedata_config[1]);
-	 }else{//超出芯片控制
-	 		//error
-	 }
+
+    if(num >0 && num <17) { //第一个芯片IO1-16控制
+        if(num <9) {
+            if(value)pca9555writedata_config[0] |= 0x01<<(num - 1);//赋值位高
+            else pca9555writedata_config[0] &= ~(0x01<<(num - 1));//赋值位低
+        }
+        else {
+            if(value)pca9555writedata_config[1] |= 0x01<<(num - 9);//赋值位高
+            else pca9555writedata_config[1] &= ~(0x01<<(num - 9));//赋值位低
+        }
+        PCA9555_write_config_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_config[0],pca9555writedata_config[1]);
+    } else { //超出芯片控制
+        //error
+    }
+}
+/*设置第一个芯片某一通道默认输入的极性
+  num    控制的IO序号 1~17
+  value  控制的IO输出状态 0:非使能 1:使能翻转为电平0
+*/
+void PCA9555_Set_One_Value_Polarity_input(unsigned char num,unsigned char value)
+{
+    if(num >0 && num <17) { //第一个芯片IO1-16控制
+        if(num <9) {
+            if(value)pca9555writedata_polarity[0] |= 0x01<<(num - 1);//赋值位高
+            else pca9555writedata_polarity[0] &= ~(0x01<<(num - 1));//赋值位低
+        }
+        else {
+            if(value)pca9555writedata_polarity[1] |= 0x01<<(num - 9);//赋值位高
+            else pca9555writedata_polarity[1] &= ~(0x01<<(num - 9));//赋值位低
+        }
+        PCA9555_write_polarity_port_data(PCA9555_DEVICE_ADDR,pca9555writedata_polarity[0],pca9555writedata_polarity[1]);
+    } else { //超出芯片控制
+        //error
+    }
+}
+/*读取5V引脚的输入高低电平
+  返回值 高1 低0 电平
+*/
+uint16_t gpio_state111;
+extern uint8_t input5v_time;
+HIDO_UINT8 _5VState = 0;
+HIDO_UINT8 Get5VState()
+{
+    return _5VState;
+}
+
+void Set5VState(HIDO_UINT8 state)
+{
+//    if(_5VState != state)
+//    {
+//        DBG_SetMode(DBG_MODE_CHARGE);
+//    }
+    _5VState = state;
+}
+
+int read_5v_input_pca(void)
+{
+    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(INPUT_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;
+    }
+}
+/*读取SOS引脚的输入高低电平
+  返回值 高1 低0 电平
+*/
+int read_userkey_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(SOS_ENBALE_POSITION&gpio_state)
+        return 1;
+    else {
+        return 0;
+    }
 }
 void PCA9555_init()
 {
-IIC_gpio_pca_init();//配置IIC管脚
-PCA9555_write_config_port_data(PCA9555_DEVICE_ADDR,0x00,0x00);//全配置为输出
-	//测试
-PCA9555_Set_All_Output(1);//全部拉高
+//IIC_gpio_pca_init();//配置IIC管脚
+
+    //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(GPS_POWER,0);//设置GPS为输出
+    PCA9555_Set_One_Value_Output(GPS_POWER,1);//拉高GPS
+
+    PCA9555_Set_One_Value_Config(GPS_BACKUP,0);//设置GPS备用电源为输出
+    PCA9555_Set_One_Value_Output(GPS_BACKUP,1);//拉高GPS
+
+//    while(1)
+    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(LED_POWER,0);//设置LED灯输出
+    PCA9555_Set_One_Value_Output(LED_POWER,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_Config(TTS_ENABLE,0);
+    PCA9555_Set_One_Value_Output(TTS_ENABLE,1);
+    PCA9555_Set_One_Value_Config(AIR780E_ENBALE,0);//配置4G供电
+    PCA9555_Set_One_Value_Output(AIR780E_ENBALE,1);//打开4G
+
+    PCA9555_Set_One_Value_Config(MAIN_RI,0);//配置4G唤醒引脚为输入
+    PCA9555_Set_One_Value_Output(MAIN_RI,0);
+
+//	PCA9555_Set_One_Value_Config(SOS_ENBALE,1);//设置SOS按钮输入
+
+    PCA9555_Set_One_Value_Config(WAKE_UP,1);
+//    PCA9555_Set_One_Value_Config(TTS_ENABLE,0);//配置tts供电
+//	PCA9555_Set_One_Value_Output(PWR_ON,0);//拉低
+    //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);
+//	PCA9555_Set_All_Output(0);
+    //PCA9555_readdata_from_polarity_register(PCA9555_DEVICE_ADDR,pca9555writedata_input);
+    PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值
+
+    //PCA9555_readdata_from_config_register(PCA9555_DEVICE_ADDR,pca9555writedata_config);
+//	PCA9555_Set_All_Output(0);//全部拉低
+
+    //测试
+//PCA9555_Set_All_Output(1);//全部拉高
+//PCA9555_Set_All_Output(0);//全部拉低
+
 }
 
+extern float nomove_count;
+extern uint8_t deep_sleep_falg;
+
+void move_handler()
+{
+    nomove_count=0;
+    if(deep_sleep_falg==0)
+    {
+        deep_sleep_falg=1;
+//	   sleep_timer_start();
+        NVIC_SystemReset();
+    }
+}
+uint8_t test11,test21,test31,test41,test51;
+void check_input_change(void)
+{
+    uint16_t gpio_state;
+    gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1];
+
+    if(WAKE_UP_POSITION&gpio_state)
+    {
+
+        //移动
+        nomove_count=0;
+        if(deep_sleep_falg==0)
+        {
+
+
+            deep_sleep_falg=1;
+//           NVIC_SystemReset();
+            sys_reset(0);
+        }
+//
+        test51++;
+    }
+//	if(!(MAIN_RI_POSITION&gpio_state))
+//	{
+//		 flag_4G_recdata = 1;
+//     delaysleep_count = 3;
+//        test21++;
+//	}
+    if((PWR_ON_POSITION&gpio_state))
+    {
+
+        PowerTask();
+        test31++;
+    }
+    if(!(SOS_ENBALE_POSITION&gpio_state))
+    {
+
+        UserKeyTask();
+        test21++;
+    }
+
+
+}
+
+
+
+////0组
+//#define  MCU_A 			0x01
+//#define  CHG_G 			0x02
+//#define  LORA_IRQ 	0x03
+//#define  LORA_NRST 	0x04
+//#define  ADC_MINIUS 0x05
+//#define  INPUT_5V 	0x06
+//#define  PWR_ON 		0x07
+//#define  PWR_ENABLE 0x08
+////1组
+//#define LED_POWER 	 0x09
+//#define TTS_ENABLE 0x0A
+//#define WAKE_UP 	 0x0B
+//#define AIR780E_ENBALE 0x0C
+//#define SOS_ENBALE 0x0D
+//#define GPS_BACKUP 0x0E
+//#define GPS_POWER  0x0F
+//#define MAIN_RI    0x10
+void PCA9555_Close_Power()
+{
+    PCA9555_Set_One_Value_Output(MCU_A,0);
+    PCA9555_Set_One_Value_Output(CHG_G,0);
+    PCA9555_Set_One_Value_Output(LORA_IRQ,0);
+    PCA9555_Set_One_Value_Output(LORA_NRST,0);
+    PCA9555_Set_One_Value_Output(ADC_MINIUS,0);
+    PCA9555_Set_One_Value_Output(INPUT_5V,0);
+//    PCA9555_Set_One_Value_Output(PWR_ON,0);
+    PCA9555_Set_One_Value_Output(PWR_ENABLE,0);
+
+    PCA9555_Set_One_Value_Output(LED_POWER,0);
+    PCA9555_Set_One_Value_Output(TTS_ENABLE,0);
+    PCA9555_Set_One_Value_Output(WAKE_UP,0);
+    PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0);
+    PCA9555_Set_One_Value_Output(SOS_ENBALE,0);
+    PCA9555_Set_One_Value_Output(INPUT_5V,0);
+    PCA9555_Set_One_Value_Output(GPS_POWER,0);
+    PCA9555_Set_One_Value_Output(GPS_BACKUP,0);
+    PCA9555_Set_One_Value_Output(MAIN_RI,0);
+    
+    delay_ms(200);
+    PCA9555_Set_One_Value_Output(PWR_ON,0);    
+}
+
+//void PCA9555_low_power_consumption()
+//{
+////    PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0);
+//    PCA9555_Set_One_Value_Output(GPS_POWER,0);
+//    PCA9555_Set_One_Value_Output(GPS_BACKUP,0);
+//    
+//}

--
Gitblit v1.9.3