51单片机IO模拟I2C

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 根据时序来

 

posted @ 2013-03-17 17:19  天涯海角路  阅读(341)  评论(0)    收藏  举报