#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_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_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); } void IIC2_pca_Start(void) { //// 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); SCL_1; // 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); } //²úÉú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); } //µÈ´ýÓ¦´ðÐźŵ½À´ //·µ»ØÖµ£º1£¬½ÓÊÕÓ¦´ðʧ°Ü // 0£¬½ÓÊÕÓ¦´ð³É¹¦ 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); // SDA_1; // delay_us(6); while(IIC2_READ_SDA) { ucErrTime++; 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, 0); SCL_0;//ʱÖÓÊä³ö0 return 0; } //²úÉúACKÓ¦´ð void IIC2_pca_send_Ack(void) { SCL_0; SDA_0;//¶ÁÈ¡SDAµçƽΪµÍÔòÓÐÓ¦´ð delay_us(10); SCL_1; delay_us(10); SCL_0; } //²»²úÉúACKÓ¦´ð void IIC2_pca_send_NAck(void) { SCL_0; SDA_1;//¶ÁÈ¡SDAµçƽΪ¸ßÔòÎÞÓ¦´ðÐźŠdelay_us(10); SCL_1; delay_us(10); SCL_0; } //IIC·¢ËÍÒ»¸ö×Ö½Ú,WRITE //·µ»Ø´Ó»úÓÐÎÞÓ¦´ð //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) { SDA_1; } else { SDA_0; } txd <<= 1; delay_us(10); SCL_1; delay_us(10); SCL_0; 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,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(6);//ÐÞ¸Äʱ¼ä SCL_1; //receive<<=1; if(IIC2_READ_SDA){ bit=1<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);//¸³ÖµÎ»¸ß // else pca9555writedata[2] &= ~(0x01<<(num - 17));//¸³ÖµÎ»µÍ // } // else{ // if(value)pca9555writedata[3] |= 0x01<<(num - 25);//¸³ÖµÎ»¸ß // else pca9555writedata[3] &= ~(0x01<<(num - 25));//¸³ÖµÎ»µÍ // } // PCA9555_writedata(PCA9555_REG_OUT1,pca9555writedata[2],pca9555writedata[3]); // } // else{//³¬³öоƬ¿ØÖÆ // //error // } } /*ÉèÖõÚÒ»¸öоƬijһͨµÀIOÊäÈë»òÊä³ö num ¿ØÖƵÄIOÐòºÅ 1~17 value ¿ØÖƵÄIOÊä³ö״̬ 0£ºÊä³ö 1£ºÊäÈë */ 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 } } /*ÉèÖõÚÒ»¸öоƬijһͨµÀĬÈÏÊäÈëµÄ¼«ÐÔ 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,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 // 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(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,1); // 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; void move_handler() { nomove_count=0; } 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) { //ÒÆ¶¯ move_handler(); 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++; } }