基于CPLD的系统中I2C总结的设计
发布时间:2008/5/28 0:00:00 访问次数:532
i2c总线是philips公司推出的新一代串行总线,其应用日渐广泛。目前许多单片机都带有i2c总线接口,能方便地实现i2c总线设计;对没有i2c总线的微控制器(mcu),可以采用两条i/o口线进行模拟。在以单片机为mcu的系统中很容易实现i2c总线的模拟扩展,有现成的通用软件包可以使用。
对有些基于cpld的系统,要与带有i2c总线接口的外围器件连接,实现起来相对复杂一些。为实现系统中的i2c总线接口,可以另外引入单片机,也可以采用pcf8584或者pca9564器件(philips公司推出的专用i2c总线扩展器)进行扩展,但这样会增加系统成本,使系统冗余复杂。像altera、xilinx等一些大公司有专用的基于cpld器件的i2c总线ip核,但这些ip核的通用性不强,需要的外围控制信号较多,占用系统很大的资源,因此直接采用这种ip核不可取。 鉴于此,依照i2c总线协议的时序要求,在基于cpld的系统中开发了自己的i2c总线ip核。对于一些带有i2c总线接口的外围器件较少、对i2c总线功能要求较简单的cpld系统,自主开发ip核显得既经济又方便。 1 i2c总线的协议 i2c总线仅仅依靠两根连线就实现了完善的全双工同步数据传送:一根为串行数据线(sda),一根为串行时钟线(scl)。该总线协议有严格的时序要求。总线工作时,由时钟控制线scl传送时钟脉冲,由串行数据线sda传送数据。总线传送的每帧数据均为一个字节(8 bit),但启动i2c总线后,传送的字节个数没有限制,只要求每传送一个字节后,对方回应一个应答位(acknowledge bit)。发送数据时首先发送数据的最高位(msb)。 i2c总线协议规定,启动总线后第一个字节的高7位是从器件的寻址地址,第8位为方向位("0"表示主器件对从器件的写操作;"1"表示主器件对从器件的读操作),其余的字节为操作的数据。总线每次传送开始时有起始信号,结束时有停止信号。在总线传送完一个或几个字节后,可以使scl线的电平变低,从而使传送暂停。 图1列出了i2c总线上典型信号的时序,图2表示i2c总线上一次完整的数据传送过程。 依据i2c总线的传输协议,总线工作时的具体时序如下: 起始信号(s):在时钟scl为高电平期间,数据线sda出现由高电平向低电平的变化,用于启动i2c总线,准备开始传送数据; 停止信号(p):在时钟scl为高电平期间,数据线sda出现由低电平向高电平的变化,用于停止i2c总线上的数据传送; 应答信号(a):i2c总线的第9个脉冲对应应答位,若sda线上显示低电平则为总线"应答"(a),若sda线上显示高电平则为"非应答"(/a); 数据位传送: i2c总线起始信号或应答信号之后的第1~8个时钟脉冲对应一个字节的8位数据传送。在脉冲高电平期间,数据串行传送;在脉冲低电平期间,数据准备,允许总线上数据电平变化。 2 应用实例 2.1 实例模型介绍 现举某应用实例,要求对显示器的视频信号进行采集、处理和再显示,整个系统采用cpld器件进行控制。信号采集采用a/d公司的专用视频采集芯片ad9883ad9883,该芯片在使用前需要依据实际的功能指标进行初始化。初始化过程依靠ad9883的sda和scl两引脚进行。在系统中用cpld器件altera公司的epm3256aepm3256a实现初始化:按照i2c总线协议向ad9883的19个内部寄存器(01h~13h)写入19组固定的8位数据;第14h寄存器为只读型同步检测寄存器,仅用于检测几个关键的数据设置。 可见该i2c总线模型如下:单主操作,只实现简单的写和读操作(亦可只有写操作,只是硬件调试的时候会麻烦些),写地址连续,没有竞争和仲裁,是很简单的i2c总线系统。由此设计了如图3所示的ip核。其中,reset为复位信号,clk为系统时钟。 为了软件仿真方便,把双向数据线sda用分离的两条线模拟:sda为数据输出,sdaack为sda的应答信号。软件仿真成功后,只要把sda设置为双向,稍微修改一下程序就可以向cpld器件下载,进行实际应用。 对ad9883内部地址连续的寄存器进行初始化,i2
|