摘要:为了扩展I2C总线(Inter IC BUS)外围器件的使用范围,设计出了虚拟I2C总线软件包VIICC1.0,介绍了它的1个应用实例。结果表明:该软件包具有可靠的性能和广泛的适应性,有利于I2C接口器件在不带I2C总线接口的微控制器(MCU)系统中的应用。
关键词:I2C总线单片机程序设计
一、 I2C总线简介 串行扩展总线在单片机系统中的应用是目前单片机技术发展的一种趋势。在目前比较流行的几种串行扩展总线中,I2C总线以其严格的规范和众多带I2C接口的外围器件而获得广泛的应用。 I2C总线是PHILIPS公司推出的芯片间串行传输总线。它以1根串行数据线(SDA)和1根串行时钟线(SCL)实现了全双工的同步数据传输。随着I2C总线研究的深入,它已经广泛应用于视/音频领域、IC卡行业和一些家电产品中,在智能仪器、仪表和工业测控领域也越来越多地得到应用。 I2C总线的广泛应用是同它卓越的性能和简便的操作方法分不开的。I2C总线的特点主要表现在以下几个方面: (1) 硬件结构上具有相同的硬件接口界面。I2C总线系统中,任何一个I2C总线接口的外围器件,不论其功能差别有多大,都是通过串行数据线(SDA)和串行时钟线(SCL)连接到I2C总线上。这一特点给用户在设计应用系统中带来了极大的便利性。用户不必理解每个I2C总线接口器件的功能如何,只要将器件的SDA和SCL引脚连到I2C总线上,然后对该器件模块进行独立的电路设计,从而简化了系统设计的复杂性,提高了系统抗干扰的能力,符合EMC (Electromagnetic Compatibility)设计原则。 (2) 总线接口器件地址具有很大的独立性。在单主系统中,每个I2C接口芯片具有惟一的器件地址,由于不能发出串行时钟信号而只能作为从器件使用。各器件之间互不干扰,相互之间不能进行通信,各个器件可以单独供电。MCU与I2C器件之间的通信是通过独一无二的器件地址来实现的。 (3) 软件操作的一致性。由于任何器件通过I2C总线与MCU进行数据传送的方式是基本一样的,这就决定了I2C总线软件编写的一致性。 (4) PHILIPS公司在推出I2C总线的同时,也为I2C总线制订了严格的规范,如:接口的电气特性、信号时序、信号传输的定义等。规范的严密性,结构的独立性和硬、软件接口界面的一致性,极大地方便了I2C总线设计的模块化和规范化,伴随而来的是用户在使用I2C总线时的“傻瓜”化。 一、开发虚拟I2C总线软件包的必要性 所谓的虚拟I2C总线是指借用MCU的2根通用I/O口线来虚拟I2C总线接口,而用软件来实现I2C协议的一种总线虚拟方式。 虚拟I2C总线软件包的产生及其应用是由虚拟I2C总线的广泛需求和I2C总线的特点来决定的。其原因和应用现状主要表现在以下几个方面: (1) 有大量的外围接口器件,如PCF8574、PCF8591、CAT24WC256C等都带有I2C接口。可是带I2C总线接口的MCU却不多,例如AT89C52、8051、68HC05和68HC11等都不带I2C总线接口。虚拟I2C总线的产生大大地扩展了I2C总线外围器件的应用范围。 (2) PHILIPS公司为了将I2C总线器件应用到不带I2C接口的MCU系统中,推出了PCF8584作为不带I2C接口的MCU与I2C总线连接的转接器。但是,在一些小型的单片机应用系统和对时序要求不是很严格的系统中,这种做法不仅会增加硬件成本,而且会增加线路的复杂性,不利于实现系统设计的最简化和最优化。 (3) 如简介所述,I2C总线在进行数据传输方面,对于不同的I2C器件具有相同的操作模式,遵循相同的规范,这就为I2C总线的软件虚拟提供了实现的可能性。 (4) 通过查阅近几年I2C总线应用方面的资料,发现虚拟I2C总线有了一定程度的应用。但是,在应用的过程中也有一些不尽人意的地方,如:大多数I2C总线操作程序都是针对具体的器件,按照I2C总线协议从最基本的时序编写的;I2C协议的复杂性和不同器件的互异性决定了一个程序一个样,可移植性较差,给I2C总线的应用造成了不应有的障碍。因此,I2C总线的用户只有转变观念,将I2C总线的应用开发由板凳模式变成平台模式,才能够为I2C总线应用范围的进一步扩大产生更大的推动作用。 基于此,本文将虚拟I2C总线软件包VIICC1.0公布出来,希望它能够给I2C总线应用人员提供一些帮助。 二、 虚拟I2C总线软件包VIICC1.0 I2C总线是一种多主系统总线,总线上可有多个MCU,因此有4种工作方式:主发送、主接收、从发送和从接收。虚拟I2C总线软件包VIICC1.0虚拟了单主系统的I2C总线,即主发送和主接收。不过,在实际应用中,单片机应用系统绝大多数是单主系统,因此它不会影响虚拟I2C总线软件包的广泛应用。 虚拟I2C总线软件包VIICC1.0是用Franklin C51编写的。它由1个头文件和1个源程序组成。头文件(VIICC.H)的清单如下:
三、 虚拟I2C总线软件包VIICC1.0应用界面
在应用VIICC1.0时,用户要做的工作是:
(1) 将虚拟I2C总线软件包的头文件复制到Franklin C51编译器的..\c51\inc目录下;
(2) 将上面介绍的源程序复制到应用系统主程序的末尾;
(3) 在主程序的最上面添加如下1条指令: #include <VIICC.H>
做完上面的工作后,用户就可以自如地使用这个软件包了。在使用时,用户不必关心I2C外围器件功能如何,都使用下面的几条指令:
rdnbyt(uchar slar,uchar qq[],uchar number); 或:wrnbyt(uchar slaw,uchar ff[],uchar number); 其中:slar/slaw是从器件的地址(读/写);
number是需要读写的数据字节的个数;
qq[]是从虚拟I2C总线上读出的数据数组;
ff[]是需要向虚拟I2C总线上写入的数据数组。
VIICC1.0占用资源与VIIC1.0(见《单片机与嵌入式系统应用》2001年第2期上的相应文章)占用资源基本上一样。由于VIICC1.0的设计是基于12MHz的时钟设计的,因此当晶振频率发生变化时,须要在头文件中适当修改nop ( )的个数。另外,当所使用的通用I/O口线发生变化时,须要在头文件中对SDA与SCL的宏定义进行修改。
四、c虚拟I2C总线软件包 在CAT24WC256C中的应用
CAT24WC256C是CATLYST推出的可直接和MCS-51接口的E2PROM。它遵循I2C总线协议,使用SDA和SCL双总线进行数据通信。 CAT24WC256C是256K位(32KB)的串行CMOS E2PROM,有1个64字节的页写缓冲器。它能在1.8~6.0V的宽电压范围内工作,实现了写保护功能,即当其WP引脚为高电平时进入写保护状态。CAT24WC256C的引脚分配及其定义如图1所示。
图1 CAT24WC256C的引脚分配及其定义
从图1中可以看出,在单主系统中,由A1和A0地址译码最多可以接4片CAT24WC256C器件,即最多可扩展128KB的E2PROM。由于它不能发出串行时钟信号和启、停信号,因此,只能作为从器件被操作。 CAT24WC256C的器件地址格式为:
1
0
1
0
0
A1
A0
R/W
这个器件地址的最高5位固定为10100,A1和A0为器件的地址,这些位必须与硬件连线输入脚A1和A0位相对应,最低位(R/)为读写控制位,“1”表示对器件进行读操作;“0”表示对器件进行写操作。CAT24WC256C收到起始信号和从器件地址字节后,比较从器件地址,如果发现与其自身地址相符合,则响应1个应答信号,然后根据(R/)位来进行读/写操作。
CAT24WC256C的写操作中有2种方式:字节写或页写,它们的本质是一样的,不同的是所传输的数据字节数不同,例如页写时序如下:
CAT24WC256C的读操作有3种方式:立即/当前地址读、随机读和连续读。立即地址读与随机读基本上是一样的,不同的是立即读的地址是上次进行操作的地址+1;随机读可以由用户随意指定1个地址;连续读可以对1个存储区进行多个字节的连续读。以连续读为例,它的操作时序如下:
在操作中要注意页的自动翻转问题,解决页自动翻转问题的方法是在页操作中不要一次传输超过64个字节的数据。
虚拟I2C总线软件包VIICC1.0在CAT24WC256C中应用的电路原理图如图2所示。
图2 虚拟I2C总线软件包 在CAT24WC256C中的应用原理图 在这个应用实例中,首先向CAT24WC256C中起始地址为0x0080连续存储区中写入64个字节的数据,然后再将这64个字节读出来,放在输出数组中,下面是部分源代码。 ……
点击下载代码
结束语
虚拟I2C总线软件包VIICC1.0在作者的多项科研工作中得到应用,运行效果良好,表明该软件包具有可靠的性能和广泛的适应性,具有一定的参考价值。MES
参考文献
1 何立民. I2C总线应用系统设计. 北京:北京航空航天大学出版社,1995
2 何立民. 单片机高级教程. 北京:北京航空航天大学出版社,2000
3 王晶晶,容太平. IC卡中I2C BUS设计及其在仪表中的应用. 仪表技术,1999(2):32~34
4 周军,张瑞兰. PCF8584 I2C总线扩展器的应用. 电测与仪表,1998(10):36~38
