I2C总线驱动在嵌入式系统中的两种实现

发布者:才富五车330最新更新时间:2012-03-01 来源: dzsc关键字:I2C总线  嵌入式系统  二线制 手机看文章 扫描二维码
随时随地手机看文章
引 言

I2C总线(Inter-IC Bus)是一种通用的串行总线,是用于IC器件之间连接的二线制总线。他通过串行数据线(Serial Data Lines,SDL)及串行时钟线(Serial ClockLine,SCL)两线在连接到总线上的器件之间传送信息,并根据地址识别每个器件。一个或多个微控制器以及外围器件可以通过I2C总线接口非常方便的连接在一起构成系统。这种总线结构的连线和连接引脚少,器件间总线简单。结构紧凑,因此其构成系统的成本较低;并且在总线上增加器件不会影响系统的正常工作,所有的I。C器件共用一套总线,因此其系统修改和可扩展性好。即使有不同时钟速度的器件连接到总线上,时间同步机制也能够很方便地确定总线时钟,因此在嵌入式系统中得到了广泛的应用。 2 I2C总线原理

2.1 I2C工作原理

I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。每个连接到总线的器件都可以通过惟一的地址与主机通讯,主机可以作为主机发送器或主机接收器。他是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏。串行的8位双向数据传输位速率在标准模式下可达100 kb/s,快速模式下可达400 kb/s,高速模式下可达3.4 Mb/s。连接到相同总线的IC数量只受到总线的最大电容400 pF限制。

I2C总线在传送数据过程中共有3种特殊的电平变换情况,他们分别是:起始(start)、停止(stop)和响应(aek)。

当SCL为高电平时,SDA由高电平向低电平跳变,这个表示起始条件;当SCL是高电平时,SDA线由低电平向高电平跳变表示停止条件。起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态,在停止条件的某段时间后总线被认为再次处于空闲状态。

响应信号是指从机在接收到8b数据后,向主机发出特定的低电平脉冲,表示已收到数据。在响应的时钟脉冲期间,从机必须将SDA线拉低使他在这个时钟脉冲的高电平期间保持稳定的低电平,主机收到应答信号后,根据实际情况做出是否继续传递信号的判断。若未收到应答信号,则判断为从机出现故障。

2.2操作时序

I2C总线运用主/从双向通讯。主机和从机都可以工作于接收和发送状态。总线必须由主机(通常为微控制器)控制,主机产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。具体时序见图1。

3嵌入式系统中的I2C驱动的两种实现

3.1 系统自带I2C寄存器的实现

下面以ARM S3C4510B为例,给出基于寄存器方式的I2C驱动实现。S3C4510B内含一个I2C总线主控器,可方便地与各种带有I2C接口的器件相连。I2C总线控制器有3个特殊功能寄存器:一个控制状态寄存器(I2CON),一个预分频寄存器(I2CPS)和一个移位缓冲寄存器(I2CBUF)。通过配置这些寄存器,可实现正确的I2C数据传输时序。下面分别给出读、写实现的实例。读操作:

通过对控制状态寄存器(I2CC()N)写入OxlO发送启动码初始化串行I2C总线,然后总线控制器发送7位的从设备地址并通过移位缓冲寄存器发送读/写控制位,接收器则在主控器的SCL脉冲期间通过将SDA线从高电平下拉到低电平作为应答信号。

写数据的操作 先设置控制状态寄存器的BF位(0x01),然后写入数据到移位缓冲寄存器。移位缓冲寄存器无论是被读还是写,BF位均会自动清零。若要进行连续的读/写操作,必须设置控制状态寄存器的ACK位(0x08)。

读数据的操作 在设置控制状态寄存器的BF位以后,可以进行读数据的操作,当读/写完最后一个字节时,可对ACK位进行复位通知发送器/接收器读数据操作结束。

在读/写操作完成以后,可通过对I2CCON写入0x20生成结束码。

3.2 以GPIO端口模拟I2C实现

此方法是直接用ARM S3C4510的GPIO(GeneralPurpose Input/Output)引脚模拟I2C总线的时序来实现数据传输。S3C4510B提供了18个可编程的通用I/O端口,用户可将每个端口配置为输入模式、输出模式或特殊功能模式,由片内的特殊功能寄存器IOPMOD和IOPCON控制。

控制I/O口的特殊功能寄存器一共有3个:IOP-MOD,I0PCON和IOPDATA。I/O口模式寄存器(IOP-MOD)用于配置P17~P0的输入输出状态;I/O口控制寄存器IOPCON用于配置端口P8~P17的特殊功能,当这些端口用作特殊功能(如外部中断请求、外部中断请求应答、外部DMA请求或应答、定时器溢出)时,其工作模式由10PCON寄存器控制,而不再由IOPMOD寄存器;I/O口数据寄存器(IOPDATA)当配置为输入模式时,读取I/O口数据寄存器IOPDATA的每一位对应输入状态,当配置为输出模式时,写每一位对应输出状态。位[17:O]对应于18个I/0引脚P17~P0。

下面用GPIO的pin[O][1]脚进行I2C模拟,其中低位为SDA,高位为SCL。首先给出一些便于操作的宏定义:


 

3.3 应用实例

为ARM外挂PCF8563实现实时时钟控制。PCF8563是PHILIPS公司生产的具有I2C接口的低功耗CM()S实时时钟/日历芯片。其最大总线速度为400kb/s,每次读写数据后,其内嵌的字地址寄存器器会自动产生增量。下面用模拟实现PCF8563的I2C实时时钟芯片的操作,有字节写/读两种状态,程序中从地址的读地址为0A3H,写地址为0A2H。

首先使能I2C总线,然后对I2C总线进行开始操作,就绪之后,依次写人器件地址(即0xA2),写入寄存器地址,再写人所设寄存器值。控制/状态寄存器1为0,控制/状态寄存器2为0,秒寄存器为30,分钟寄存器45,小时寄存器为17,日寄存器为20,星期寄存器为0,月/世纪寄存器为88,年寄存器为6(即2006年8月20日17点45分30秒)。当程序运行一段时间(15分钟)后,依次读取寄存器,得到时间为2006年8月20日18点OO分30秒。

4 总 结

本文给出了两种I2C驱动的实现方法。前者直接利用主机端自带的I2C总线控制器,通过配置一系列特殊寄存器实现I2C总线传输。这种方式适用于一些本身包含I2C总线控制器的芯片,实现起来简单方便。后者则适用于主机端没有I2C控制器的情况。此时主机端只要有GPIO端口,就可利用其实现同样的功能。在基于ARM加μClinux的嵌入式视频监控产品中,同时将这两种方法做了具体的运用。其一的示例就是通过模拟的I2C总线,挂接PCF8563实时时钟芯片,并取得很好的实时效果。

关键字:I2C总线  嵌入式系统  二线制 引用地址:I2C总线驱动在嵌入式系统中的两种实现

上一篇:基于P87C591的CAN总线控制系统的设计研究
下一篇:现场总线系统抗干扰的实现与应用

推荐阅读最新更新时间:2024-05-02 21:56

基于AVR的时间触发嵌入式系统的设计与应用
1.前言 近年来,嵌入式发展迅速,采用51 单片机 死循环的事件触发编程方式已逐渐不能满足企业对产品稳定性和安全性的要求。目前,嵌入式系统软件有VxWork、Linux、WinCE、μC/OS-II等,可出于成本和技术上的考虑,微控制器往往不会选取其进行设计。在实际应用中,往往会面临同时应付多外设、多任务的情况,则对它们的相互调度必不可少。时间触发嵌入式系统就是这样的简单实用的操作系统。 本文设计了基于AVR微控制器的时间触发多任务调度器并应用于实际。该调度器使用传递消息(message)的方式使得微控制器在多个任务及设备间切换。 2.AVR微控制器的结构特点 AVR是目前使用以该系列的ATmega128为
[单片机]
基于AVR的时间触发<font color='red'>嵌入式系统</font>的设计与应用
FPGA器件在嵌入式系统中的配置方式的探讨
引言 在当今商业竞争日益加强的环境中,产品是否便于现场升级和是否便于灵活运用,成为商家迅速占领市场的关键因素。在这种背景下,Alter公司开发的基于SRAM LUT结构的FPGA器件得到了广泛应用。 现场可编程门阵列FPGA(Field Programmable Gate Array)是一种高密度可编程逻辑器件,其逻辑功能是通过把设计生成的数据文件配置进芯片内部的静态配置数据存储器(SRAM)来实现的,具有可重复编程性,可以灵活实现各种逻辑功能。由于SRAM的易失性,每次系统上电时必须重新配置数据,即ICR(In-Circuit Reconfigurability)。只有在数据配置正确的情况下,系统才能
[工业控制]
基于Intel Xscale和嵌入式Linux的视频模块设计
1 引言 随着计算机进入后PC时代、多媒体技术和无线通信技术的发展,融合通信、计算和多媒体功能的各类多媒体终端(如PDA)应用正在成为开发应用的新亮点,视频则是这类应用中不可缺少的重要组成部分。多媒体终端,作为嵌入式系统,大多数应用场合是对速度、功耗、体积有严格要求的车载、移动通信、手持式设备等,那么如何设计一个体积小、实时处理能力强、功耗低、可移植性强的视频模块以满足嵌入式系统设计对速度、功耗和空间的要求和应用开发的需求就成为一个很有意义的课题。 基于XScale 技术的新型处理器PXA255 是英特尔公司推出的为无线通信设备带来更高性能和更低能耗的微处理器产品,为多媒体手机、掌上电脑、车载信息通讯系统及其它无线互联网产品提供
[嵌入式]
51单片机模拟I2C总线程序
#include stdio.h #include absacc.h sbit led=P1^0; sbit led2=P1^1; sbit scl=P3^5; //24c02 SCL sbit sda=P3^4; //24c02 SDA sbit DOG=P1^7; //狗 uchar x24c02_read(uchar address); //从24c02的地址address中读取一个字节数据 void x24c02_write(uchar address,uchar info); //向24c02的address地址中写入一字节数据info void x24c02_init(); //24c02初始化子程序 void
[单片机]
如何用C语言开发DSP嵌入式系统
  引言   大家在开发嵌入式产品时首先会想到用控制器的汇编语言编写监控程序,主要原因是:①汇编语言生成的程序对应的二进制代码少,程序执行要比高级语言生成的程序快;②控制器刚问世时,没有相应的高级语言可供使用;③存储器的价格问题和寻址空间的限制。   以上所述问题目前已基本解决,在这就不阐述了。实际情况是:在单片机的应用领域,开发者已开始使用C语言进行开发。大家发现用高级语言开发嵌入式产品是如此轻松,并且C语言程序编译后的二进制代码也非常短小精练。   目前使用最多的数字信号处理器(DSP)是美国TI公司的TMS320家族,而工业控制上用得最多的又是TMS320F2XX系列。TI公司为每一个DSP芯片提供了汇编语言和C语言
[嵌入式]
I2C总线驱动(C51语言源程序)
i2c 总线上单片机系统中常用到的总线技术这里给大家介绍一个I2C总线驱动的C51语言源程序。 //#pragma ot(6,SIZE) #i nclude AT89X52.H #i nclude intrins.h #define ERRORCOUNT 10 #define readI2C 0xa1 #define writeI2C 0xa0 sbit SDA=P1^6; sbit SCL=P1^5; enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256}; enum eepromtype EepromType; //Da
[单片机]
I2C总线的仲裁机制
在多主的通信系统中。总线上有多个节点,它们都有自己的寻址地址,可以作为从节点被别的节点访问,同时它们都可以作为主节点向其他的节点发送控制字节和传送数据。但是如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行仲裁的判决,这就是I 2C总线上的仲裁。 I2C总线上的仲裁分两部分:SCL线的同步和SDA线的仲裁。 1   SCL线的同步(时钟同步) SCL同步是由于总线具有线“与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与”逻辑功能的原理,当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号
[嵌入式]
基于32位低端嵌入式系统的图像采集模块
引言 目前,在嵌入式系统中,图像采集可以采用模拟摄像头、CCD图像传感器或CMOS数字图像传感器来实现。CMOS数字图像传感器由于其高性价比和直接输出数字图像数据而得到最为广泛的应用。MT9V011就是一个这样的CMOS数字图像传感器。本文将介绍MT9V011 CMOS数字图像传感器在一个低端ARM7处理器系统中的应用。 在低端嵌入式系统中增加图像采集系统 实时图像采集系统已经广泛应用于手机、PDA、实时监控系统等高端嵌入式系统中。在这类系统中,处理器具有以下特点:具有较高的处理速度可以实时处理采集回来的大量图像数据;具有较大的内存可以存放若干帧完整的图像数据;具有丰富的外设接口可以比较容易地扩展大容量的存储设备如CF卡、S
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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