I2c串行总线组成及其工作原理

发布者:HappyHearted最新更新时间:2017-01-09 来源: eefocus关键字:I2c  串行总线 手机看文章 扫描二维码
随时随地手机看文章

采用串行总线技术可以使系统的硬件设计大大简化,系统的体积减小,可靠性提高,同时系统更容易更改和扩充

常用的串行扩展总线有:I2c总线,单总线,SPI总线,以及microwire、Plus等等

I2c总线只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL

 

I2c总线通过上拉电阻接正电源。因此I2C总线的设备都要接上拉电阻

当总线闲置的时候,两根线均为高电平,连接到总线上的任何一个器件输出的低电平,都将使得总线得到信号变低,及各个器件的SDA和SCL都是线与的关系

每个接入到I2C总线都有唯一的地址,主机与其他器件间的数据传送可以是由主机发送数据到其他器件,这时主机即是发送器,由总线上接收数据的器件称为是接收器。

在多主机系统中,可能同时由几个主机企图启动总线传送数据,为了避免混乱,I2C总线要通过总线仲裁,已决定由哪台主机控制总线

 

数据位的有效性

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有时钟线上的信号为低电平期间,数据线上的高电平和低电平状态才允许变化

 起始信号和终止信号

SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号,SCL线为高电平期间,SDA线由低电平向高电平变化表示终止信号

数据传送的格式

(1)字节传送与应答

每一个字节必须保证是8位长度,数据传送时,先传送的是最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位,即(一帧共有9位),应答信号由从机发送给主机

每次数据传送总是由主机产生的终止信号结束,但是若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一个从机进行寻址

 

在总线的一个数据传上过程中,可以有一下几种传送方式的组合方式

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

 A表示应答,A非表示非应答,s表示其实信号,p表示终止信号

 

 主机发送地址时,总线上的每一个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正在被主机寻址,根据R/T位将自己确定为发送器或接收器

从机地址由固定部分和可编程部分组成,可编程的部分决定了可接入总线该器件的最大数目。

由操作时序可知要进行必要的延时

起始操作示例代码:

void T2CStart(void)

{

    SDA = 1;

    SomeNop();//大于微秒级别

    SCL = 1;

    SomeNop();

    SDA = 0;

    SomeNop();

}


终止指令:



void I2CStop(void)

{

    SDA = 0;//data由0变到1为终止指令

    SomeNop();

    SCL = 1;

    SomeNop();

    SDA = 1;

    SomeNop();

}


I2C总线扩展 

串行E2PROM的扩展

(2)写入过程:AT24CEEPROM的固定地址为1010,A2,A1A0引脚接入高低电平可以得到确定的3位编码,形成的7位编码即为该器件的地址码

单片机进行写操作的时候,首先

发送该器件的7位地址吗和写方向的方向码0,发送完以后释放SDA线并在SCL线上产生第九个时钟信号,被选中的存储器再确认自己的地址后,在SDA上产生一个应答信号作为响应

,单片机接收到信号就可以传送数据了

 

传送数据时,单片机首先发送一个字节的被写入器件的存储区的首地址,收到存储器器件的应答后,单片机就逐个发送各个数据的字节,但是每次发送一个字节后都要等待应答

收到每个字节的地址后,芯片上的地址会自动加一

写入n个字节的数据格式

 

读出过程

单片机首先发送该器件的7位地址码和写方向位0(伪写),发送完后释放SDA线并在SCL线上产生9个时钟信号,被选中的存储器器件在确认自己的地址之后,在SDA上产生一个应答信号作为回应

然后在发送一个字节的要读出存储去的首地址,收到应答,单片机要重复一次起始信号并发出器件地址的读方向位(1),收到器件应答就可以读出字节,每次读出一个字节,单片机都要回复一个应答信号,但最后读出一个字节,单片机应返回非应答信号(高电平)并发出终止信号以结束读出操作

 

示例代码:

#include

#define uchar unsigned char

#define uint unsigned int


sbit sda = P2^3;

sbit scl = P2^2;

sbit wp = P2^1;

void delay()//微妙级别的延时函数

{;;}


void start()//开始信号

{

    sda = 1;

    delay();

    scl = 1;

    delay();

    sda = 0;

    delay();

}


void stop()//停止信号

{

    sda = 0;

    delay();

    scl = 1;

    delay();

    sda = 1;

    delay();


}


void respons()//应答信号

{

    uchar i;

    scl = 1;

    delay();

    while((sda ==1)&&(i<250))//等到第九个时钟周期的时候,还没有变为0,

                            //那么scl将自动的变为0,表示收到信号

    {

        i++;        

    }

    scl = 0;

}


void init()

{

    sda = 1;

    scl = 1;//把线全部释放 

}


void write_byte(uchar date)

{

        uchar i,temp;

        temp = date;

        scl = 0;

        delay();

        for(i = 0;i<8;i++)//写8次

        {        

            temp = temp<<1;//表示将temp左移1位,将最高位移入psw寄存器中的cy位,

                            //然后将最高位赋值给sda,送走数据

            scl = 1;//数据稳定了

            delay();

            sda = CY;

            delay();


            scl = 0;//读走数据

            delay();

            }


        sda = 1;//注意养成释放总线的习惯

        delay();

}


uchar  read_byte()

{

        uchar i,j,k;

        scl = 0;

        delay();

        sda = 1;//释放数据总线

        delay();

        for(i=0;i<8;i++)

        {

            scl = 1;

            delay();

            

            j = sda ;//读取数据


            k =(k<<1)|j;

            scl = 0;

            delay();

            }

            return k;

        

}



uchar read_add(uchar address)

{

        uchar date;

        start();

        write_byte(0xa0);//表示写入器件的地址

        respons();

        write_byte(address);

        respons();

        start();

        write_byte(0xa1);

        respons();

        date=read_byte();

        stop();

        return date;

}


void write_add(uchar address,uchar date)

{

        init();//初始化信号总线和地址总线

        start();//启动信号

        write_byte(0xa0);//表示写入器件的地址

        respons();

        write_byte(address);//表示往这个器件内部的第三个地址处写入地址

        respons();

        write_byte(date);//表示器件内部的数据

        respons();

        stop();

}

void delay1(uint z)

{

        uint x,y;

        for(x= z;x>0;x--)

            for(y=110;y>0;y--);

}


void main()

{    

        init();

        write_add(23,125);

        delay1(100);

        P1=read_add(23); 

        while(1);

}


关键字:I2c  串行总线 引用地址:I2c串行总线组成及其工作原理

上一篇:ARM指令集----杂项指令
下一篇:单片机液晶操作

推荐阅读最新更新时间:2024-03-16 15:29

应用McBSP实现I2C总线控制器
作者Email: dick_ligg@sohu.com 摘 要:提出了在TMS320C6000系列DSP上应用McBSP实现I2C总线接口协议的方法,使DSP可以接入其他需要I2C总线配置的智能器件,系统结构简单,硬件设计容易,资源消耗小。 关键字:I2C总线 GPIO McBSP DSP 1 引 言 TI公司的TMS320C6000 系列是高性能的DSP,可广泛的用于XDSL、无线基站、数字图像处理等方面。在进行数字图像处理时,通常需要视频解码器诸如SAA7111A之类的模拟视频前端,而大多数的视频解码器进行初始化通常是通过两线的I2C总线接口,但是现在的DSP和MCU大部分都没有I2C总线接口,在这种情况下
[应用]
串行总线在激光稳频中的应用
1 前言 1.1 本课题的研究背景 激光由于具有良好的单色性及相干性,被广泛应用于精密激光光谱和精密计量等诸多研究领域。频率稳定度极高的激光器已在计量研究领域提供长度基准和时间频率标准。 自由运转的激光器因受到外界振动、温度起伏等因素的扰动,导致激光频率随时间变化,难以满足精密计量等应用上的要求。要使激光频率稳定输出就必须利用激光稳频技术,采取一定的措施来减小外界扰动所引起的激光频率漂移。 实现激光频率稳定性的提高,通常可以选取一个频率参考标准,通过激光频率与频率参考标准进行比较,得到激光频率偏离频率参考标准的误差信号,通过伺服控制系统和执行机构调整激光器的某一参数,使激光频率锁定在频率参考标准上,从而获得频率稳定的激光
[嵌入式]
普通彩电与I2C总线控制彩电的差异分析
  I2C总线的概念来源于计算机数据传输技术,但随着电子技术的不断发展,I2C总线技术已经广泛地用于彩色电视领域。这种新技术可以完成彩色电视机的各种控制功能,能方便地进行各种模拟量的调整和控制,而且在整机电路元件数量大大减少的基础上,降低了生产成本,提高了整机的可靠性,降低了故障率。因此,在销售价格和产品质量方面深受群众的欢迎;在生产成本、产品设计、测试调整及更新换代等方面又倍受电视机生产厂家的青睐。应用I2C总线控制技术和单片彩色电视机机芯的电路结构已经成为本世纪初彩色电视机发展的基本特征。根据家用电器的一般使用及维修规律可知,已经推广使用3年有余的I2C总线控制彩电已经开始进入检修期,然而,习惯采用传统技术维修普通遥控彩电的人总
[嵌入式]
STM32 I2C Slave(SMBUS)模式软件参考设计
I2C大家都很熟悉,总共2根线,CLK和DATA,stm32的I2C相信大家就更熟悉了,采用写控制器的方式,直接由控制器去完成I2C时序操作,用户无需关心具体产生的逻辑。然而,大部分情况下,使用的都是I2C Master模式,即主设备模式,很少当成slave模式即从设备模式来用,这篇文章讲的是如何把stm32 I2C当成slave模式来使用,更严格来说,本篇讲的是smbus模式。 从官网stm32手册上我们发现了smbus和I2C区别,大家自行理解: 真正使用时,可以把smbus等同于I2C来设置和使用,从代码上看,除了I2C Clock设置为20K之外,其它暂无明显区别。以下为I2C smbus模式的设置: v
[单片机]
STM32 <font color='red'>I2C</font> Slave(SMBUS)模式软件参考设计
1.10.2_I2C_S3C2440的I2C控制器_P
2440通过I2C总线连接设备(AT24Cxx),芯片内部有一个I2C控制器。 当主机(2440)Master为Transmitter时,从机Slave为Receiver,当主机Master为Receiver时,从机Slave为Transmitter。 下图是2440的I2C总线框图。从左往右看,首先是I2C的时钟,I2C的时钟源是PCLK(50MHz),经过一个4bit的分频器,产生I2C的时钟。通过IICSTAT寄存器发出信号,通过IICDS发送数据或接受数据。 数据的传输格式如下图如所示。首先发出开始信号S,然后是7位的从设备地址,1位的读写标志位,然后等待从机返回一个ACK信号,如果是发送数据,那么就将1B数
[单片机]
1.10.2_I2C_S3C2440的<font color='red'>I2C</font>控制器_P
基于51单片机i2c多字节的读写
使用Keil的编译环境下载,确实能够下载,但是入口的地址是如下黄色的那行显示所示,如果单步执行(F11)或全速运行(F5),程序始终在原位置不动(0x1FFF4252),如果强制的将PC指针的值和SP的值修改为0x8000000与0x2000000,然后在点击运行,则能够跑到main()函数,再全速运行,能够看到客户板子上的LED灯的闪烁。 但是如果不强制修改PC和SP指针的值,则程序不执行。 所以问题就变成为什么程序下载进去后的地址是0x1FFF4252?0x1FFF4252又是什么地址呢?查阅相应的手册,发现0x1FFF4252是处在了Systemmemory区域。 用万用表测量了客户板上的Boot0引脚的电平,发
[单片机]
基于51单片机<font color='red'>i2c</font>多字节的读写
面向便携式处理器系统的8 通道、I2C 控制型 PMIC
      凌力尔特公司 (Linear Technology Corporation) 推出一款面向便携式处理器的完整电源管理解决方案 LTC3589,例如有 i.MX、PXA、ARM、OMAP 及其他先进的便携式微处理器系统。该器件采用紧凑型 QFN 封装,具有 8 个独立的电源轨、以及动态控制和排序功能。这些电源轨为处理器内核、SDRAM、系统内存、PC 卡、始终接通实时时钟 (RTC) 以及多种其它功能供电。LTC3589 含有 3 个大电流、高效率降压型稳压器,一个大电流/高效率降压-升压型稳压器、以及 4 个低噪声、低压差线性稳压器 (LDO)。对多稳压器提供支持的是一种可配置度很高的电源排序能力、动态电压调节输出电压
[电源管理]
面向便携式处理器系统的8 通道、<font color='red'>I2C</font> 控制型 PMIC
揭开测试测量的小秘密——每周一考 【第7周】
1、汽车电子中有哪些常见的串行总线有哪些? 2、目前示波器能提供对哪些总线进行眼图模板测量? 3、同时进行CAN和LIN总线解码时,在一个窗口中交替显示和用两个窗口并列显示有什么优点? ----------------------------------我是答案分界线---------------------------------------- 1、汽车电子中有哪些常见的串行总线有哪些? 汽车电子包括多媒体子系统、显示子系统、自适应导航子系统、驾驶员信息子系统等,包括的串行信号总线也因子系统的不同而不同,总的来讲,国内汽车电子最常见的为CAN,LIN两种总线,高档汽车目前全球有两三家公司采用FlexRay 总线,汽车的娱乐
[测试测量]
揭开测试测量的小秘密——每周一考 【第7周】
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved