I2C通信原理

I2C通信原理
一、
I2C的时序是比较复杂的,你如果能把I2C的时序弄清,那其他器件的时序都不成问题了。
我就按照我的理解来跟你讲吧。
直接用程序来说明吧。
NOP(),一个机器周期时间的延迟,12M晶振时为1微秒
NOPS(),4个NOP()。
sbit SDA P2^0;
sbit SCL P2^1; 定义数据线和时钟线接口
首先,I2C有2个重要的线,SDA数据线SCL时钟线,当总线上没有进行信息传送时,SDA和SCL都为高电平,我们称之为释放总线。
开始传送信息时,要有一个开始信号
开始信号 :定义为在SCL为高电平的时候,SDA从高电平拉低。
start()
{
  SDA=1; 
  NOP();    //同你图中 SDA/SCL上升/下降所用时间 1US
  SCL=1; 
  NOPS();    //建立开始信号(同你图中TSU起始信号建立时间一样4US)
  SDA=0;    //SDA拉低
  NOPS();
  SCL=0;    //SCL拉低, 钳住总线,准备发送或接收数据
  NOP();财务信息化
}
结束信号:与开始信号相反,在SCL为高电平时,SDA从低拉高
stop()
{
  SDA=0;
  NOP();
  SCL=1;
  NOPS();  //建立信号时间
  SDA=1;    //拉高 结束。
  NOPS();
}
我晕,发现写了半天还有好多。。算了 帮人帮到底了
发送/接收一个数据:数据的发送和接收都是在SCL为低电平的时候发生,因为SCL为高电平时已给了开始和结束信号。发送数据时,当数据准备读入时,将SCL线暂时拉高(SCL为高时,SDA无法改变状态),保持一段时间然后拉低(同你图中的TDH,数据输出保持时间),这时数据则发送完毕到SDA上。接收则与之大同小异。当SDA线上有数据过来时,先将SCL拉高,建立好时间,然后拉低,数据则被读入。(关于如何被发出以及如何被读入则是芯片做的事,我们不用管,只需记住SCL拉低,数据发出/读入)
用程序来讲就是:
send(uchar c)        //发送一个字节
{
  uint i;
  for(i=0;i<8;i++)      //该字节8位从高往低发送
    {
      if((c<<i)&0x80) SDA=1;
        else SDA=0;
        NOP();
      SCL=1;        //建立信号时间
      NOPS();
      SCL=0;        //发送完毕
    }
}
recieve()
{
  uchar r;uint i;
  r=0;SDA=1;
  for(i=0;i<8;i++)    //读取8位数据
    {
      NOP();
      SCL=0;
      NOPS();
      SCL=1;
紫光任务
      NOP();
      r<<=1;
      if(SDA==1) r+=1;
      NOP();
    }
    SCL=0;
    NOP();
    return (r);
}
程序可能有点难懂,不过没关系,使用I2C时候,直接调用写好的程序,如我写的 start.stop.send receive 等,这些程序应该有现成的。
发送一个字节后会有一个应答函数,应答函数定义为,当发送完一个字节也就是8位的时候,如果这是SDA为低电平,则为有应答,反之则无。如果要发送多个字节,一个字节发
完后需要一个应答函数才能继续发下面一个字节。程序也就大同小异。掌握好时序就行了。
太极解I2C用的最多的就是E2PROM了。
给你举个例子
如果我想往E2PROM的0x50单元写一个‘a’,则我这样写:
start();    //开始
send(0xa0);  //选择我要发送的器件。0xa0为E2PROM的器件地址
answer();    //应答
send(0x50);  //选择E2PROM中的0X50地址单元
answer();    //应答
send('a');  //发送数据‘a’
stop();      //停止
摒弃复杂的情况,这里只对I2C做简单的介绍。
一、I2C 总线的一些特征:
• 只要求两条总线线路一条串行数据线SDA 一条串行时钟线SCL
• 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器
• 它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏
• 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s
• 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整
• 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制甲醛酯
 
二、I2C总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL毛绍烈为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据 
起始和结束:
bool I2C_Start(void)
{
 SDA_H;
 SCL_H;
 I2C_delay();
 if(!SDA_read)return FALSE; // SDA线为低电平则总线忙,退出 生态文明体制改革总体方案
 SDA_L;                      // 拉低SDA线(当SCL为高电平时,SDA由高电平向低电平跳变表示开始信号)
 I2C_delay();

本文发布于:2024-09-21 23:35:01,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/399061.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:I2C串口
标签:总线   数据   信号   发送   开始   程序   低电平
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议