标题:
I2C通信协议时序解读
[打印本页]
作者:
benbens
时间:
2015-7-15 02:14
标题:
I2C通信协议时序解读
void IIC_Strat(void) //起始条件
{
SDA=1; /*当SCL为高电平时SDA的下降沿(从高到低)--START*/
SCL=1;
SDA=0;
SCL=0;
}
void IIC_Stop(void) //终止条件
{
SDA=0; /*当SCL为高电平时SDA的上降沿(从高到低)--STOP*/
SCL=1;
SDA=1;
SCL=0;
}
/*接收器拉低SDA线表示应答,并在应答脉冲期间保持稳定的低电平。当主器件作接收器时,必须发出数据传输结束的信号给发送器,即它在最后一个字节之后的应答脉冲期间不会产生应答信号(不拉低SDA)。这种情况下,发送器必须释放SDA线为高以便产生停止条件*/
void IIC_Ack(void) //主器件接收应答
{
SDA=0;
SCL=1;
SDA=1;
}
void IIC_NoAck(void) //主器件接收非应答
{
SDA=1;
SCL=1;
SDA=0;
}
void IIC_WriteByte(uchar date) //单字节写
{
uchar i;
for(i=0;i<8;i++)
{
if((date<<i)&0x80) SDA=1;
else SDA=0;
SCL=1;
SCL=0;
}
SDA=1;
SCL=1;
if(SDA==0) ack=1; /*从器件应答,接收器在收到一个字节后就会产生一个应答信号(拉低SDA),这里是检测接收器是否收到数据*/
else ack=0;
SCL=0;
}
bit IIC_PegeWrite(uchar add,uchar add_x,uchar *str,uchar num) //页写
{
uchar i;
IIC_Strat();
IIC_WriteByte(add);
if(ack==0) return 0; //从器件应答信号
IIC_WriteByte(add_x);
if(ack==0) return 0;
for(i=0;i<num;i++)
{
IIC_WriteByte(*str);
if(ack==0) return 0;
str++;
}
IIC_Stop();
return 1;
}
/*在读操作中小编采用的是"序列读(Sequential Read)",但在"序列读"中采用的是通过"随机读(Random Read)"启动的,也可以尝试采用"当前地址读"*/
uchar IIC_ReadByte(void) //单字节读
{
uchar i;
uchar value;
SDA=1;
for(i=0;i<8;i++)
{
SCL=0;
SCL=1;
value<<=1;
if(SDA) value|=0x01;
}
SCL=1;
return value;
}
bit IIC_SequenceRead(uchar add,uchar add_x,uchar *str,uchar num) //顺序读
{
uchar i;
IIC_Strat();
IIC_WriteByte(add);
if(ack==0) return 0;
IIC_WriteByte(add_x);
if(ack==0) return 0;
IIC_Strat();
IIC_WriteByte(add+1);
if(ack==0) return 0;
for(i=0;i<num-1;i++)
{
*str=IIC_ReadByte();
IIC_Ack(); //主器件应答
str++;
}
*str=IIC_ReadByte();
IIC_NoAck(); //主器件非应答
IIC_Stop();
return 1;
}
作者:
917106794
时间:
2019-12-13 15:25
楼主好人,很有帮助,多谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1