I2C串行总线协议

发布者:知音学友最新更新时间:2018-07-15 来源: eefocus关键字:I2C  串行总线协议 手机看文章 扫描二维码
随时随地手机看文章

一、I2C串行总线概述

I2C总线是PHILIPS公司推出的一种串行信息总线,用于连接微控制器及外围设备,是具备多主系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。

I2C总线只有两根双向信号线,一根是数据线SDA,一根是时钟线SCL。单片机与I2C器件连接如下图所示:


每个连接到I2C器件都有唯一的地址,这个地址是由I2C器件硬件连接决定的。

 

二、I2C串行总线工作原理

1、I2C总线上数据的有效性

I2C总线以串行方式传输数据,从数据字节的高位开始传输,每一个数据位在SCL上都有一个时钟脉冲相对应。在一个时钟周期内,当时钟信号为高电平时数据线上的数据必须保持稳定,当时钟信号为低电平时,才允许数据的变化。如下图所示:

 

 

 2、I2C总线上的信号

I2C总线在数据传输过程中共有4种类型信号,分别为开始信号、停止信号、重新开始信号和应答信号。

开始信号:当SCL为高电平时,SDA线由高电平向低电平跳变即为开始信号。

停止信号:当SCL为高电平时,SDA线由低电平向高电平跳变即为停止信号。

重新开始信号:在I2C总线上,由主机发送一个开始信号启动一次通信后,在首次发送停止信号之前,主机发送开始信号即为重新开始信号。

应答信号:接受数据的IC在接收到8位数据后,向发送数据的IC发出特地的低电平脉冲。每一个数据字节后面都跟有一位应答信号,表示已接收到数据。应答信号在第9个时钟周期出现,这时发生器必须在这一时钟位上释放数据线,通过接收设备拉低SDA产生应答,保持SDA高电平产生非应答。

3、I2C总线上的数据传输格式

一般情况下,一个标准的I2C通信通常由4部分组成:开始信号、从机地址传输、数据传输和结束信号。

数据传输开始时,先是主机发送一个开始信号,启动I2C通信,在主机对从机寻址后,再在总线上传输数据,I2C总线上传输的每一字节均为8位,高位在前、低位在后,每传送1字节后必须跟随一个应答位,每次的数据字节没有限制,在全部数据传送结束后,主机发出停止信号,结束通信。

4、I2C总线上的寻址约定

在I2C总线系统中,寻址字节由从机的7位地址为(D7~D1位)和1位方向位(D0)组成。方向位为“0”时,表示主机将数据写入从机;为“1”时,表示主机从从机读取数据。

5、主机向从机读/写1字节数据的过程

主机写字节时,首先产生开始信号,然后发送一个7位的从机地址和将方向位清零。这时候主机等待从机的应答信号,当主机接收到应答信号时,发送要访问的地址,继续等待,应答后接着发送1字节数据,等待到应答并产生停止信号,传输过程结束。如下图所示

 

主机读数据时,首先产生启动信号,然后发送一个7位的从机地址并将方向位清零,等待应答后,发送要访问的地址,等待应答后重新发送开始信号,然后发送一个7位地址并将方向位置“1”,这时候主机等待从机的应答,应答后,就可以接收一字节的数据;当接收完成后,主机发送非应答信号,主机产生停止信号,传输过程结束。如下图所示:

 

三、8051与AT24C02相连接

 

 

四、程序设计

本程序是先向24C02写进数据,接着从24C02读出来,并将传到P2,形成流水灯现象:

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit SCL=P3^0;

sbit SDA=P3^1;

void delay5us()   // 延时大于4.7us   

{

   _nop_();_nop_();_nop_();_nop_();_nop_();   

}

void delayms(uint z)

{

   uint x,y;

   for(x=0;x<110;x++)

       for(y=0;y

}

void IIC_start()

{

   SDA=1;

   SCL=1;              //在SCL为高电平期间,将SDA由高电平跳到低电平

   delay5us();

   SDA=0;

   delay5us();

   SCL=0;

}

void IIC_stop()

{

   SDA=0;

   SCL=1;            //在SCL为高电平期间,将SDA由低电平跳到高电平

   delay5us();

   SDA=1;

   delay5us();

   SCL=0;

}

void IIC_ACK(bit temp)

{

   SDA=temp;           //在第9个时钟周期,产生应答/非应答

   delay5us();

   SCL=1;

   delay5us();

   SCL=0;

}

void IIC_write_byte(uchar temp)

{

   uchar i;

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

   {

        SCL=0;

        _nop_();_nop_();_nop_();

      SDA=(bit)(temp&0x80);        //上升沿发送数据

        temp<<=1;

        delay5us();

        SCL=1;

        delay5us();

   }

   SCL=0;

}

uchar IIC_read_byte()

{

   uchar i,temp=0;

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

   {

         SCL=0;

         _nop_();_nop_();_nop_();

         SDA=1;

         delay5us();

         SCL=1;                //下降沿接收数据

         delay5us();

         temp<<=1;

         if(SDA)temp+=1;

   }

   SCL=0;

   return temp;

}

void main()

{

   uchar table[4],i;

   IIC_start();

   IIC_write_byte(0xa0);        //发送从机地址

   IIC_ACK(0);

   IIC_write_byte(0x01);        //发送访问地址

 

   IIC_ACK(0);

   IIC_write_byte(0x01);        //发送数据

 

   IIC_ACK(0);

   IIC_write_byte(0x02);        //发送数据

 

   IIC_ACK(0);

   IIC_write_byte(0x04);        //发送数据

 

   IIC_ACK(0);

   IIC_write_byte(0x08);            //发送数据

 

   IIC_ACK(1);

   IIC_stop();

   delayms(1000);       

 

   IIC_start();

   IIC_write_byte(0xa0);        //发送从机地址

   IIC_ACK(0);

   IIC_write_byte(0x01);        //发送访问地址

   IIC_ACK(0);

   IIC_start();                               //重新开始信号

   IIC_write_byte(0xa1);

   IIC_ACK(0);

   table[0]=IIC_read_byte();       //接收数据

   IIC_ACK(0);

 

   table[1]=IIC_read_byte();       //接收数据

   IIC_ACK(0);

 

   table[2]=IIC_read_byte();       //接收数据

   IIC_ACK(0);

 

   table[3]=IIC_read_byte();         //接收数据

   IIC_ACK(0);

 

   IIC_stop();                                     //停止信号

   while(1)

   {

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

         {

            P2=table[i];

               delayms(300);

         }

         P2=0XFF;

   }

}


关键字:I2C  串行总线协议 引用地址:I2C串行总线协议

上一篇:I2C eeprom调试经验
下一篇:I2C总线EEPROM实现

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

动图演示UART、SPI、 I2C串行通信的底层原理
UART、SPI、 I2C等串行通信是嵌入式开发中非常常见的通信方式,这些通信的最底层通信原理其实不难,但很多初学者却学不会。 本文分享一些常见通信的底层数据传输原理。 UART串口 UART:Universal Asynchronous Receiver/Transmitter,通用异步收发传输器。 UART串口是最常见的一种串口通信,下面是串口连接上位机电脑,以及RS232应用的动画。 如上图,PC 上通过UART来调试MCU。 上图,RS-232通过电平转换芯片与MCU通讯。 SPI串行通信 SPI:Serial Peripheral Interface,串行外设接口。 SPI是一种常见的串行同步通信
[单片机]
动图演示UART、SPI、 <font color='red'>I2C</font>等<font color='red'>串行</font>通信的底层原理
I2C总线读写E2PROM
这一篇介绍I2C存储器的使用。主要是介绍AT24CXX系列器件,它分为两类,主要是通过被存储容量地址来分的,一类是AT24C02-AT24C16,它的存储容量从256字节到2048字节。另一类是AT24C32-AT24C1024,容量从4K-128K。(理论上好像可以达到最高512K字节容量,但现在网上最高也就能看到AT24C1024也就是128K字节容量) 原理:   I2C总线是一种用于IC器件之间连接的二线制总线。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。 I2C总线接口电路结构如图所示。 SDA和SCL
[单片机]
<font color='red'>I2C</font>总线读写E2PROM
I2C子系统分析
本文以s3c2440的I2C子系统为例, 分析其代码实现 本人学习驱动不久, 如有瑕疵纰漏, 欢迎指教, 谢谢 从硬件的角度看, I2C子系统由总线适配器和挂在总线上的设备组成 因此, 很容易想到, Linux的I2C子系统至少要提供: 总线上设备的支持, 以及其驱动 总线适配器的支持, 以及其驱动 1. S3C2440的I2C总线作为一个平台设备, 来看下添加平台设备的代码: /arch/arm/mach-s3c2440/mach-smdk2440.c static struct platform_device *smdk2440_devices __initdata = { &s3c_device_u
[单片机]
采用MSP430F247单片机实现TMP275测温仪的I2C模块的连接
1 引言 温度传感器TMP275可直接输出数字信号,而无需取样、放大、滤波和模数信号的转换,可以直接传输给单片机信号处理系统;而且输出信号分辨率可以达到0.0625,测温精度±0.5℃,若使用MSP430F247做控制器,可直接与其自带的I2C模块相连,使用方便。 2 电路设计 2.1 总体方案设计 该测温仪的硬件结构由温度测量、核心控制电路、显示电路和电源电路等4部分组成。总体方案框图如图l所示。 2.2 单元模块设计 2.2.1 核心控制电路 核心控制电路采用MSP4313F247完成数据的测量和处理,实现温度测量和控制输出显示功能,电路如图2所示,其中的P3.1.P3.2分别是MSP430F247自带I2C模块的S
[单片机]
采用MSP430F247单片机实现TMP275测温仪的<font color='red'>I2C</font>模块的连接
I2C串行扩展总线的负载能力是多少? 信号传输最高速率是多少?
答:由于I2C总线器件均为CMOS器件,因此总线具有足够的电流驱动能力。总线上扩展的器件数不是受制于电流驱动能力,而是受制于电容负载总量。I2C总线的电容负载能力为400 pF (通过驱动扩展可达4000pF)。每一器件的输入端都相当于一个等效电容,由于I2C总线扩展器件的连接关系为并联,因此,I2C总线总等效电容等于每一器件等效电容之和,等效电容的存在会造成传输信号波形的畸变,超出范围时,会导致数据传输出错。 I2C总线传输速率为100Kbit/s(改进后的规范为400Kbit/s)。
[单片机]
I2C器件(复制)
    一般I2C总线的拓扑结构是总线结构,这也是大多用户常用的结构,其缺点是:   信号传输距离有限,常用于一个PCB板之内   总线上挂接的节点器件有限,受容性负载最大值400pF的限制   拓扑结构只能是二线总线型,不能扩充到星型结构   速度只能取最低值,高速I2C器件速度发挥不出来   不同电平的器件不能挂接在同一总线上 如果要解决上述问题,一般方法是再增加一或多条I2C总线,为不同的总线编写不同的程序,增加了工作量还降低了软件的可移植性。利用I2C中继器、集线器和扩展器,就可以克服上述缺点,灵活构造I2C控制网络。   I2C中继器和
[嵌入式]
STM32下模拟I2C的C语言实现
近来主要在写一些STM32上的开发程序,由于STM32的固件库中,I2C模块实在是不好用,所以在采用了软件模拟的方法来实现。 具体的代码如下(在Keil下调试通过): #include stm32f10x_lib.h //条件编译 1:使用软件模拟I2C //#define PIN_SCL GPIO_Pin_6 //#define PIN_SDA GPIO_Pin_7 static __inline void TWI_SCL_0(void) { GPIOB- BRR=PIN_SCL; } static __inline void TWI_SCL_1(void) { GPIOB- BSRR=P
[单片机]
I2C总线实现TMS320VC5509A引导装载设计
1 引言 DSP芯片的Bootloader程序用于上电时将用户程序从外部非易失性、慢速存储器或外部控制器中装载到片内高速RAM中,保证用户程序在DSP内部高速运行,TI公司的C55x系列DSP芯片提供多种装载模式,主要包括HPI引导装载、串行E2ROM引导装载、并行引导装载、串行口引导装载、I2C总线E2ROM引导装载等,通常使用的是并行引导装载模式,该方式引导速度快实现简单,但是体积和功耗也较大,随着串行接口存储设备容量的提高,串行引导方式体积小、功耗低的优势便显现出来了,所以使用ARM的串行接口对DSP进行引导装载,不仅能省去存储芯片,而且利用ARM的ISP功能,可以根据需要改变用户程序,有利于系统的维护和升级。
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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