yincheng.zhong
2 天以前 2ebb8217f43b69f491620423ea4d5d5944d1f91d
keil/include/drivers/PCA9555.c
@@ -12,7 +12,7 @@
    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);
@@ -29,8 +29,8 @@
//      delay_us(10);
//    SDA_0;//START:when CLK is high,DATA change form high to low
//    delay_us(10);
   //      IIC2_SDA_OUT();     //sda线输出
    //      IIC2_SDA_OUT();     //sda线输出
    SDA_1;
//      delay_us(10);
    SCL_1;
@@ -41,31 +41,31 @@
}
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
//
//
//    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;//7发送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;//7发送I2C总线结束信号
    delay_us(10);
}
//等待应答信号到来
//返回值:1,接收应答失败
@@ -73,16 +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设置为输入等待接收端的应答信号
    SDA_1;
   delay_us(6);
   SCL_1;
  delay_us(6);
//  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)
    {
@@ -90,14 +90,14 @@
        if(ucErrTime>250)
        {
            IIC2_pca_Stop();
                  gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1);
            gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1);
            return 1;
        }
    }
    gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 0);
    SCL_0;//时钟输出0
    return 0;
}
//产生ACK应答
void IIC2_pca_send_Ack(void)
@@ -106,8 +106,8 @@
    SDA_0;//读取SDA电平为低则有应答
    delay_us(10);
    SCL_1;
      delay_us(10);
      SCL_0;
    delay_us(10);
    SCL_0;
}
//不产生ACK应答
void IIC2_pca_send_NAck(void)
@@ -116,8 +116,8 @@
    SDA_1;//读取SDA电平为高则无应答信号
    delay_us(10);
    SCL_1;
      delay_us(10);
      SCL_0;
    delay_us(10);
    SCL_0;
}
//IIC发送一个字节,WRITE
//返回从机有无应答
@@ -156,7 +156,7 @@
uint8_t IIC2_Read_pca_Byte(unsigned char ack)
{
    unsigned char i,receive=0,bit=0;
      gpio_pin_set_dir(SDA_PIN,GPIO_DIR_IN,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++ )
    {
@@ -164,19 +164,19 @@
        delay_us(6);//修改时间
        SCL_1;
        //receive<<=1;
        if(IIC2_READ_SDA){
               bit=1<<i;
               receive|=bit;
            }
        if(IIC2_READ_SDA) {
            bit=1<<i;
            receive|=bit;
        }
        delay_us(5);
    }
      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
      }
    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
@@ -196,17 +196,17 @@
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);
     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_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();
@@ -232,45 +232,45 @@
//    IIC2_Stop();//产生一个停止条件
*/
int temp_ack,temp_ack1,temp_ack2;
 uint8_t temp=0;
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);
     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 & 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);
     temp_ack2=IIC2_Wait_pca_Ack();
    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();
    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();
@@ -290,10 +290,10 @@
  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[1]=   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第二层驱动,可辅助逻辑不破坏最底层驱动,该函数默认配置输出寄存器
@@ -302,10 +302,10 @@
  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[1]=   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表示第一个芯片地址
@@ -313,10 +313,10 @@
  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;
{
    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第二层驱动,可辅助逻辑不破坏最底层驱动
@@ -325,7 +325,7 @@
*/
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表示第一个芯片地址
@@ -333,7 +333,7 @@
*/
void PCA9555_readdata_from_output_register(unsigned char addr,unsigned char* pBuffer)
{
      IIC_Read_Pca9555(addr,PCA9555_REG_OUT0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
    IIC_Read_Pca9555(addr,PCA9555_REG_OUT0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
}
/*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动
  addr     芯片地址,0x40表示第一个芯片地址
@@ -341,7 +341,7 @@
*/
void PCA9555_readdata_from_polarity_register(unsigned char addr,unsigned char* pBuffer)
{
      IIC_Read_Pca9555(addr,PCA9555_REG_POL0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
    IIC_Read_Pca9555(addr,PCA9555_REG_POL0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
}
/*读pca9555第二层驱动,可辅助逻辑不破坏最底层驱动
  addr     芯片地址,0x40表示第一个芯片地址
@@ -349,7 +349,7 @@
*/
void PCA9555_readdata_from_config_register(unsigned char addr,unsigned char* pBuffer)
{
      IIC_Read_Pca9555(addr,PCA9555_REG_CFG0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
    IIC_Read_Pca9555(addr,PCA9555_REG_CFG0,pBuffer,2);//2为读出芯片数据组数,9555为2组,全部读出
}
///*配置芯片的对应管脚输入输出功能
//  addr    芯片地址,0x40表示第一个芯片地址
@@ -357,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地址
//}
@@ -368,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
@@ -385,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);//赋值位高
@@ -407,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{//超出芯片控制
@@ -418,42 +418,42 @@
  num    控制的IO序号 1~17
  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)
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
    }
    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 电平
@@ -479,13 +479,15 @@
{
    if(input5v_time)
    {
        input5v_time=0;
        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;}
        {
            return 0;
        }
        if(INPUT_5V_POSITION&gpio_state)
        {
            Set5VState(1);
@@ -499,9 +501,9 @@
    }
    else {
        Set5VState(0);
      return 0;
   }
        return 0;
    }
}
/*读取供电引脚的输入高低电平
  返回值 高1 低0 电平
@@ -509,82 +511,82 @@
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;
   }
    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;
   }
{   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,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_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(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_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_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);//全部拉低
@@ -596,53 +598,53 @@
void move_handler()
{
    nomove_count=0;
      if(deep_sleep_falg==0)
      {
     deep_sleep_falg=1;
//      sleep_timer_start();
     NVIC_SystemReset();
      }
    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];
    uint16_t gpio_state;
    gpio_state=(uint16_t)pca9555writedata_input[0]<<8|pca9555writedata_input[1];
           if(WAKE_UP_POSITION&gpio_state)
            {
    if(WAKE_UP_POSITION&gpio_state)
    {
             //移动
               nomove_count=0;
               if(deep_sleep_falg==0)
               {
                deep_sleep_falg=1;
//           NVIC_SystemReset();
                sys_reset(0);
               }
//
             test51++;
            }
        //移动
        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))
         {
    if((PWR_ON_POSITION&gpio_state))
    {
        PowerTask();
        test31++;
         }
         if(!(SOS_ENBALE_POSITION&gpio_state))
         {
    }
    if(!(SOS_ENBALE_POSITION&gpio_state))
    {
        UserKeyTask();
        test21++;
         }
    }
}