基于 VxWorks 的 IIC 驱动程序的设计与实现
马媛媛 ,熊刚
1 北京邮电大学计算机系,北京(100876)
摘要:在嵌入式系统开发时,为了设计出稳定可靠的驱动程序,不仅需要人们的编程能力,
更需要人们了解硬件设备的工作原理以及熟悉整个系统的体系结构。所以本文首先介绍了
IIC 的工作原理,并详细描述了 IIC 的读写操作时序,IIC 的读写操作都是严格按照时序图
来进行的。然后分析了嵌入式 VxWorks 系统下设备驱动程序设计的技术难点及解决办法,并
描述了字符设备驱动程序所包含的基本操作。最后介绍了基于芯片 AT24C254 型号的 EEPROM
设备和 IIC 总线驱动程序的实现步骤,其中 IIC 总线初始化模块和打开释放模块中牵涉到很
多寄存器的配置,需要参照硬件设备的使用手册;而读写模块则是严格按照时序图来编写的。
关键词:IIC 总线,EEPROM,驱动程序,操作时序,寄存器
中图分类号:TP39 计算机的应用
1 引 言
IIC总线是荷兰飞利浦公司开发的一种高效、实用、可靠的双向二线制串行数据传输结
构总线。IIC总线由SDA(串行数据总线)和SCL(串行时钟线)构成。SDA用于数据传输,SCL
用于指示什么时候数据线上是有效数据[1]。由于连接线少和连接引脚少,因此构成了器件总
线简单、结构紧凑、系统修改和扩展性好。即使不同时钟速度的器件连接到总线上,也能方
便的确定总线上的时钟,因此在嵌入式系统中得到了广泛的应用[5]。在我们的系统中,我们
通过IIC总线让MPC8270[6]与EEPROM交换数据。实现将数据写入EEPROM里存储起来,同时也能
将数据从EEPROM里读出来。
2 工作原理
IIC 总线的工作原理
在嵌入式系统中的IIC总线采用主从模式工作,一般处理器是总线上的主机,其它是从
机。IIC总线上可以同时接多个从机,每个从机都有唯一的地址。[4]
IIC总线主从机之间的一次数据传输称为一帧,由启动信号、地址码、若干数据字节、
应答位以及停止信号构成。通讯启动时,主动发送一个启动信号(当SCL 线上是高电平时,
SDA 线上产生一个下降沿)、从机的地址码(8 位)和读写信号;[5]通讯停止时,主机发送
一个停止信号(当SCL 线上是高电平时,SDA 线上产生一个上升沿)。在数据传送过程中,
当SCL线上是高电平时,必须保证SDA 线上的数据稳定;传送一个字节的数据,必须由接收
-1-
方发一个应答信号。图 描述了IIC的实时传输过程。
IIC 总线拥有一个独立、可编程的波特率产生器(BRG),它是由 CPM 时钟产生的。
总线的传输速率为 100kbPs (标准)~400kbps (高速)。(在我们的系统中速率接近
400Kbps)采用十 5V 电源供电。
IIC 总线写操作时序
IIC总线写操作有两种方式:字节写和页面写。字节写是指:每次在指定位置写入一个
字节的数据。其操作过程如图 (a)。首先主机(如:MPC8270 CPM)向从机(如:EEPROM)
发送开始信号和从机的设备地址和写标志,然后等待应答信号;当应答信号到达后,发送一
个从机的内部地址,然后再次等待应答信号;应答信号到达后立即发送数据,当下一个应答
信号到来后发送停止信号。页面写和字节写的的操作很类似,主机在发送完第一个字节的数
据后不发送停止信号,而是继续发送数据,直到结束在发停止信号。[7]我们在传送大量数据
时,基本上都采用页面写的方式。页面写的操作过程如图 (b)
-2-
IIC 总线读操作时序
IIC总线读主要也有两种方式:当前地址读和指定地址读。当前地址读的操作过程如图
(a),其当前地址表示最近一次读或写时的地址,只要芯片带电,此地址一直有效。首
先主机(如:MPC8270 CPM)向从机(如:EEPROM)发送开始信号和从机的设备地址和读标
志,然后等待从机的应答信号;当收到应当信号后就可以从当前地址读数据了,接收完数据
后主机就可以发送一个停止信号了[7]。指定地址读的操作过程如图 (b),它的读方式和
当前地址读很相似,只是需要多发一个地址信息过去。
Current
AddressRead
S
T
A
R
T
Device
Address
0
R
E
A
D A
C
K
DATA
N
O
A
C
K
S
T
O
P
图 (a) 当前地址读时序
Random Read
S
T
A
R
T
Device
Address
0
W
R
I
T
E
A
C
K
1st ,2ndWORD
ADDRESS n
A
C
K
S
T
A
R
T
图 (b) 指定地址读时序
Device
Address
R
E
A
D A
C
K
DATA n
N
O
A
C
K
S
T
O
P
3 嵌入式 VxWorks 驱动程序的框架
在VxWorks系统中输入/输出设备从宏观上被分为 3 种类型:字符设备、块设备和网络设
备。依据设备的类型,驱动程序的管理也被划分成三种模块:字符设备驱动程序模块、块设
备驱动程序模块、网络设备驱动程序模块[1]。每个模块对应一种设备类型,而每个模块中不
同的设备包含的功能不一样,用户可以根据自己的需要在VxWorks下,创建不同的功能模块,
实现系统的高性能和可裁剪性。
在嵌入式 VxWorks 系统中设备的驱动程序是 BSP 的一部分,完成了对设备初始化、读、
写操作和控制等功能。驱动程序是直接控制设备的那部分程序,也是设备上层的一个软件接
口。设备驱动程序的功能是对I/O进行操作,实际上从软件角度来说就是对I/O端口地址进行
读写操作[2]。只要系统访问设备就会调用驱动。从这一点可以看出,驱动程序不能自动执行,
只能被系统或应用程序调用。
在VxWorks应用程序中,系统访问设备是通过VxWorks的I/O子系统操作的。对于字符设
-3-
备和块设备VxWorks的I/O系统提供一些标准的I/O接口函数。这样设计的优点是应用程序开
发人员在编写应用程序时不必关心底层设备硬件,也就是通常所说的屏蔽底层硬件[1]。
对于一个字符设备来说驱动程序包含了 7 种基本I/O操作函数:creat()、remove()、
open()、close()、read()、write()和ioctl()[3]。当然有些设备并不支持其中的某些操作,
可以在实现的时候将其省略。
4 驱动程序的设计
IIC 设备(属于字符设备)驱动程序按功能可分为 5 个主要模块:初始化、打开、释放、
读和写模块。在 POWERPC 嵌入式系统中,连接在 IIC 总线上的设备必须按照 IIC 总线时序传
输。IIC 在读写时有几种时序,但在各种时序中,数据传输的开始和结束操作都是相同的。
所以驱动程序的初始化、退出处理、打开和释放模块都相同。不同的时序只是读和写方式有
所区别,因此要设计不同的读和写模块。
下面介绍一下基本的模块:
IIC 总线初始化模块
IIC 总线的初始化包括以下几个方面
①:对IIC通信端口的配置。其中包括PODRD、PPARD 、PSORD 、PDIRD[6];
②:对 IIC 的 DPRAM 的配置:先为 IIC 分配一段存储区域,并将首地址存入 IICbase 的
parameter ram 中;然后在分配的区域里分配存 parameter ram 的 64 bytes;同时分配
所需的传送 BD 和接收 BD;最后分配了一个传送 buffer,用于缓存需要传送的数据。由
于 DPRAM 的空间十分有限,我们可把接收 buffer 放在外面申请了;
③:配置 IIC 的寄存器,其中包括 I2MOD、I2ADD、I2BRG、I2CER/I2CMR、I2COM;
④:配置 CPCR,它是 IIC 传送和接收数据的一个命令,用于初始化传送参数以及接收数据
时的参数,并且控制接收 BD 的转移以及关闭。
IIC 总线的打开及释放模块
IIC 的打开和释放做在一个函数里,其中包括:
配置 IIC 寄存器,让 IIC 总线处于可用状态并让其开始传输数据,等待数据传送完毕。
然后关闭 IIC 总线,将 IIC 总线释放掉。
其中最重要的寄存器为 I2MOD 和 I2COM。在 MPC8270 里,I2MOD 的偏移地址为 0x11860,
它的第七位用来控制 IIC 是可用还是不可用,即使用 IIC 时将第七位设为 1,关闭时将其设
为 0。I2COM 的偏移地址为 0x1186c,它的第七位用来控制数据传送的开始,第 0 为用来 IIC
是作为 master 还是 slave。
-4-
IIC 总线的写模块
系统选择了AT24C256[7]型号的EEPROM,该芯片有 8 个管脚,其中 5(SDA)、6(SCL)管
脚与处理器上的IIC总线管脚相连,其连接电路如图 ,其中PD14、PD15 是MPC8270 CPM
的管脚。
PD14
VDDVDD
U10
AT24C256
SOIC8_AT24C256
VCC 8
SCL
6
NC11
NC3
3 WP
7
SDA
5
GND
4
NC2
2
R108
�
VDD
GND
GND
PD15
图 eeprom 连接布置图
SCL 提供连续的时钟,SDA 提供双向的数据传输。由于总线上只有一个 EERPROM,所以
设备地址线 NC1、NC2 接地。其固定的设备地址(Device Address)如图 ,其中最低
位表示读写标志,读为 1,写为 0。
图 eeprom 设备地址
程序中为了满足大量数据写入 EEPROM,我们采用了页面写的方式,只要传送的数据在
传送 BUFFER 的范围以内就可以了。由于 DPRAM 的大小在存储器里是有限的,所以我们将传
送 BUFFER 的大小配置为 256bytes。当要进行写操作时,先要对总线初始化,然后按照 IIC
总线写 EEPROM 的时序图,将地址和数据放入相应的 DPRAM 中,并配置好相应的 BD 状态,最
后将 IIC 寄存器的状态配置成传输数据状态。数据就从 DPRAM 的 BUFFER 中传入 EEPROM 中。
写操作完成后 BD 的状态恢复成初始的状态。
对 EEPROM 写时,要注意分页的处理。EEPROM 每页的大小为 64bytes。如果所写的数据
超过页边界且一直写下去,指针将会回到当页的起始地址。所以当数据到达页边界时,要重
新调用一次写操作来执行下一页的数据的写处理。
具体的函数实现如:
/* write to eeprom*/
int i2c_write_to_eeprom(UINT16 addr,UINT8 *buffer, int len)
{————
i2c_init(0x00);//IIC 总线的初始化
i2c_newio(&state);//传送 BD(buffer describal)的初始化
-5-
————
//配置需用到的 BD
————
i2c_doio(&state);//打开 IIC 总线传送数据,数据传完后释放 IIC 总线
————
}
IIC 总线的读模块
程序中采用了指定地址读的方式进行读操作。由于 DPRAM 空间有限,我们的接收 BUFFER
在外部申请的。和写操作相似,先对总线初始化,然后按照 IIC 总线读 EEPROM 的时序图,
将设备地址、目的地址和读写标志放入相应的 DPRAM 中,并配置好相应的 BD 状态,最后将
IIC 寄存器的状态配置成传输数据状态。数据就从 EEPROM 读入我们申请的接收 BUFFER 里。
读操作完成后 BD 的状态恢复成初始的状态。
在读 EEPROM 时,每次读文件的大小不能超过 I2C_RXTX_LEN(接收 buffer)的大小。如
果超过了,则分批读,直到读完。
具体的函数实现如下:
int i2c_read(UINT16 addr,UINT8 *buffer,int len)
{————
i2c_init(0x00);//IIC 总线的初始化
i2c_newio(&state);//传送 BD(buffer describal)的初始化
————
//配置需用到的 BD
/*set first send bd*/
————
i2c_doio(&state);//打开 IIC 总线传送数据,数据传完后释放 IIC 总线
————
}
5 结论
以上程序在 POWPC 的 MPC8270 的板子上进行了测试,性能稳定可靠。本文的创新点
是:详细描述了IIC的工作原理以及读写的时序,根据时序快速设计出IIC总线设备的驱动程
序,并且对驱动中IIC的一些寄存器做了相应的描述。只要仔细分析硬件的工作时序,并结
合驱动程序框架,就可以设计出性能稳定可靠的驱动程序。[1]
-6-
参考文献
[1] 周启平,张杨.《VxWorks 下设备驱动程序及 BSP 开发指南》[M] .北京:中国电力出版社,.
[2] 邝坚.《Tornado/VxWorks 入门与提高》[M]. 北京:科学出版社,2004.
[3] WindRiver.《VxWorks BSP 开发人员指南》[M].北京:清华大学出版社,2003.
[4] 张文甲.《IIC 总线通信中主机控制器的设计与应用》[J] .网络通讯与安全,2006-12.
[5] 俞伟.《IIC 总线控制器 IP 核设计》[J] .世界科技研究与发展,2005,2(2):37-40.
[6] MPC8280RM.《MPC8280 PowerQUICC II Family Reference Manual》[S] .
[7] AT24C128/256.《2-wire Serial EEPROMs》[S].
Design and Implementation of IIC Driver Based on Vxworks
Ma Yuanyuan ,Xiong Gang
1 Department of Computer Science and Technology,Beijing University of Posts and
Telecommunications,Beijing,PRC,(100876)
Abstract
In embedded system developping, in order to design out the driver stabilizing reliably, it not only
needs people's programming ability, more requires that people know hardware equipment
operating principle and entire systematic system structure very well. Therefore the main body of
the paper has introduced IIC's operating principle first, and described the IIC read-write handling
sequence and in detail .The IIC’s read-write operating has been handled being strictly according to
being in progress coming sequence picture. And then analyses the way implanting the technology
difficult point that equipment drives programming under dyadic VxWorks system and solving,
basic operation contained by the driver having described the character equipment. The step having
introduced chip AT24C254 type-based EEPROM equipment and IIC highway driver realization
finally , IIC highways among them INIT the module sum opens up the allocation being involved
in many registers in releasing a module , need to consult the hardware equipment sigmatism
handbook; But, the read-write module is to come to compile and compose strictly according to
sequence picture then.
Keywords:IIC bus,EEPROM,Drivers,Handle sequence,Register
-7-
基于VxWorks的IIC驱动程序的设计与实现
IIC总线的工作原理
IIC总线写操作时序
IIC总线读操作时序
IIC总线初始化模块
IIC总线的打开及释放模块
IIC总线的写模块
IIC总线的读模块
Text1:
Text2: