找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4957|回复: 1
收起左侧

I2C通信协议时序解读

[复制链接]
ID:85681 发表于 2015-7-15 02:14 | 显示全部楼层 |阅读模式

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;
}




回复

使用道具 举报

ID:94642 发表于 2019-12-13 15:25 | 显示全部楼层
楼主好人,很有帮助,多谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表