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

发布者:冰心独语u最新更新时间:2013-04-09 来源: dzsc关键字:I2C  总线驱动  嵌入式系统 手机看文章 扫描二维码
随时随地手机看文章

1 引 言

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生成结束码。[page]

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总线驱动在嵌入式系统中的两种实现

上一篇:基于Linux和S3C2410的嵌入式图象传输系统设计
下一篇:基于Zigbee的远程家庭监护系统的应用研究

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

I2C总线协议程序(80c51)
I2C总线协议程序 在做程序是我在网上找的是周立功的程序,感觉还不错顺便转载;在使用的过程中一定要注意时序、时间的问题。 i2c.c /* I2C.c 标准80C51单片机模拟I2C总线的主机程序 Copyright (c) 2005,广州周立功单片机发展有限公司 All rights reserved. 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的 */ #include I2C.h //定义延时变量,用于宏I2C_Delay() unsigned char data I2C_Delay_t; /* 宏定义:I2C_Delay() 功能:延时,模拟I2C总线专用 */ #define I2C_Delay()
[单片机]
STM32F407和STM32F051主从I2C通信方法
M4作为主机:   int main(void)   {   /* USER CODE BEGIN 1 */   /* USER CODE END 1 */   HAL_Init();   /* Configure the system clock */   SystemClock_Config();   /* Initialize all configured peripherals */   MX_GPIO_Init();   MX_I2C1_Init();   MX_USART1_UART_Init();   /* USER CODE BEGIN 2 */   /* USER CODE END 2 */   /* Infin
[单片机]
浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)
引子 STM32的硬件I2C很多人都对它望而却步。因为很多电工都说,STM32 硬件 I2C有BUG、不稳定、死机等等……最后都使用GPIO模拟I2C。 的确,模拟I2C好用。但是在我看来在一个72M的Cortex-M3的MCU上这样做非常不妥。一般来说I2C是一种慢速总线,就算工作在400kHz的快速模式上,I2C传送每个字节仍需要至少23us——还没有计算地址、起始信号和结束信号的发送。如果使用GPIO模拟的I2C,这23us的CPU时间都在空转中浪费了,而这23us已经可以做不少的事情了,所以在STM32上I2C还是使用硬件为佳——虽然它多多少少有点缺陷。 这篇文章不是给完全没有接触过STM32 硬件I2C的新手看的,看这篇
[单片机]
浅谈 STM32 硬件<font color='red'>I2C</font>的使用 (中断方式 无DMA 无最高优先级)
TPS62351 - TPS62352 - 具有 I2C 接口的可调节 800mA、3MHz 降压转换器
TPS6235x 器件是一款针对电池供电的便携式应用而优化的高频同步降压 dc-dc 转换器。TPS6235x 可满足低功耗应用要求,不仅支持高达 800 mA 的负载电流,而且还允许使用较小的低成本电感器与电容器。 该器件理想适用于移动电话与单体锂离子电池供电的类似便携式应用。该器件可通过 I2C 接口将输出电压范围调降至 0.6 V,从而能够支持智能电话、PDA 以及掌上电脑中的低压 DSP 与处理器内核电源。 TPS6235x 不仅能够在 3 MHz 的固定开关频率下工作,而且还能在轻负载电流下进入功效优化的节电工作模式,以便在整个负载电流范围内保持较高效率。在断电模式下,耗流量可降至 2 μA 以下。 该串行接口符合快速/标
[新品]
linux i2c 设备测试,i2c-dev驱动测试代码
embed-linux version:linux-2.6.39-exp vmware-linux:ubuntu14.04 hardware: core chip at91sam9x25 cross-compile:arm-none-linux-gnueabi-gcc 4.5.2 code: #include stdio.h #include stdlib.h #include unistd.h #include sys/ioctl.h #include sys/types.h #include sys/stat.h #include fcntl.h //#include sys/select.h #include sys/tim
[单片机]
I2C死锁原因及解决方法
死锁总线表现为:SCL为高,SDA一直为低 现象:单片机采用硬件i2c读取E2PROM,当单片机复位时,会有概率出现再无法与E2PROM通信,此时SCL为高,SDA一直为低 原因:当单片机正在和E2PROM通信,如果主正好发生打算发第9个时钟,此时SCL为高,而从开始拉低SDA为低做准备(作为ACK信号),等待主SCL变低后,从再释放SDA为高。如果此时正好单片机复位,主SCL还没来得及变低,直接变成高电平,此时从还在等待SCL变低,所以一直拉低SDA;而主由于复位,发现SDA一直为低,也在等待从释放SDA为高。因此主从都进入一个相互等待的死锁状态。 解决方法:最好的方法是采用模拟i2c. 但由于已经配置成硬件i2c,
[单片机]
基于IAP的嵌入式系统升级方案
一、 需求引入 现有嵌入式设备:基于ARM Cortex-M3处理器、带以太网通讯功能。为降低设备维护成本节省宝贵的时间和金钱,需要设计网口升级固件功能。 本文描述了基于IAP和网口升级该嵌入式系统的方法,其中处理器为NXP公司的ARM Cortex-M3,开发环境为IAR Embedded Workbench for ARM。 IAP( In Applicatin Programming)在应用编程,一般指MCU可以通过通信端口(UART口、网口等)从外部接收应用程序镜像并烧录到FLASH中实现固件升级。 图1网口升级固件 二、 原理介绍 先温习下小知识:一个典型的嵌入式软件地址空间如图2所示,程序代码(RO段)
[单片机]
基于IAP的<font color='red'>嵌入式系统</font>升级方案
嵌入式脉象采集仪电路设计
脉诊作为中医最重要的一种诊断方式,具有模糊性、不确定性的特点,是近年来中医现代化研究中的热点。随着电子、计算机技术的快速进步,将嵌入式技术、 FPGA技术、IP核技术结合在一起,融合电子技术、信号处理方法等学科知识,在中医基本理论的指导下,设计脉象诊断设备,构建一个灵活高效,可扩展性强,可靠性高,功耗低,可便携的脉象采集仪具有重要的现实意义和良好的市场前景。 1 仪器总体设计 嵌入式脉象采集仪的前期设计目标是脉搏信号的采集、存储、显示、简单处理、通信等,后期要对所采集到的信号处理,得到脉象特征,对病人做出诊断。在 FPGA的选型时,不但要考虑当前功能是否够用,价格适中,而且要考虑产品的升级换代,所以设计的系统选择Alt-e
[测试测量]
嵌入式脉象采集仪电路设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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