软件模拟IIC稳定可靠

#define I2C_SCL_H Hal_Vic_GpioOutput(GPIO_IDX_10, 1) 
#define I2C_SCL_L Hal_Vic_GpioOutput(GPIO_IDX_10, 0)
#define I2C_SDA_H Hal_Vic_GpioOutput(GPIO_IDX_11, 1)
#define I2C_SDA_L Hal_Vic_GpioOutput(GPIO_IDX_11, 0)

#define SDA_STATUS Hal_Vic_GpioInput(GPIO_IDX_11)

#define I2C_WR 0x80    //地址+写
#define I2C_RD 0x81    //地址+读


void I2C_SDA_OUT(void){    }

void I2C_SDA_IN(void){    }

void I2C_Start(void)
{
I2C_SDA_OUT();
I2C_SDA_H;
delayI2C();
I2C_SCL_H;
delayI2C();
I2C_SDA_L;
delayI2C();      
I2C_SCL_L;
delayI2C();  

}

void I2C_Stop(void)
{
I2C_SDA_OUT();
I2C_SCL_L;
delayI2C();
I2C_SDA_L;
delayI2C();  
I2C_SCL_H;
delayI2C();
I2C_SDA_H;
delayI2C();

}

void I2C_Ack(void)
{
I2C_SCL_L;
I2C_SDA_OUT();
I2C_SDA_L;
delayI2C();
I2C_SCL_H;
delayI2C();
I2C_SCL_L;
delayI2C();
}

void I2C_NAck(void)
{
I2C_SCL_L;
I2C_SDA_OUT();
I2C_SDA_H;
delayI2C();
I2C_SCL_H;
delayI2C();
I2C_SCL_L;
delayI2C();

}

unsigned char I2C_Wait_Ack(void)
{
unsigned char tempTime=0;
I2C_SDA_IN();
I2C_SDA_H;
I2C_SCL_L;
delayI2C();
while(SDA_STATUS)
{
tempTime++;
if(tempTime>250)
{
I2C_Stop();
return 1;
}  
}
I2C_SCL_H;
delayI2C();
I2C_SCL_L;
delayI2C();
return 0;

}

void I2C_Send_Byte(unsigned char txd)
{
unsigned char i=0;
I2C_SDA_OUT();
I2C_SCL_L;
delayI2C();
for(i=0;i<8;i++)
{
if((txd&0x80)>0)
I2C_SDA_H;
else
I2C_SDA_L;
txd<<=1;
I2C_SCL_H;
delayI2C();
I2C_SCL_L;
delayI2C();
}

}

unsigned char I2C_Read_Byte(unsigned char ack)
{
   unsigned char i=0,receive=0;
   I2C_SDA_IN();
   for(i=0;i<8;i++)
   {
    I2C_SCL_L;
delayI2C();
I2C_SCL_H;
receive<<=1;
if(SDA_STATUS)
receive++;
delayI2C();
   }
I2C_SCL_L;
delayI2C();
if(ack==0)
I2C_NAck();
else
I2C_Ack();
return receive;

}


uint8_t Read_TouchKey_Data(void)
{
  uint8_t i,check=0;
  uint8_t packet[10]={0};

  I2C_Start();
  I2C_Send_Byte(I2C_WR);//I2C_WR   I2C_RD
  I2C_Wait_Ack();
  I2C_Send_Byte(0x02);//字节数
  I2C_Wait_Ack();
  I2C_Send_Byte(0x01);//指令
  I2C_Wait_Ack();
  I2C_Send_Byte(0x83);//校验
  I2C_NAck();
  I2C_Stop();
/
  delay_us(3);//

  I2C_Start();
  I2C_Send_Byte(I2C_RD);//I2C_WR   I2C_RD
  I2C_Wait_Ack();
  //delay_us(25);
  for(i=0;i<5;i++)
  {
    packet[i]=I2C_Read_Byte(1);
//    delayAck();
  }
  packet[5]=I2C_Read_Byte(0);
//  delayAck();

  I2C_Stop();

}











  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值