
上图中,绿色代表起始信号,红色代表停止信号
//iic 起始信号
void iic_start(void)
{
sda = 1;
scl = 1;
iic_delay();
sda = 0;
iic_delay();
scl = 0;
}
//iic 停止信号
void iic_stop(void)
{
sda = 0;
scl = 0;
iic_delay();
scl = 1;
iic_delay();
sda = 1;
iic_delay();
}
// iic 写一个字节数据,返回值为应答信号,0:应答,1:非应答
uint8_t iic_sendbyte(uint8_t dat)
{
uint8_t mask;
uint8_t ack = 0;
for(mask=0x80;mask!=0;mask>>=1)
{
sda = (dat & mask)? 1 : 0;
iic_delay();
scl = 1;
iic_delay();
scl = 0;
}
sda = 1; //释放总线,准备接收应答
iic_delay();
scl = 1;
iic_delay();
ack = sda;
scl = 0;
return ack;
}
//iic 接收一个字节
uint8_t iic_recbyte(void)
{
uint8_t mask;
uint8_t dat = 0;
sda = 1; //释放总线,准备接收数据
for(mask=0x80;mask!=0;mask>>=1)
{
iic_delay();
scl = 1;
iic_delay();
if(sda)
dat |= mask;
scl = 0;
}
return dat;
}
//iic 应答信号,0:应答,1:非应答
void iic_ack(uint8_t ack)
{
sda = ack;
iic_delay();
scl = 1;
iic_delay();
scl = 0;
}
网友评论