用FPGA实现I2C总线接口

时间:2022-04-23 01:46:47

[摘要]在FPGA中采用VHDL语言编写一个标准的I2C接口模块,利用该模块可以实现控制芯片如DSP芯片或者单片机与基于I2C总线接口的智能器件之间的互联。该模块利用有限状态机技术实现,程序层次清晰,资源消耗小。因此,主要讨论FPGA中I2C总线接口的设计技术。

[关键词]I2C总线VHDLFPGAIP核

中图分类号:TN4文献标识码:A文章编号:1671-7597(2009)1110006-02

一、概述

本课题其实就是一个基于I2C总线接口协议的通信程序。开发FPGA时,利用EDA工具设计芯片实现系统功能已经成为支撑电子设计的通用平台,并逐步向支持系统级的设计方向发展。利用Quartus II 4.1丰富的组件,选用VHDL语言,较好的实现了设计目标。

IP核简介:在Quartus II 4.1环境下I2C串行扩展IP核的建立。

Quartus II 4.1是美国Altera公司用于FPGA的EDA软件,内部有许多常用的宏单元,如计数器、四则运算、各类逻辑门乃至ROM、RAM等。这些宏单元内具体的参数都可以由用户来自行设定,这就是上面提到的IP核形式。它避免了重复劳动,提高了效率。

Quartus II 4.1的VHDL是Altera公司开发的完全集成于Quartus II 4.1中的一种模块化高级语言,特别适合于描述复杂的组合逻辑、组运算、状态机和真值表。利用VHDL,直接生成IP核。

设计的最终目标是生成如图1所示的Symbol。通过输入数据来达到控制SDA和SCL的目的,将信号按要求的时序传送给I2C器件。

二、实现方法

(一)软件总体结构

I2C器件可以工作于主件(Master)模式和从件(Slaver)模式,但I2C总线上同时只能有一个主件和多个从件,每次传输规定由主件发起,通过从件地址(Slaver Address)访问从件。I2C控制核主要任务是接收DSP发来的控制信号、命令及数据;发送由从设备读出的数据和确认位到DSP;以及两种模式下都能实现I2C控制核与DSP的中断通信机制;提供当前I2C控制核的工作状态。

I2C器件可以通过I2C控制核连接到I2C总线上,进行读、写操作。I2C总线的读、写操作过程如下:

写过程(S:开始,P:停止,-S:从设备,-M:主设备,W:写位,R:读位)

假设在单主方式的I2C总线系统中,总线上只有一个单片机,其余都是带I2C总线的器件。由于总线上只有一个单片机成为主节点,单片系统永远占据了总线,不会出现竞争,主节点不必有自己的节点地址。只要每个器件有自己的器件地址,先采用两根I/O口线SCL(时钟线)和SDA(数据线)虚拟I2C总线接口,等全部程序调试通过之后在把两根线用一根inout属性的I/O口线代替。总线上传送的每一帧数据均为1个字节。DSP的地址总线位数较多,最高位一般使用不到,所以将DSP的地址位的最高位作为启动信号。因为启动总线后,要求每传送1个字节后,对方回应一个应答位。在发送时,首先发送最高位。每次传送开始有起始信号,结束时有停止信号。在总线传送完1个字节后,可以通过对时钟线的控制,使传送暂停,这时可在应答信号后使SCL变低电平,控制总线暂停。

(二)I2C模块的状态转换

根据I2C协议中传输过程的特点,在编程过程中将整个数据传输过程用状态机来实现。I2C模块可以划分为开始条件模块、字节发送模块、字节接收模块、停止条件模块。其中,字节发送模块、字节接收模块和停止条件模块为基本模块。在开始条件模块中,因为需要发送从器件地址,所以要调用字节发送模块。另外,在主件(Master)模式下,由于每个数据传输完从机需要一定时间接受处理,所以还设置了一个中断模块。其状态转换图见图2。

(三)I2C模块的设计与实现

1.以主件(Master)模式下的数据传输为例,见仿真图3和图4。

开始条件模块:当DSP的地址位的最高位(启动信号)出现高电平时,即意味着数据传输的开始。I2C模块输出一个开始信号,即在SCL为低电平时SDA产生了一个从高电平到低电平的跳变。

字节发送模块:主机发送从机的地址到I2C总线,如果能搜寻到地址相符合的从机,则从机会通过SDA线返回一个响应信号,如不能则返回到停止模块。还有如果主机作为发送机,它的作用就是把DSP器件的并行数据转换成一位一位的串行输出到SDA线上。

字节接收模块:当主机作为接收机时,它从SDA线上接收数据并把它转换成8位字节同时输出给DSP器件。

停止条件模块:当无法搜寻到从机或者发送数据没有响应时,就会返回到停止状态。在I2C总线协议中,停止信号就是在SCL为高电平时SDA出现一个从低电平到高电平的跳变。

2.以从件(Slaver)模式下的数据传输为例,见仿真图5和图6。

在这个模式下,内部时钟不起作用,主要是依SCL为准。这就带来了一个延时的问题,也就是说在SCL信号的上升沿来到之后相应的信号才会发生变化,这明显是不符合协议上在SCL信号高电平时SDA不能发生跳变的要求。

为了解决这个问题,可采用SCL信号的下降沿作为触发信号,使在一个模块结束的那个SCL信号的下降沿,就跳到下一个模块,而不是等到另一个SCL信号的上升沿。

开始条件模块:当监测到在SCL为高电平时SDA出现一个从高电平到低电平的跳变,就使内部的一个全局使能信号为高,从而启动内部的进程。

字节发送模块:当主机要求读出数据时,它就把从机的并行数据转换成串行数据发送到SDA线上。

字节接收模块:作用一是接受发送来的地址信息,如果地址符合,那就转到读或写进程,如果不是本从机,就直接转到停止模块。作用二是接受SDA线上发送来的数据,并把它转换成八位的数据并行输出。

三、小结

软件完成后,对软件的主从模式和各个模式下的读写进程都进行了模拟仿真测试.假设微控制器为主机,产生开始和停止信号及中断信号,DSP器件为从机,产生响应信号,两者各通过一个I2C控制核连接到I2C总线上,同步进行数据读写,SCL频率由主机决定。由仿真结果(见上图)得出系统比较稳定,工作正常,可以按要求显示。这进一步验证了采用FPGA开发的IP核完全可满足I2C总线的时序要求,能实现I2C总线的功能。

参考文献:

[1]于枫、张丽英、廖宗建,ALTERA可编程逻辑器件应用技术,2004.09.

[2]何立民,单片机高级教程,北京:北京航空航天大学出版社,2007.

[3]赵曙光,可编程逻辑器件原理、开发与应用,西安电子科技大学出版社,2004.

作者简介:

俞金强(1963-),男,汉族,江苏无锡人,高级工程师,就职于南京信息职业技术学院,研究方向:电力保护通信。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

上一篇:基于AD9850的频率特性测试仪 下一篇:分球入箱问题的常规与特殊解法探究