-
IIC协议
IIC
总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号。
//起始位,停止位,数据位,速度这些信号中,起始信号是必需的,结束信号和应答信号
void i2c_start()
{
SCL=1;
SDA=1;
_nop_();
SDA=0;
_nop_();
}
void i2c_Stop()
{
SCL=1;
SDA=0;
_nop_();
SDA=1;
_nop_();
}
应答信号
应答信号:发送器每发送一个字节(8
个
bit
),就在时钟脉冲
9
期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平时,规定为有效应答位(
ACK
,简称应答位),表示接收器已经成功地接收了该字节;
应答信号为高电平时,规定为非应答位(
NACK
),一般表示接收器接收该字节没有成功。
char I2C_ACK()
{
char flag;
SCL=1;
_nop_();
SDA=1;
_nop_();
flag =SDA;
_nop_();
SCL=0;
return flag;
}
数据发送的时序:
IIC 的数据读取 SCL为高 时产生,SCL为低时是数据改变,所以SDA如何变化都不影响读取。所以,传输数据的过程中,当SCL为高时,数据应当保持稳定,避免数据的采集出错。
void IIC_Send_Byte(char dataSend)
{
int i;
for(i = 0;i<8;i++){
scl = 0;//scl拉低,让sda做好数据准备
sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda
_nop_();//发送数据建立时间
scl = 1;//scl拉高开始发送
_nop_();//数据发送时间
scl = 0;//发送完毕拉低
_nop_();//
dataSend = dataSend << 1;
}
}