IIC通信协议总结[通俗易懂]

IIC通信协议总结[通俗易懂](1)概述I2C(Inter-IntegratedCircuit BUS)集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。经常IIC和SPI接口被认为指定是一种硬件设备,但其实这样的说法是不尽准确的,严格的说他们都是人们所定义的软硬结合体,分为物理层(四线结构)和协议层(主机,从

大家好,又见面了,我是你们的朋友全栈君。

(1)概述

I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。

经常IIC和SPI接口被认为指定是一种硬件设备,但其实这样的说法是不尽准确的,严格的说他们都是人们所定义的软硬结合体,分为物理层(四线结构)和协议层(主机,从机,时钟极性,时钟相位)。

IIC,SPI的区别不仅在与物理层,IIC比SPI有着一套更为复杂的协议层定义。下面来分别说明一下IIC的物理层和协议层。

(2)IIC的物理层

a.只要求两条总线线路,一条是串行数据线SDA,一条是串行时钟线SCL。(IIC是半双工,而不是全双工)。

b.每个连接到总线的器件都可以通过唯一的地址和其它器件通信,主机/从机角色和地址可配置,主机可以作为主机发送器和主机接收器。

c.IIC是真正的多主机总线,(而这个SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。

d.传输速率在标准模式下可以达到100kb/s,快速模式下可以达到400kb/s。

e.连接到总线的IC数量只是受到总线的最大负载电容400pf限制。

一个典型的IIC接口如下图(1)所示

IIC通信协议总结[通俗易懂]

图(1)

(3)IIC的协议层

IIC的协议层才是掌握IIC的关键。现在简单概括如下:

a.数据的有效性

在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。

如图(2)所示:

IIC通信协议总结[通俗易懂]

      图(2)

b.起始和结束条件

起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件,结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件,要注意起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。总线在起始条件之后,视为忙状态,在停止条件之后被视为空闲状态,对起始条件和结束条件的描述如下图(3)所示。

IIC通信协议总结[通俗易懂]

图(3)

c.应答

每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答,如图(4)所示。

IIC通信协议总结[通俗易懂]

图(4)

d.数据帧格式

I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。

在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。{
这里小编在驱动MPU6050模块的时候,就犯过这样的错误,它写的MPU6050从机地址是0x68,因为发送从机地址的时候,要加一位读写方向位,因为刚开始应该是向这个MPU6050里写从机里某个寄存器的地址,所以应该是7位地址   0x68(1101000)+二进制位0=11010000)也就是0xD0,表示要向该IIC设备里写东西,然后再紧接着写入IIC设备里的寄存器地址,而我直接写入了0x68,导致出错}每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。

在总线的一次数据传输过程中,可以有以下几种组合方式:
[1]

主机向从机发送数据,数据传送方向在整个传送过程中不变:

IIC通信协议总结[通俗易懂]

注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示
数据由从机向主机传送。
    A
表示应答(低电平),
A
非表示非应答(高电平)。
S
表示起始信号,
P
表示终止信号。

[2]主机在第一个字节后,立即从从机读数据:
IIC通信协议总结[通俗易懂]

[3]在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相:
IIC通信协议总结[通俗易懂]

一般情况下,[3]是比较常见的,比如MPU6050模块,

发送起始信号

等待从机应答

写一个从机地址+0(表示写),

等待从机应答

发送一个字节的MPU6050加速度存储寄存器地址,

等待从机应答

再发送一次起始信号

等待从机应答

写一个从机地址+1(表示读)

等待从机应答

读取MPU6050传感器数据

主机非应答

e.IIC信号的模拟

主机可以采用不带I2C总线接口的单片机,如80C51、AT89C2051等单片机,利用软件实现I2C总线的数据传送,即软件与硬件结合的信号模拟。即使是含有IIC硬件的单片机(如stm32 103系列)也有一定的缺陷,所以一般也会模拟IIC的时序。现将具体时间截图如下:
IIC通信协议总结[通俗易懂]
具体的程序代码如下:

//产生起始信号

void I2C_Start(void)

{

    I2C_SDA_OUT();//配置一下引脚,引脚设置为输出





I2C_SDA_H;//把数据线拉高


I2C_SCL_H;//把时钟线拉高


delay_us(5);//延时5微秒,要求大于4.7微秒


I2C_SDA_L;
//拉低,产生下降沿


delay_us(6);//这个过程大于4微秒


I2C_SCL_L;//最后一定要把这个时钟线拉低,因为只有时钟线拉低的时候才允许数据变化。

}

//产生停止信号

void I2C_Stop(void)

{

   I2C_SDA_OUT();

   I2C_SCL_L;

   I2C_SDA_L;

   I2C_SCL_H;

   delay_us(6);

   I2C_SDA_H;

   delay_us(6);

}

//主机产生应答信号ACK

void I2C_Ack(void)

{

   I2C_SCL_L;

   I2C_SDA_OUT();

   I2C_SDA_L;

   delay_us(2);

   I2C_SCL_H;

   delay_us(5);

   I2C_SCL_L;

}

//主机不产生应答信号NACK

void I2C_NAck(void)

{

   I2C_SCL_L;

   I2C_SDA_OUT();

   I2C_SDA_H;

   delay_us(2);

   I2C_SCL_H;

   delay_us(5);

   I2C_SCL_L;

}

//等待从机应答信号,我们只负责主机应答信号的产生,从机应答信号
//我们不控制。
//返回值:1 接收应答失败
//  0 接收应答成功
u8 I2C_Wait_Ack(void)
{

u8 tempTime=0;

I2C_SDA_IN(); //配置为上拉输入。

I2C_SDA_H; //主机释放数据总线,等待从机产生应答信号
delay_us(1);
I2C_SCL_H;
delay_us(1);
//等待从机对数据总线的操作。低电平代表应答
while(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
{

tempTime++;
//这个属于软件延时,不一定准确。
if(tempTime>250) //如果时间超时,没有应答就停止。
{

I2C_Stop();
return 1;  //没有响应的话返回1.
}  
}

I2C_SCL_L;
return 0; //如果有响应的话就返回0.
}





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130131.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何创建springboot项目[通俗易懂]

    如何创建springboot项目[通俗易懂]前言本片博客记录快速创建springboot工程的两种方式。一种是使用maven创建,一种是使用springinitializr创建。开发环境JDK1.8、IDEA、maven。SpringBoot优点可快速构建spring应用直接嵌入tomcat、jetty、undenrtow服务器(无须部署war文件)提供依赖启动器(starter)简化构建配置极大程度的自动化配置Spring和第三方库提供生产就绪功能,例如指标监控检测、外部检测极少代码生成和XML配置使用maven创建Spr

    2022年8月31日
    0
  • 地图的最佳路径分析[通俗易懂]

    地图的最佳路径分析[通俗易懂]Supermap的交通分析Supermap的交通分析对应的是实际地理信息系统中的最佳路径啦,最佳路径在实际的地理信息系统中会用到,而路径分析实际就是在指定的网络上查找一条路径,使其依次经过若干制定的路有点,并使其成本最小,包括距离成本最小的最短路径和时间成本最小的旅行商分析。步骤一、首先打开一个数据库型的工作空间,在交通分析的选线卡中选择拓扑构网再选择构建二维网络。步骤二、点击下面那…

    2022年8月24日
    10
  • CNN卷积神经网络和反向传播[通俗易懂]

    CNN卷积神经网络和反向传播[通俗易懂]本文内容来自:1,MichaelNielsen的《NeuralNetworksandDeepLearning》中文翻译2,http://www.cnblogs.com/pinard/p/6494810.html3,http://blog.csdn.net/yunpiao123456/article/details/52437794卷积神经网络基础:首先看一下全连接网络,即神经元

    2022年6月3日
    30
  • 新手该如何学python怎么学好python?

    新手该如何学python怎么学好python?新手该如何学python怎么学好python?作为新人,对于如何学好PYTHON也是一头雾雨,也很想能得到别人的帮助。今天看到这篇文章,感觉学习起来有了一个方向.现摘录如下,以便给自己的学习提供一个参

    2022年7月5日
    21
  • vue 如何关闭 eslint 检查

    vue 如何关闭 eslint 检查在实际开发过程中,eslint的作用不可估量,诸如:1.审查代码是否符合编码规范和统一的代码风格;2.审查代码是否存在语法错误;But,对于初学者来说,这个功能极其不友好,各种问题层出不穷,让很多初学者头疼不已,我们有没有办法关掉它,等适当时机在启用它呢,答案是肯定的。不同vuecli版本创建工程的时候,稍微有些差别,要仔细甄别,我的vuecliv4.5.9方案一:vue脚手架创建工程的时候,不要选择Linter/Formatter选项,(那如何选择启用,请参照方案二)

    2022年5月20日
    54
  • vue动态生成表单_vue element 表单验证

    vue动态生成表单_vue element 表单验证前几天接了一个需求,需要动态生成一个表单数据,然后提交,提交完数据后。通过编辑按钮进入时,需要进行数据回填。没生成表单前的状态单机生成表单生成表单根据选择方式展示不同的表单元素如果从编辑页进入该页面有数据的话,进行数据回填样式同第三点相似,这里不再说明思路:请输入标题,请选择类型为父组件;请选择方式为子组件;根据请选择方式出来的内容为孙子组件难…

    2025年6月11日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号