#include "i2c.h"
|
#include "delay.h"
|
#include "gpio.h"
|
#include "lcd_io_api.h"
|
#include "main.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
|