#include "i2c.h" #include "delay.h" #include "gpio.h" #include "lcd_io_api.h" #include "low_pwr_test.h" #include "devicegpioinit.h" //Èí¼þI2C #if SOFT_OR_HARD /****************************************************************************** * ´ËΪÈí¼þÄ£ÄâI2C * *----------------------------------------------------------------------------- * ĿǰLCDÏÔʾÆÁºÍÍⲿRTC¹²ÓÃÒý½Å * * *****************************************************************************/ void I2c_Scl_Gpio_Init(void) { CMU_PERCLK_SetableEx(PADCLK, ENABLE); //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý OutputIO(LCD_RTC_I2C_SCL_GPIO_PORT,LCD_RTC_I2C_SCL_PIN,OUT_PUSHPULL); I2C_SCL_L; } /******************************************************************************* * º¯ Êý Ãû : Sda_Out() * º¯Êý¹¦ÄÜ : SDA ÉèÖÃΪÊä³ö * Êä Èë : ÎÞ * Êä ³ö : ÎÞ *******************************************************************************/ void Sda_Out(void) { /*±ê×¼¿âʹÓã¬Ð޸Ķ˿ÚÒý½Å¿ÉÓà GPIO_InitTypeDef GPIO_InitTypeStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_7; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitTypeStruct); */ CMU_PERCLK_SetableEx(PADCLK, ENABLE); //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý OutputIO(LCD_RTC_I2C_SDA_GPIO_PORT,LCD_RTC_I2C_SDA_PIN,OUT_PUSHPULL); } /******************************************************************************* * º¯ Êý Ãû : Sda_In * º¯Êý¹¦ÄÜ : SDA ÉèÖÃΪÊäÈë * Êä Èë : ÎÞ * Êä ³ö : ÎÞ *******************************************************************************/ void Sda_In(void) { /*±ê×¼¿âʹÓã¬Ð޸Ķ˿ÚÒý½Å¿ÉÓà GPIO_InitTypeDef GPIO_InitTypeStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_7; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitTypeStruct); */ CMU_PERCLK_SetableEx(PADCLK, ENABLE); //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý InputtIO(LCD_RTC_I2C_SDA_GPIO_PORT,LCD_RTC_I2C_SDA_PIN,IN_NORMAL); } /******************************************************************************* * º¯ Êý Ãû : i2c_stare * º¯Êý¹¦ÄÜ : iic¿ªÊ¼ÐźÅ,SCL¸ßµçƽʱ£¬SDA³öÏÖÒ»¸öÏÂÌøÑØ±íʾÆô¶¯ÐźŠ* Êä Èë : ÎÞ * Êä ³ö : ÎÞ *******************************************************************************/ void I2c_Start(void) { /* _____ *SDA \_____________ * __________ *SCL \________ */ // I2c_Scl_Awaken_Init(); I2c_Scl_Gpio_Init(); Sda_Out(); I2C_SDA_H; I2C_SCL_H; delay_us(4); I2C_SDA_L;//Æô¶¯¿ªÊ¼ÐźŠdelay_us(4); I2C_SCL_L;//ǯסI2C×ÜÏߣ¬×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý } /******************************************************************************* * º¯ Êý Ãû : i2c_stop * º¯Êý¹¦ÄÜ : iicÍ£Ö¹ÐźÅ,SCL¸ßµçƽʱ£¬SDA³öÏÖÒ»¸öÉÏÌøÑØ±íʾֹͣÐźŠ* Êä Èë : ÎÞ * Êä ³ö : ÎÞ *******************************************************************************/ void I2c_Stop(void) { /* _______ *SDA __________/ * ____________ *SCL _____/ */ Sda_Out();//SDAÏßÊä³ö I2C_SCL_L; // delay_us(4); I2C_SDA_L;//·¢ËͽáÊøÌõ¼þµÄÊý¾ÝÐźŠdelay_us(4); I2C_SCL_H; delay_us(4);//½áÊøÌõ¼þ½¨Á¢Ê±¼ä´óÓÚ4¦Ì I2C_SDA_H;//·¢ËÍI2C×ÜÏß½áÊøÐźŠdelay_us(4); } /******************************************************************************* * º¯ Êý Ãû : i2c_send * º¯Êý¹¦ÄÜ : iic·¢ËÍÊý¾Ý * Êä Èë : uint8_t dat,Òª·¢Ë͵ÄÊý¾Ý * Êä ³ö : ÎÞ *******************************************************************************/ void I2c_Send(uint8_t dat) { unsigned char temp; Sda_Out(); for(temp=0x80;temp!=0;temp>>=1) { if((temp & dat)== 0) I2C_SDA_L; else I2C_SDA_H; delay_us(1); I2C_SCL_H; delay_us(4); I2C_SCL_L; } delay_us(4); I2C_SCL_H; delay_us(4); I2C_SCL_L; // for(temp = 0; temp < 8; temp++) // { // if(dat & 0x80) // { // I2C_SDA_H; // } // else // { // I2C_SDA_L; // } // delay_us(10); // I2C_SCL_H; // delay_us(10); // I2C_SCL_L; // dat <<= 1; // delay_us(10); // } } /******************************************************************************* * º¯ Êý Ãû : i2c_read * º¯Êý¹¦ÄÜ : iic½ÓÊÕÊý¾Ý * Êä Èë : ÎÞ * Êä ³ö : ÎÞ *******************************************************************************/ uint8_t I2c_Read(void) { unsigned char temp; unsigned char dat; I2C_SDA_H;//ÊÍ·Å×ÜÏß×¼±¸½ÓÊÕ Sda_In(); for(temp=0x80;temp!=0;temp>>=1) { I2C_SCL_H; delay_us(1); if(I2C_SDA_READ == 1) dat|=temp; else dat&=~temp; I2C_SCL_L; delay_us(4); } // for(temp = 0; temp < 8; temp++) // { // dat <<= 1; // I2C_SCL_H; // delay_us(10); // if(I2C_SDA_READ) // { // dat|= 1; // } // I2C_SCL_L; // delay_us(10); // } return dat; } /******************************************************************************* * º¯ Êý Ãû : i2c_wit_ack * º¯Êý¹¦ÄÜ : iicµÈ´ýÓ¦´ð * Êä Èë : ÎÞ * Êä ³ö : 0/1£¬·µ»Ø1±íʾÎÞÓ¦´ðÐźţ¬·µ»Ø0±íʾӦ´ð *******************************************************************************/ char I2c_Wait_Ack(void) { uint32_t con=0; Sda_In(); I2C_SDA_H;//ÊÍ·ÅÊý¾ÝÏߣ¬×¼±¸½ÓÊÕÓ¦´ð delay_us(1); I2C_SCL_H;//CPUÇý¶¯SCL = 1, ´ËʱÆ÷¼þ»á·µ»ØACKÓ¦´ð delay_us(1); while(I2C_SDA_READ)//CPU¶ÁÈ¡SDA¿ÚÏß״̬ { con++; if(con > 500) { I2c_Stop(); return 1;//ÎÞÓ¦´ðÐźŠ} } I2C_SCL_L; delay_us(1); return 0;//ÓÐÓ¦´ð } /******************************************************************************* * º¯ Êý Ãû : i2c_ack * º¯Êý¹¦ÄÜ : iicÓ¦´ðÐźŠ* Êä Èë : ÎÞ * Êä ³ö : ÎÞ *******************************************************************************/ void I2c_Ack(void) { /* ____ *SCL ______/ \______ * ____ _____ *SDA \_______/ */ Sda_Out(); I2C_SDA_L; delay_us(1); I2C_SCL_H;//CPU²úÉú1¸öʱÖÓ delay_us(4);//ʱÖÓµÍµçÆ½ÖÜÆÚ´óÓÚ4¦Ì I2C_SCL_L;//ÇåʱÖÓÏߣ¬Ç¯×¡I2C×ÜÏßÒÔ±ã¼ÌÐø½ÓÊÕ delay_us(4); I2C_SDA_H;//CPUÊÍ·ÅSDA×ÜÏß } /******************************************************************************* * º¯ Êý Ãû : I2C_No_ack * º¯Êý¹¦ÄÜ : iic·ÇÓ¦´ðÐźŠ* Êä Èë : ÎÞ * Êä ³ö : ÎÞ *******************************************************************************/ void I2c_No_Ack(void) { /* ____ *SCL ______/ \______ * __________________ *SDA */ Sda_Out(); I2C_SDA_H; delay_us(1); I2C_SCL_H; delay_us(4); I2C_SCL_L; delay_us(4); } //Ó²¼þI2C #else void I2C_Init(I2C_Type* I2Cx) { I2Cx_Deinit(I2Cx); //¸´Î»I2C //I2CIO¿ÚÅäÖà CMU_PERCLK_SetableEx(PADCLK, ENABLE); //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý if(I2Cx == I2C0) { CMU_PERCLK_SetableEx(I2C0CLK, ENABLE); //I2C×ÜÏßʱÖÓʹÄÜ CMU_OPCCR1_I2C0CKE_Setable(ENABLE); //I2C¹¤×÷ʱÖÓʹÄÜ CMU_OPCCR1_I2C0CKS_Set(CMU_OPCCR1_I2C0CKS_APBCLK); AltFunIO( GPIOA, GPIO_Pin_14, ALTFUN_OPENDRAIN ); //PA14;//SCL AltFunIO( GPIOA, GPIO_Pin_15, ALTFUN_OPENDRAIN ); //PA15;//SDA } if(I2Cx == I2C1) { CMU_PERCLK_SetableEx(I2C1CLK, ENABLE); //I2C×ÜÏßʱÖÓʹÄÜ CMU_OPCCR1_I2C1CKE_Setable(ENABLE); //I2C¹¤×÷ʱÖÓʹÄÜ CMU_OPCCR1_I2C1CKS_Set(CMU_OPCCR1_I2C1CKS_APBCLK); AltFunIO( GPIOE, GPIO_Pin_5, ALTFUN_OPENDRAIN ); //PE5;//SCL AltFunIO( GPIOE, GPIO_Pin_6, ALTFUN_OPENDRAIN ); //PE6;//SDA } I2Cx_BRG_MSPBRGH_Set(I2Cx,(I2C_BaudREG_Calc( 100000, 12000000))<<16);//100k@8M I2Cx_BRG_MSPBRGL_Set(I2Cx,I2C_BaudREG_Calc( 100000, 12000000));//100k@8M I2Cx_TIMING_Write(I2Cx,I2Cx_BRG_MSPBRGL_Get(I2Cx)/2); NVIC_DisableIRQ(I2Cx_IRQn); } uint08 I2C_Send_Bit( I2C_Type* I2Cx,uint08 BIT_def ) { I2Cx_CFGR_MSPEN_Setable(I2Cx,ENABLE);//ʹÄÜI2Cµç· switch(BIT_def) { case STARTBIT: I2C_SEND_STARTBIT(I2Cx); while(RESET == I2Cx_ISR_S_Chk(I2Cx)); break; case RESTARTBIT: I2C_SEND_RESTARTBIT(I2Cx); while(RESET == I2Cx_ISR_S_Chk(I2Cx)); break; case STOPBIT: I2C_SEND_STOPBIT(I2Cx); while(RESET == I2Cx_ISR_P_Chk(I2Cx)); break; default: break; } return 0; //ok } uint08 I2C_Send_Byte(I2C_Type* I2Cx,uint08 x_byte ) { I2Cx_BUF_Write(I2Cx,x_byte);//д·¢ËÍ»º³å¼Ä´æÆ÷ while(!I2Cx_ISR_TXIF_Chk(I2Cx)); I2Cx_ISR_TXIF_Clr(I2Cx); //clr int flag if(!I2Cx_ISR_ACKSTA_Chk(I2Cx)) { return 0; } else { I2Cx_ISR_ACKSTA_Clr(I2Cx); return 1; } } uint08 I2C_Receive_Byte( I2C_Type* I2Cx,uint08 *x_byte ) { //i2c en, rcen I2Cx_CR_RCEN_Setable(I2Cx,ENABLE); while(!I2Cx_ISR_RXIF_Chk(I2Cx)); I2Cx_ISR_RXIF_Clr(I2Cx); *x_byte=I2Cx_BUF_Read(I2Cx); return 0; } #endif