fpgaw 发表于 2010-5-12 03:58:16

如何用CPLD实现I2C总线通信接口

本帖最后由 fpgaw 于 2011-1-18 04:40 编辑

介绍采用ALTERA公司的可编程器件,实现I2C总线的通信接口的基本原理;给出部分VHDL语言描述。该通信接口号专用的接口芯片相比,具有使用灵活,系统配置方便的特点。
I2C总线是PHILIPS公司开发的一种简单、双向二线制同步串行总线。它只需要两根线(串行时钟线和串行数据线)即可在连接于总线上的器件之间传送信息。该总线是具备多主机系统所需要的包括裁决和高低速设备同步等功能的高性能串行总线,应用极为广泛。 目前,虽然市场上有专用I2C总线接口芯片,但是地址可选范围小,性能指标固定,功能单一,而且使用不方便。针对I2C总线的电气特性及其通信协议,采用ALTERA公司的FLEX10K系列ISP器件EPF10K10LC84-3,可以方便地实现I2C总线的通信接口,且具有高速、易调试、可以灵活地实现在线配置等优点,同时大大减少了系统的开发周期。
1 I2C总线的数据传输规范 I2C总线主从机之间的一次数据传送称为一帧,由启动信号、地址码、若干数据字节、应答位以停止信号组成。通信启动时,主机发送一个启动信号(当SCL线上是高电平时,SDA线产生一个下降沿)、从机的地址码和读写信号及8位读写数据;通信停止时,主机发送一个停止信号(当SCL线上为高电平时,SDA线上产生一个上升沿)。在数据传送过程中,当SCL线上为高电平时,必须保证SDA线上的数据稳定;传送一个字节的数据,必须由接收机发一个应答信号。总线的传输码速率为100Kb/s(标准)~400Kb/s(高速)。采用+5V电源时,输入电平规定为VILmax=1.5V,VIHmin=3V;采用宽电源电压时,电闰规定为VILmax=1.5VDD,VIHmin=3VDD。 I2C总线的通信过程如图1所示。 2 ISP的逻辑实现 基于上述传输规范,为完成I2C总线的数据发送与接收,ISP芯片应完成的逻辑功能如图2所示。可控时钟通过频选,控制获得100kHz、200kHz、300kHz、400kHz的时钟频率;同时在器件退出总线竞争后,将时钟线置高电平。 (1)通信的启动与停止 在主机方式下接收数据时,器件必须通过启动信号生成器送出一个启动信号,然后,发送从机的地址信号和读写信号,才能开始在总线上发送数据。该过程由控制寄存器启动。VHDL描述为: PPROCEE(WR,CS) ——WR IS CPU WRITE SIGNAL ——CS IS THIS CHIP's SELECT SIGNAL ADDRS:='0' IF(Ctrreg(0)='1'AND Ctrreg(3)='1'AND SCL1='1' THEN ——Ctrreg为控制寄存器 CLK1COUNT:='0'; ADA1:='1'; IF(CLK1'EVENT AND CLK='0'THEN IF (CLK1COUNT='3'THEN SDA1:='0'; ADDRS:='1'; Ctrreg(3):='0'; CSTA='1'; ELSE CLK1COUNT:=CLK1COUNT+1; END IF; END IF; END IF; IF(ADDRS='1'AND SCL1'EVENT AND SCL1='1') THEN · · ·——将数据寄存器中的数据及WR信号移位发出(略) · · · END IF; END PROCESS; 当一次通信结束时,主机要发送停止信号。读过程同样由控制寄存器控制。当控制字的第二位为“1”时,芯片产生停止信号。VHDL描述与启动类似。 (2)发送数据 主机方式下完成启动和地址信号发送后即开始发送数据。发送数据时并串转换器在SCL的下降沿移位,保证了SCL高电平时SDA上的数据稳定。发送的进程由WR信号和从机的应答信号启动。 当该芯片在总线竞争失败的情况下,由处理器将芯片转为从机的工作方式时,处理器向地址检测电路发送该芯片在系统中的地址。只有在接收到的地址信息与该芯片所设的地址相同时才发出应答信号开始通信。每发送一个字节即将SDA拉高,等待接收机的应答信号,准备下一个数据。
(3)接收数据 在主机方式下完成通信启动和地址信号发送后,开始准备接收数据。在每接收一个字节后要发出应答信号,每接收一个字节就产生一个负脉冲作为中断请求信号输出给处理器。若此时系统忙,则拉低SCL电平迫使发送机进入等待状态。从机方式下的接收与主机的一样。 VHDL描述为: PROCESS(SDA1) SACK:='0'; FULL1:='0'; STP:='0'; INTQ:='1'; IF(CSTA='1'AND ADDOK='1') THEN IF(SCL1'EVENT AND SCL1='0') THEN ······——接收数据,串入并出移位(略) FULL1:='1'; END IF; END IF; IF(FULL1='1')THEN IF(RD'EVENT AND RD='1'AND SCL1'EVENT AND SCL1='0'AND BUSY='0')THEN SDA1:='0'; FULL1:='0'; INTQ:='0'; ELSE SDA1:='1'; IF(CLK1'EVENT AND CLK='0'AND FULL1='0')THEN IF(CLK1CONT='20')THEN INTQ:='1'; CLK1COUNT:='0'; ELSE CLK1COUNT:=CLK1COUNT+1; END IF; END IF; IF(SLAVE='1'AND SCL='1'AND SDA'EVENT AND SDA'1')THEN STP:='1'; CSTA:='0'; END IF; END IF; END PROCESS; (4)总线仲裁 在通信过程中,芯处在发送的同时接收总线上的数据,将该数据与已发送的数据进行比较。若不相同,则给状态发生器的SLAVE置位,表示该主机退出竞争。通过处理器给控制寄存器发送控制字可以让芯片转入从机工作方式。这时启动地址检测,禁止SCL的发送。当一次通信结束后,再将状态生成器的END置位。此时处理器可以再次将芯片设置为主机方式。 (5)控制寄存器与状态生成器 控制寄存器主要是定义芯片的工作状态,其各位的定义为: BUSY   CLKEN CLKS2 CLKS1 STA STP M/S BUSY:若该位为“1”,主机在作为接收机时,不发应答信号。 STA:启动信号位。 STP:停止信号位。 M/S:主从机位,用于选择芯片工作状态(主机还是从机)。 CLKS1、CLKS2:频选控制位。 CLKEN:SCL使能位,该位为1时SCL置高电平。 状态生成器可以生成工作状态信号(中断、I2C总线竞争情况、从机方式时通信开始与结束)供处理器查询处理。 3 参数配置 该芯片可以配置为从100Kb/s(标准)~400Kb/s(高速)的任何传送速度,以满足不同的需要。只需在VHDL描述的构造体中的指明配置的参数即可,非常方便。 结束语 本设计中只使用了一片可编程芯片即完成了I2C总线接口的芯片功能。由于采用VHDL-93语言进行设计,具有良好的可移动植性,可用于其它ISP厂家的产品中。通过ByteBlast下载线可以在线改变其功能,体现了ISP器件的优越性。

zhangyukun 发表于 2018-12-3 09:16:03

如何用CPLD实现I2C总线通信接口

雷磊 发表于 2023-2-23 16:06:20

静态时序分析资料
http://www.fpgaw.com/forum.php?mod=viewthread&tid=113347&fromuid=54563
(出处: 集成电路技术分享)

dameihuaxia 发表于 2023-2-24 09:14:45

基于VHDL的4PSK的设计与实现
http://www.fpgaw.com/forum.php?mod=viewthread&tid=419&fromuid=58166
(出处: 集成电路技术分享)

dameihuaxia 发表于 2024-8-26 09:30:32

Altera FPGA管脚弱上拉电阻的软件设置方法
http://www.fpgaw.com/forum.php?mod=viewthread&tid=141356&fromuid=58166
(出处: fpga论坛|fpga设计论坛)
页: [1]
查看完整版本: 如何用CPLD实现I2C总线通信接口