首页 资讯 应用 高压 设计 行业 低压 电路图 关于

通信网络

旗下栏目: 电力电子 通信网络 RFID LED

CoolRunner CPLD I2C 总线控制器的实现

通信网络 | 发布时间:2017-10-26 | 人气: | #评论# |本文关键字:总线,总线控制器,CoolRunner,CPLD
摘要:概要 本文檔描述了在Xilinx CoolRunner ™ 256-macrocell CPLD上用VHDL实现I 2 C 控制器。CoolRunner CPLD 是现有的最低功耗的CPLD,是实现I 2 C控制器的相当不错的目标器件。想要获取本文档所描述的

概要

本文檔描述了在Xilinx CoolRunner™ 256-macrocell CPLD上用VHDL实现I2C 控制器。CoolRunner CPLD 是现有的最低功耗的CPLD,是实现I2C控制器的相当不错的目标器件。想要获取本文档所描述的VHDL代码,请查阅VHDL Code Download, page 19以得知详细信息。本设计符合XPLA3和CoolRunner-II CPLD。对CoolRunner-II CPLD的版本,请参阅 XAPP385, CoolRunner-II CPLD I2C Bus Controller Implementation.

简介 I2C 总线由于其成本低廉的特性,是一种流行的二线制串行总线接口。二线制接口减少了内部联机,使得IC的引脚数目降低,也让印刷线路板上的布线数量减少。通过简单的主/从协议,每个连接到总线上的设备都具有唯一的软可编址的地址,并可达100 KHz的操作模式。

CoolRunner I2C 控制器的设计由一个异步微控制器接口和一个I2C主/从接口组成。设计成由微控制器或微处理器来使用。如图1所示。

I2基础知识

本部分将对I2C总线协议的主要内容进行简要的描述。若想获取I2C更详尽的描述与时序,请参阅I2C标准。I2C总线由两条线组成,串行资料线(SDA)和串行时钟线(SCL),它们用来在连接到总线上的设备之间传送资料。能够连接到同一总线上的最大设备数目仅由最大的总线电容400 pF来限定。SDA和SCL这两条线都是双向线,通过一长拉电阻与电源正极相连。当总线空闲时,两条线均为高电平。连接到总线的器件的输出级必须是漏极开路或集电极开路,以便实现线与(wired-AND)的功能。

每个设备都有唯一的地址并可即当作传送方又可为接收方。此外,设备还可以配置为主或从。主设备发起总线上的数据传输并生成时钟信号以允许传输。任何其它被编址过的设备被当作从设备。如果同时有多于一个的主设备试图得到总线控制权时,I2C协议定义了一个仲裁程序以保证这时只有一个可获得控制权并且不会产生坏信息。CoolRunner I2C控制器支持I2C协议中的仲裁与时钟同步程序。

I2总线上的数据传输由START条件发起,由STOP条件结束。SDA线的一般资料在时钟信号的高电平期间必须是稳定的。只有在SCL线为低电平期间,SDA线上的电平才可进行高低变化。START条件被定义为在SCL线为高电平期间的一个由高到低的唯一的状态。同样地,STOP条件被定义为在SCL线为高电平期间的一个由低到高的唯一的状态。资料、STARTSTOP的定义确保了START条件与STOP条决不可能被混淆为资料。

I2C总线的每个资料包有8位资料组成,并在这8位之后跟一确认位,因此,每个完整的数据字节需9个时钟脉冲。 最高位(MSB)在前。在确认位期间,发送方释放SDA线,与此同时,数据传输的接收方必须使SDA线保持低电平,以确认资料的接收。如果一个从接收方没有在确认位期间将SDA线保持为低电平,这就表示从接收方不能接收资料,而主器件可以生成STOP条件中止数据传输。如果是一个主接收方没有产生确认信息,则表明其示意从发送方这已经是传送的最后一个字节。

总线上,主与从之间的标准通讯由四部分组成:START,从地址,资料,STOPI2协议规定资料格式可以是7位和10位地址。Xilinx CoolRunner CPLD支持的是7位地址模式。START条件之后,发送的是从地址。这个地址有7位长,而紧随其后的第八位是R/W位。”1”表示请求资料(读),"0"表示发送资料(Write)。只有地址与主器件所发送的地址相匹配的从器件将通过在第九位时钟时将SDA线置为低电平来应答主器件。

一旦正确寻址,资料将一个字节接一个字节地按R/W位所定义的方向进行资料传送。主器件可能过生成STOP信号中断通讯并释放总线。然而,主器件可在不生成STOP条件之间再次生成START条件。这叫repeated START(rS)

CoolRunner I2控制器

CoolRunner CPLD 实现的I2控制器支持以下特性:

• 微控制器接口

 主或从操作方式

• 多主操作模式

• 软件可选确认位

 仲裁失败中断,通过自动模式由主转向从。

 调用地址相同中断,通过自动模式由主转向从。

• STARTSTOP信号的生成与检测

• rS(repeat START)信号的生成

• 确认位的生成与检测

• 忙线检测

• 100 KHz操作方式

信号描述

CoolRunner I2控制器的I/O信号如表1所示。本设计中引脚号并没有被赋值,设计者可根据系统需要自行定制。

 1CoolRunner I2控制器信号描述

名称

方向

描述

SDA

双向

I2C串行资料线。

SCL

双向

I2C串行时钟线。

ADDR_BUS[23:0]

输入

μC地址总线。

DATA_BUS[7:0]

双向

μC数据总线。

AS

输入

地址过滤。低电平有效,μC握手信号,指示当前地址总线上的地址为有效

DS

输入

资料过滤。低电平有效,μC握手信号,指示当前数据总线上的资料为有效或μC不再控制数据总线,I2C控制器可将资料置于数据总线上。

R_W

输入

/写。”1”表示读,”0”表示写。

DTACK

输出

资料传输确认。低电平有效,μC握手信号,指示I2C控制器已经为读周期将有效资料置于数据总线或者说,在一个读周期,I2C控制器已经接收到了数据总线上的资料。

IRQ

输出

中断请求。低电平有效。

MCF

输出

数据传输位。当一个字节的数据被传输完后,该位被清空。它由字节传输中的第九个时钟的下降沿来置位。该位被用来通知发送至μC的一个字节已经完成。

CLK

输入

时钟。该时钟由系统输入。该常数用来生成100KHZSCL信号,采用1.832MHZ的时钟频率。可以使用不同的时钟频率,但VHDL源代码中的常数值必须重新计算。

module i2c_blk(sda, scl, addr_bus, data_bus, as, ds, r_w, dtack, irq, mcf, clk, reset);

//I2C bus signals

inout             sda;                     //     i2c data line

inout             scl;                //     i2c clock line

//uC interface signals

input [23:0]   addr_bus;     //     uC address bus

inout [7:0]     data_bus;     //     uC data bus

input             as;                //     address strobe, active low

input             ds;                //     data strobe, active low

input             r_w;               //     read/write

output           dtack;            //     data transfer acknoweldge

output           irq;                //     interrupt request

inout             mcf;               //     temporary output for testing

//clock & reset

input             clock;

input             reset;

模块图

CoolRunner I2C控制器的模块图被分成两个主要的部分:μC接口和I2C接口,3所示。

module i2c_ctrol_blk(sda, scl, txak, msta, msta_rst, rsta, mtx, mbdr_mirco, madr, mbb, mcf, maas, mal, srw, mif, rxak, mbdr_i2c, mbcr_wr, mif_bit_reset, mal_bit_teset, sys_clk, reset);

//     I2C bus signals

inout             sda;                     //     i2c data line

inout             scl;                //    i2c clock line

//     interface signals from uP interface

input             txak;              //     value for acknowledge when xmit

input             msta;             //     master/slave select

output           msta_rst ;      //     resets MSTA bit if arbitration is lost

input             rsta;                     //     repeated start

input             mtx;               //     master read/write

input[7:0]      mbdr_micro; //      uP data to output on I2C bus

input[7:0]      madr;            //     I2C slave address

output           mbb;             //    bus busy

inout             mcf;               //     data transfer

inout             maas;            //     addressed as slave

inout             mal;               //     arbitration lost

inout             srw;               //     slave read/write

output          mif;                //     interrupt pending

output           rxak;              //     received acknowledge

inout[7:0]      mbdr_i2c;      //     I2C data for uP

input             mbcr_wr;       //     indicates that MCBR register was written

input             mif_bit_reset;//    indicates that the MIF bit should be reset

input             mal_bit_reset;//    indicates that the MAL bit should be reset

//     clock & reset

input             sys_clk;

input             reset;

module uC_interface_blk(clk, reset, addr_bus, as, ds, r_w, dtack, irq, madr, men, mien, msta, mtx, txak, rsta, mbcr_wr, mcf, maas, mbb, mal, srw, mif, rxak, mal_bit_reset, mif_bit_reset, msta_rst, mbdr_micro, mbdr_i2c, mbdr_read);

//     68000 parallel bus interface

input             clk;        

input             reset;

input[23:0]    addr_bus;

inout[7:0]      data_bus;

input             as;

input             ds;

//     Directional pins

input             r_w;        //     Active low write;

//     active high read

output           dtack;     //     Data transfer acknowledge

output           irq;

微控制器逻辑

I2C控制器的μC接口设计支持异步的宽度为字节长的总线协议。本协议是方法,通过它,μC对设计中的寄存器进行读写。如4所示。

地址译码/总线接口逻辑

CoolRunner I2C控制器中实现的μC总线协议的状态机如5所示。

在第一个周期里,将地址置入地址总线,设置读/写线为正确的状态,并表明ASDSAS指示当前地址总线上的地址为有效。如果是在写周期,μC也将资料置入数据总线,此时DS意味着总线上的资料是有效的。如果是在读周期,μC将数据总线置于第三态,而此时的DS意指CoolRunner I2C控制器可将资料置于数据总线上。

AS表明的基础上,CoolRunner I2C控制器转入ADDR状态并对地址进行译码,并确定是否是被寻址的设备。在这状态中,对内部寄存器的使能都被设置。如果CoolRunner I2C控制器已经被寻址且DS被声明,则CoolRunner I2C控制器将转入DATA_TRS状态。如果这是一个读周期,则被请求的资料被置于数据总线,而若是一写周期,则来自于数据总线的资料被锁存在地址寄存器中。CoolRunner I2C控制器将自动进入ASSERT_DTACK 状态并确定DTACK以指示被请求的资料已经准备好,若在读周期,如果是写周期,则意味着资料已经收到。

DTACK确认之后,要么,如果是在写周期,μC从总线上移除数据,要么如果是在读周期,则将资料锁存在当前的总线。读/写被设置为读,且ASDS均为负的,以表示数据传输已经完成。ASDS为负,引发CoolRunner I2C控制器使DTACK置为负值,并转入IDLE状态。

责任编辑:电气自动化网

热门文章

首页 | 资讯 | 应用 | 高压 | 设计 | 行业 | 低压 | 电路图 | 关于

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。