void I2CSDASetOut(void)
{
RTC_SDA_IO_FUNC_GIO();
RTC_SDA_IO_DIR_OUT();
}
void I2CSDASetIn(void)
{
RTC_SDA_IO_FUNC_GIO();
RTC_SDA_IO_DIR_IN();
HAL_SDA_IO_IMODE_TRISTATE();
}
void I2CSDABitSet(void)
{
SDA=1;
}
void I2CSDABitClear(void)
{
SDA=0;
}
void I2CSCLBitSet(void)
{
SCL=1;
}
void I2CSCLBitClear(void)
{
SCL=0;
}
int I2C_Start(void)
{
//SCL高时 SDA产生低跳变
I2CSCLBitSet();
I2CSDABitSet();
I2C_delay(12);
//if(!GPIO_ReadInputDataBit) return FALSE
I2CSDABitClear();
I2C_delay(13);
I2CSCLBitClear();
//if(GPIO_ReadInputDataBit) return FALSE
//GPIO_ResetBits(I2C2_PORT,I2C2_SDA);
I2C_delay(12);
return 1;
}
void I2C_Stop(void)
{
//SCL 高时SDA产生高跳变
//GPIO_ResetBits(I2C2_PORT,I2C2_SCL);
I2CSDABitClear();
I2CSCLBitClear();
I2C_delay(15);
I2CSCLBitSet();
//GPIO_ResetBits(I2C2_PORT,I2C2_SDA);
I2C_delay(15);
I2CSDABitSet();
//GPIO_SetBits(I2C2_PORT,I2C2_SCL);
I2C_delay(15);
//GPIO_SetBits(I2C2_PORT,I2C2_SDA);
//I2C_delay(30);
}
void I2C_Ack(void)
{
//GPIO_ResetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitClear();
I2C_delay(5);
//GPIO_ResetBits(I2C2_PORT,I2C2_SDA);
I2CSDABitClear();
I2C_delay(20);
//GPIO_SetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitClear();
I2C_delay(12);
//GPIO_ResetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitClear();
I2C_delay(13);
}
void I2C_NAck(void)
{
//GPIO_ResetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitClear();
I2C_delay(5);
//GPIO_SetBits(I2C2_PORT,I2C2_SDA);
I2CSDABitSet();
I2C_delay(20);
//GPIO_SetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitSet();
I2C_delay(12);
//GPIO_ResetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitClear();
I2C_delay(13);
}
int I2C_WaitACK(void)
{
//GPIO_ResetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitClear();
I2C_delay(5);
//GPIO_SetBits(I2C2_PORT,I2C2_SDA);
I2CSDABitSet();
I2C_delay(15);
//GPIO_SetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitSet();
I2C_delay(15);
//if(GPIO_ReadInputDataBit()!==0)
if(!SDA)
{
//GPIO_ResetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitClear();
I2C_delay(10);
return 1;
}
//GPIO_ResetBits(I2C2_PORT,I2C2_SCL);
I2CSCLBitClear();
I2C_delay(10);
return 0;
}
void I2C_SendByte(u8 Data)
{
u8 i=8;
while(i--)
{
I2CSCLBitClear();
I2C_delay(10);
if(Data&0x80)
I2CSDABitSet();
else I2CSDABitClear();
I2C_delay(15);
I2CSCLBitSet();
Data=Data<<1;
I2C_delay(25);
}
I2CSCLBitClear();
}
u8 I2C_readByte( void )
{
u8 i=8;
u8 Data=0x00;
while(i--)
{
Data=Data<<1;
I2CSCLBitClear();
I2C_delay(20);
I2CSCLBitSet();
I2C_delay(10);
if(SDA)
Data|=0x01;
else Data&=0xfe;
I2C_delay(20);
}
I2CSCLBitClear();
return Data;
}
int I2C_WriteData(u8 SlaveAddr,u8 RegAddr,u8 Data)
{
u8 RSlaveAddr=SlaveAddr|I2C_Write_Direction_MASK;
I2CSDASetOut();
if (!I2C_Start()) return 0;
I2C_SendByte(RSlaveAddr);
I2CSDASetIn();
if(!I2C_WaitACK()) {I2CSDASetOut();I2C_Stop();return 0;}
I2CSDASetOut();
I2C_SendByte(RegAddr);
I2CSDASetIn();
if(!I2C_WaitACK()) {I2CSDASetOut();I2C_Stop();return 0;}
I2CSDASetOut();
I2C_SendByte(Data);
I2CSDASetIn();
if(!I2C_WaitACK()) {I2CSDASetOut();I2C_Stop();return 0;}
else {I2CSDASetOut();I2C_Stop();return 1;}
}
int I2C_ReadData(u8 SlaveAddr,u8 RegAddr,u8 * Data)
{
u8 RSlaveAddr=SlaveAddr|I2C_Write_Direction_MASK;
I2CSDASetOut();
if (!I2C_Start()) return 0;
I2C_SendByte(RSlaveAddr);
I2CSDASetIn();
if(!I2C_WaitACK()) {I2CSDASetOut();I2C_Stop();return 0;}
I2CSDASetOut();
I2C_SendByte(RegAddr);
I2CSDASetIn();
if(!I2C_WaitACK()) {I2CSDASetOut();I2C_Stop();return 0;}
I2CSDASetOut();
if (!I2C_Start()) {I2CSDASetOut();I2C_Stop();return 0;}
RSlaveAddr=SlaveAddr|I2C_Read_Direction_MASK;
I2C_SendByte(RSlaveAddr);
I2CSDASetIn();
if(!I2C_WaitACK()) {I2CSDASetOut();I2C_Stop();return 0;}
*Data= I2C_readByte();
I2CSDASetOut();
I2C_NAck();
I2C_Stop();
return 1;
}
I2C开始条件:SCL为高时SDA产生低跳变
I2C结束条件:SCL为高时SDA产生高挑变
ACK NACK WAITACK 根据时序来