基于FPGA的多路I2C总线设计与实现

发布者:艺泉阁最新更新时间:2011-07-01 来源: 电子技术应用关键字:可编程逻辑门阵列  状态机  SPARTAN3A 手机看文章 扫描二维码
随时随地手机看文章
   

摘  要: 介绍了一种基于FPGA的多路I2C总线设计与实现。主要包括系统处理器、局部总线、FPGA逻辑模块、负载设备几部分,实现了从处理器局部总线到I2C协议的转换及其多路扩展,使系统具有多个I2C总线通道,且每一路I2C总线上能挂载多个不同的主设备或从设备。该系统中各路I2C总线相互独立工作,没有干扰和影响。
关键词: I2C;可编程逻辑门阵列;状态机

 I2C(Inter-Integrated Circuit)总线是由Philips公司开发的用于IC器件之间连接的二线制总线,其为双向、两线、串行、多主控接口标准,具有总线仲裁机制,非常适合器件之间近距离、非经常性的数据通信。由于其具有接口线少、控制方式简化、器件封装形式小、通信速率较高等优点,I2C总线的应用非常广泛[1]。
    在工业监控系统中需要有多路I2C总线控制器来完成温度、电压、湿度等各个方面的监控功能。但是,目前很多系统没有或者只有很少通道的I2C总线接口,使其应用受到了限制。
    基于上述技术现状,本文通过现场可编程门阵列FPGA(Field Programmable Gate Array)实现一种多路I2C总线的系统控制设计。
系统硬件设计
    FPGA作为ASIC专用集成电路领域中的一种半定制电路,可以解决定制电路的不足,又克服了原有可编程器件门电路数有限的缺点,具有设计周期短、开发费用低、保密性强、体积小、重量轻、可靠性高等特点[2]。
  本系统主要由系统处理器、局部总线、FPGA逻辑模块、负载设备几部分组成。其中系统处理器采用Freescale公司的MPC8245[3]。
    具有多路I2C总线的系统硬件设计框图如图1所示。

    处理器利用局部总线,通过地址线、数据线、读写信号线和片选信号线与FPGA逻辑模块进行通信,在FPGA内部完成I2C总线控制器的功能,实现从处理器局部总线到I2C协议的转换和多路扩展,其中每个I2C总线控制器挂载多个不同的设备,可以是主设备或从设备。
FPGA逻辑模块设计
    多路I2C总线的系统控制中,FPGA逻辑模块的设计是核心。该模块主要由三部分组成:顶层控制模块、处理器接口模块、多路I2C总线控制器模块。模块化的设计便于移植和软件重用。其中FPGA芯片采用XILINX公司的SPARTAN3A系列的芯片,开发平台为ISE10.1。
顶层控制模块
    顶层控制模块主要实现处理器接口模块与多路I2C总线控制器模块之间的连接与通信,实现整个输入输出接口到各个功能模块之间的映射。三者之间的逻辑关系如图2所示。

处理器接口模块
    MPC8245处理器接口模块主要完成MPC8245处理器与FPGA的接口功能,并实现与FPGA内部的多路I2C总线控制器数据传输的握手协议和数据交换。在MPC8245处理器接口模块中,每个I2C控制器对应有4个8位的寄存器,即数据寄存器、地址寄存器、控制寄存器和状态寄存器。
    (1)数据寄存器根据读/写信号区分,分为发送数据缓冲寄存器和接收数据缓冲寄存器,共享一个地址,数据长度为8位。
    (2)地址寄存器用来保存当前地址。当该路I2C控制器作为从节点通信时,地址寄存器中保存的是自己的地址,这个地址在总线上是唯一的。从节点接收到包头后,将其中的地址与自己的地址比较,如果一致,则响应主节点,开始传输。
    (3)控制寄存器用来控制I2C总线控制器的数据传输,按照设置产生各个协议命令、响应动作及工作模式。
    (4)状态寄存器显示当前总线的状态。通过状态寄存器中不同的状态指示,实现与MPC8245处理器的握手协议。
    MPC8245处理器利用地址线、数据线、片选信号和读写信号来与MPC8245处理器接口模块N路I2C总线控制器相关的N×4个寄存器交换数据、读取状态、作为从设备时响应的地址和控制各路I2C总线的控制器。
I2C总线控制器模块
    I2C总线控制器模块主要实现并行的I2C通信控制,每一路I2C总线控制器通过FPGA的I/O管脚连接到外部实现各自独立的I2C总线,具有主工作模式和从工作模式两种工作状态。
    I2C总线控制器主要有两个状态机:主控制状态机和时钟生成状态机。
    主控制状态机是整个I2C总线控制器的核心。时钟生成状态机只在I2C总线控制器作为主设备时的模式下工作,是I2C总线通信时的时钟。当I2C总线控制器作为从设备通信时,主控制状态机时钟由FPGA所实现的I2C总线上所挂载的I2C主设备提供,整个I2C总线通信时的时钟为外部主设备提供的时钟。
I2C总线控制器状态机设计
      (1)主控制状态机
      主控制状态机状态转移图如图3所示。

      IDLE状态:当I2C上电或者复位后,主控制状态机就处于此状态。
      HEADER状态:在此状态,系统根据控制寄存器位MSTA值,发送或者接收包头,满足条件后,转移到ACK_HEADER状态;I2C总线控制器中的HEADER移位寄存器与地址寄存器中存放的I2C总线控制器作为从设备时响应的地址进行比较,如果匹配,则表明该路I2C总线控制器为被主设备寻址的从设备,模式立刻切换到从设备模式,同时状态寄存器中的MAAS位被置位,数据线SDA将会按照TXAK中的设置应答当前主设备。
    ACK_HEADER状态:当该路I2C总线控制器作为主设备时,如果没有收到从设备发送的ACK,则发送结束信号,返回到IDLE状态;如果收到ACK,则确定仲裁没有丢失,根据控制寄存器位TX值转到XMIT_DATA或者RCV_DATA状态;当该路I2C总线控制器作为从设备时,如果地址匹配,则发送ACK,根据主设备发送的第一个字节中的最后一位的值转到XMIT_DATA或者RCV_DATA状态。
    XMIT_DATA状态:在此状态时,移位寄存器将数据移到SDA线上。发送一个字节完成后,转移到WAIT_ACK状态。
    WAIT_ACK状态:在此状态时,如果收到ACK,则返回到XMIT_DATA状态;如果仲裁丢失,则转到IDLE状态;如果没有收到ACK,则发送结束信号,转移到IDLE状态。
    RCV_DATA状态:在此状态时,如果检测到重新启动信号,则返回HEADER状态;否则,移位寄存器从SDA线上移入数据,以供MPC8245处理器的驱动程序读取,移入一个字节后,转到ACK_DATA状态,控制寄存器中的TXAK位被输出到数据线SDA。
    ACK_DATA状态:I2C控制器发送ACK,返回到RCV_DATA状态。
    (2)时钟状态机
    整个状态机状态转换如图4所示。

    SCL_IDLE状态:当上电复位后,状态机就处于该状态。当I2C控制器为主节点并且总线空闲时,收到开始标志后,转移到START状态。
    START状态:当在此状态时,根据I2C协议,需要保持一定的时间,当持续时间满足要求时,转移到SCL_LOW_EDGE状态,否则保持在START状态。
    SCL_LOW_EDGE状态:当在此状态时,在下一个系统时钟时,转移到SCL_LOW状态。
    SCL_LOW状态:在此状态时,根据控制信号,设置SDA的输出,根据I2C协议,需要保持一定的时间,当保持时间满足要求时,转移到SCL_HIGH_EDGE状态,否则保持在该状态;如果仲裁丢失且已经传输了7个字节,则转移到SCL_IDLE状态。
    SCL_HIGH_EDGE状态:在此状态时,完成一定的操作,持续一个时钟周期后,转移到SCL_HIGH状态。如果SCL输入为0或者状态寄存器中的位MCF=1,则一直停留在该状态。
    SCL_HIGH状态:在此状态时,如果有重复起始信号,则SCL高电平持续一半时间,转移到START状态;如果有结束信号,则SCL高电平持续一半时间,转移到STOP_WAIT状态;根据I2C协议,需要保持一定的时间,当持续时间满足要求时,转移到SCL_LOW_EDGE状态,否则保持在当前状态。
    STOP_WAIT状态:在此状态时,根据I2C协议,需要保持一定的时间,当持续时间满足要求时,转移到SCL_IDLE状态。
系统工作流程
    多路I2C总线的系统在系统上电后,处理器通过FPGA与FPGA相连接的I2C设备通信。
    (1)当处理器作为主设备与FPGA所实现的I2C总线上所挂的从设备进行通信时,处理器主体通过对FPGA内部的该路I2C总线控制器对应的寄存器进行操作,根据I2C总线通信协议,产生起始信号和时钟信号,并查询状态位,对该路I2C总线上的从设备进行发送或者接收数据的操作,在数据交换完成后,产生停止信号,完成整个通信。
    (2)当处理器主体作为从设备与FPGA所实现的I2C总线上所挂的主设备进行通信时,FPGA所实现的I2C总线上所挂的主设备产生起始信号和时钟信号,处理器主体通过对FPGA内的该路I2C总线控制器对应的数据寄存器进行操作,发送或者接收数据。当通信完成后,FPGA所实现的I2C总线上所挂的主设备产生停止信号,完成整个通信。
    通过可编程逻辑器件实现的多路I2C总线上每一路可以挂多个设备,可以是从设备,也可以是主设备,具体能挂的设备数量受总线电容的限制。
    本设计利用可编程逻辑器件,完成对处理器主体I2C总线的扩展,使该处理器能够有多个I2C总线通道,每一路I2C总线上可以挂载多个不同的设备,可以是主设备,也可以是从设备,满足不同应用场合的要求。在可编程逻辑器件内,每个I2C总线控制器仅使用4个寄存器,大大降低了控制的复杂度,无需占用较多的CPU资源,系统稳定,执行效率高。

关键字:可编程逻辑门阵列  状态机  SPARTAN3A 引用地址:基于FPGA的多路I2C总线设计与实现

上一篇:Leon3软核的FPGA SelectMap接口配置设计
下一篇:基于FPGA的软件无线电可编程DDC的设计

推荐阅读最新更新时间:2024-05-02 21:27

英飞凌单片机XC866-2FR红外接收程序(状态机)
这是本人在外参与的第一个项目,主要负责红外发送与接收部分,本程序为接收部分适用于英飞凌单片机XC866-2FR芯片,在和大家分享分享,稍加删减便可为你所用。 #include "MAIN.H" #define State_Free 0 //定义的五种状态 #define State_Start 1 #define State_Data 2 #define State_Stop 3 #define State_Error 4 #define Rx_Lg 13 //定义的最大接收数据 uword T2_Counter=0; //计算进入定时器T2的中断次数 ubyte Bit_Counter=0; //接收8bit
[单片机]
基于RTL综合策略的状态机优化方案
有限状态机及其设计技术是数字系统设计中的重要组成部分,是实现高效率、高可靠性逻辑控制的重要途径。大部分数字系统都可以划分为控制单元和数据单元两个组成部分。通常,控制单元的主体是一个状态机,它接收外部信号以及数据单元产生的状态信息,产生控制信号序列。状态机性能的好坏对系统性能有较大的影响。良好的状态机的实现不仅与状态机的设计有关,而且与采用的综合策略密切相关,不同的综合策略对最终实现的状态机的性能有很大的影响。   Synopsys公司的DC (Design Compiler,设计编译程序)提供了针对状态机的综合优化策略,这个过程既可以完全自动进行,也可以手工进行。本文论述了两种综合策略的实现。   1 状态机的基础描述   从数
[模拟电子]
基于RTL综合策略的<font color='red'>状态机</font>优化方案
谈谈单片机编程思想——状态机
玩单片机还可以,各个外设也都会驱动,但是如果让你完整的写一套代码时,却无逻辑与框架可言。这说明编程还处于比较低的水平,你需要学会一种好的编程框架或者一种编程思想!比如模块化编程、状态机编程、分层思想等 本文来说一下状态机编程。 什么是状态机? 状态机(state machine)有5个要素: 状态(state) 迁移(transition) 事件(event) 动作(action) 条件(guard) 状态:一个系统在某一时刻所存在的稳定的工作情况,系统在整个工作周期中可能有多个状态。例如一部电动机共有正转、反转、停转这 3 种状态。 一个状态机需要在状态集合中选取一个状态作为初始状态。 迁移:系统从一
[单片机]
学海拾贝状态机思路在单片机程序设计中的应用
状态机思路在单片机程序设计中的应用 状态机的概念   状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。   比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。   进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。   同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还
[单片机]
学海拾贝<font color='red'>状态机</font>思路在单片机程序设计中的应用
单片机的状态机编程思路
不知道大家有没有这样一种感觉,就是感觉自己玩单片机还可以,各个功能模块也都会驱动,但如果让你完整地写一套代码,却无逻辑与框架可言,上来就是开始写!东抄抄西抄抄,说明编程还处于比较低的水平。那么,如何才能提高自己的编程水平呢? 学会一种好的编程框架,或者一种编程思想,可能会受用终生!比如模块化编程、框架式编程、状态机编程等,都是一种好的框架。 今天说的就是状态机编程,由于篇幅较长,大家慢慢欣赏。那么,状态机是一个什么样的东东? 状态机(state machine)有5个要素,分别是状态(state)、迁移(transition)、事件(event)、动作(action)、条件(guard)。 什么是状态机? 状态机是一个
[单片机]
一个经典的按键扫描程序
按键是比较复杂。可以用状态机表示。 每10mS执行一次键盘扫描任务 0、无键,若有键进入状态1 1、第一次检到有键。若有键进入状态2,同时将键值送缓冲区。 若无键进入状态0。 2、若有键则计时,按键超过300ms进入状态3,同时将键值送缓冲区。 若无键进入状态1。 表示第一次按键后如果长按键则300ms后认为有一次按键。 3、若有键则计时,按键超过200ms则将键值送缓冲区。 若无键进入状态1。 表示长按键则以后每200ms后认为有一次按键。 void KeyScan() //每10mS执行一次键盘扫描任务 { switch(KeyState) { case 0: if(Ke
[单片机]
高速状态下使用CPLD实现状态机的办法
本文给出了采用这些技术的高速环境状态机设计的规范及分析方法和优化方法,并给出了相应的示例。 为了使FPGA或CPLD中的状态机设计满足高速环境要求,设计工程师需要认识到以下几点:寄存器资源和逻辑资源已经不是问题的所在,状态机本身所占用的FPGA或CPLD逻辑资源或寄存器资源非常小;状态机对整体数据流的是串行操作,如果希望数据处理的延时非常小,就必须提高操作的并行程度,压缩状态机中状态转移的路径长度;高速环境下应合理分配状态机的状态及转移条件。本文将结合实际应用案例来说明。 状态机设计规范 1. 使用一位有效的方式进行状态编码 状态机中状态编码主要有三种:连续编码(sequential encoding)、
[嵌入式]
高速状态下使用CPLD实现<font color='red'>状态机</font>的办法
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved