IIC有两根线:时钟线和数据线
时钟线控制接受和发送。0:写,1:读。
IIC读写数据:
低电平写8位数据或一个应答位
高电平读。
通常情况下,时钟信号在低电平。
开始阶段(中间要有5us延时):D1C1D0C0
结束阶段(中间要有5us延时):C0D0C1D1
发送8位数据:低电平发,发完延时一会,再让时钟线变为高电平,之后再变为低电平
接受8位数据:时钟线变为高电平,延时一会,读取数据,延时一会,时钟线变为低电平。
void IIC_Start(void)
{
SDA_OUT();
SDA(1);
delay_1us(5);
SCL(1);
delay_1us(5);
SDA(0);
delay_1us(5);
SCL(0);
delay_1us(5);
}
void IIC_Stop(void)
{
SDA_OUT();
SCL(0);
delay_1us(5);
SDA(0);
delay_1us(5);
SCL(1);
delay_1us(5);
SDA(1);
delay_1us(5);
}
void IIC_Send_Ack(unsigned char ack)
{
SDA_OUT();
SCL(0);
if(!ack)
{
SDA(0);
}
else
{
SDA(1);
}
SCL(1);
delay_1us(5);
SCL(0);
}
unsigned char IIC_Wait_Ack(void)
{
char ack = 0;
unsigned char ack_flag = 10;
SDA_IN();
SDA(1);
delay_1us(5);
SCL(1);
delay_1us(5);
while(ack_flag--)
{
if(GETSDA()==0)
{
break;
}
}
if(ack_flag==0)
{
ack=1;
}
SDA_OUT();
SCL(0);
delay_1us(5);
return ack;
}
void IIC_Write(unsigned char dat)
{
int i=0;
SDA_OUT();
SCL(0);
for(i=0;i<8;i++)
{
if(dat&(0x80>>i))
{
SDA(1);
}
else
{
SDA(0);
}
delay_1us(5);
SCL(1);
delay_1us(5);
SCL(0);
delay_1us(5)
}
}
unsigned char IIC_Read(void)
{
unsigned char i,receive =0;
SDA_IN(); //SDA设置输入
for(i=0;i<8;i++)
{
SCL(1);
delay_1us(5);
if(GETSDA())
{
receive |= (0x80>>i);
}
delay_1us(5);
}
return receive;
}