ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IIC总线详解

2022-09-09 15:33:12  阅读:289  来源: 互联网

标签:SCL 信号 应答 总线 详解 SDA IIC


@

目录

一.IIC简介

IIC(Inter-Integrated Circuit)集成电路总线,它是一种串行通信总线,又叫I2C,使用多主从架构,由飞利浦公司在1980年推出的。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,一般可达400kbps 以上,属于半双工同步传输型总线。

二.IIC物理层

IIC总线的硬件,是由一根数据线SDA,一根时钟线SCL构成。不同的器件,都是并联接在这两条线上,I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。
SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的
SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的

IIC总线通过上拉电阻接到电源VCC,电阻大小要根据设备实际测量。
    总线空闲的时候,SDA和SCL都是高电平。
    当其中一个设备拉低总线,整条线就全是低电平,器件与器件之间"与"关系。

三.IIC特点

通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(控制SCL的电平高低变换)谁就是主设备。
  IIC主设备功能:主要产生时钟,产生起始信号和停止信号
  IIC从设备功能:可编程的IIC地址检测,停止位检测
  IIC的一个优点是它支持多主控(multimastering),其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
  支持不同速率的通讯速度,标准速度(最高速度100kHZ),快速(最高400kHZ)
  SCL和SDA都需要接上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) 保证数据的稳定性,减少干扰。
  IIC是半双工,而不是全双工 ,同一时间只可以单向通信,IIC协议首先是发送从机硬件地址,然后发送命令,再发送数据/寄存器编号或者读取数据。IIC协议可以多字节连续读写数据。
  各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。

四.IIC协议规则

1.总线时序图

在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。

2.初始(空闲)状态

因为IIC的 SCL 和SDA 都需要接上拉电阻,保证空闲状态的稳定性
所以IIC总线在空闲状态下SCL 和SDA都保持高电平

/**
 * I2C初始化
 */
static void I2C_Init()
{
    SCL_H();     //首先把时钟线拉高
    delay_us(4);
    SDA_H();     //在SCL为高的情况下把SDA拉高
    delay_us(4);
}

3.开始信号

SCL保持高电平,SDA由高电平变为低电平后,延时(>4.7us),SCL变为低电平,比如发送设备唯一地址。

/**
 * 产生IIC起始信号
 * 1.先拉高SDA,在拉高SCL,空闲状态
 * 2.拉低SDA SCL
 */
static void I2C_Start(void)
{
    SDA_H();
    SCL_H();
    delay_us(5);
    SDA_L();
    delay_us(5);
    SCL_L();
}

4.停止信号

停止信号:SCL保持高电平,SDA由低电平变为高电平。

/**
 * 产生IIC停止信号
 * 1.先拉低SDA,再拉低SCL
 * 2.拉高SCL
 * 3.拉高SDA
 * 4.停止接收数据
 */
static void I2C_Stop(void)
{
    SCL_L();
    SDA_L();     //STOP:当SCL高时,数据由低变高
    delay_us(4);
    SCL_H();
    SDA_H();     //发送I2C总线结束信号
    delay_us(4);
}

5.应答信号

每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。
应答信号:主机SCL拉高,读取从机SDA的电平,为低电平表示产生应答。
应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;
应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。


每发送一个字节(8个bit), 在一个字节传输的8个时钟后的第九个时钟期间,接收器接收数据后必须回一个ACK应答信号给发送器,这样才能进行数据传输。
应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答

/**
 * 主机产生应答信号ACK
 * 1.先拉低SCL,再拉低SDA
 * 2.拉高SCL
 * 3.拉低SCL
 */
static void I2C_Ack(void)
{
    SCL_L();    //先拉低SCL,使得SDA数据可以发生改变
    SDA_L();    //拉低SDA,产生应答信号
    delay_us(2);
    SCL_H();
    delay_us(5);
    SCL_L();
}

/**
 * 主机不产生应答信号NACK
 * 1.先拉低SCL,再拉高SDA
 * 2.拉高SCL
 * 3.拉低SCL
 */
static void I2C_NAck(void)
{
    SCL_L();    //先拉低SCL,使得SDA数据可以发生改变
    SDA_H();    //拉高SDA,不产生应答信号
    delay_us(2);
    SCL_H();
    delay_us(5);
    SCL_L();
}

5.通信格式

起始信号之后,可以连续传输多个字节。然后以停止信号结束这一帧数据的传输。
多数从设备的地址为7位或者10位,一般都用七位。
八位设备地址=7位从机地址+读/写地址,
地址是根据硬件配置的,只有地址匹配的设备,才会处理总线上的数据。

IIC的每一帧数据由9bit组成,
如果是发送数据,则包含 8bit数据+1bit ACK,
如果是设备地址数据,则8bit包含7bit设备地址 1bit方向。

五. 数据读写三种方式

1.单向发送数据

比如显示设备,一般情况下只需要写入数据,传输过程如下:

2.读取数据

3.先写寄存器地址,再读取该寄存器的数据

比如存储芯片,一般情况下要先制定存储地址,再读取数据。传输过程如下:

六 参考引用

IIC总线详解
IIC原理超详细讲解---值得一看
IIC

标签:SCL,信号,应答,总线,详解,SDA,IIC
来源: https://www.cnblogs.com/Wei-Ting/p/16672999.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有