I2C总线连线图I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点
I2C总线是两线式串行总线,用于连接微控制器及其外围设备。该总线具有如下特点:1)只要求两条总线线路1、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL 2、每个连接到总线的器件都可以通过的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器。3、它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;4串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s;5连接到相同总线的IC 数量只受到总线的电容400pF 限制。I2C总线主要的优点是其简单性和有效性。它支持多主控制(multimastering),总线中任何能够进行发送和接收的设备都可以成为主机。任何主机都能够控制总线信号的传输和时钟频率。
由于连接到I2C 总线的器件有不同种类的工艺(CMOS、NMOS、双极性),逻辑0(低)和逻辑1(高)的电平不是固定的,它由电源VCC的相关电平决定,每传输一个数据位就产生一个时钟脉冲。
不幸的是大多数CPU都擅长操作并口,而并不具备直接操作I2C总线接口的能力。该方法虽然可以达到同I2C器件连接的目的,却不可避免地带来软件编制复杂、占用CPU处理时间多的弊端。为了在不增加编程难度、不大量占用CPU处理时间的前提下使不具备I2C总线的CPU也能够充分享受I2C总线的优点,本文设计了一种基于CPLD的8位并行接口转I2C总线接口的控制模块,通过该模块,具有并口的CPU可以通过对并口的读写完成对I2C总线的控制。
1 I2C总线的基本时序
I2C总线是由数据线SDA和时钟线SCL构成,SDA是技能开发活动英文字母的速写,实际上,它是一个非常有用的工具。通过它可将实际成绩和目标之间的距离逐步缩短,从而使目标达成。靠它们在连接于I2C总线的各个设备之间传送信息。I2C总线在传送数据过程中共有4种类型的信号,分别是:开始信号、结束信号、应答信号和数据传输信号。
开始信号:主机控制SDA信号线在SCL线的高电平期间发生由高电平到低电平的跳变,通知从机开始数据传输。
结束信号:主机控制SDA信号线在SCL线的高电平期间发生由低电平到高电平的跳变,通知从机本次数据传输结束。
应答信号:接收数据的芯片(主机或者从机)在完整接收到8位数据后,向发送数据的芯片发出低电平信号,通知发送的数据已被接收。发送数据的芯片应根据应答信号的电平高低判断数据是否被接收芯片接收。
数据传输信号:发送数据的芯片在SCL脉冲控制下在SDA上串行输出数据信号,SDA只能在SCL为低电平期间改变状态,在SCL为高电平期间应保持稳定。
I2C总线上的数据传输主要有4种模式,分别是:字节写、页面写、当前地址读、随机地址读和顺序读。
字节写:对给定的芯片的确定地址单元写入一个字节的数据。
页面写:对给定的芯片的确定地址单元所在页面连续写入全部的数据。
当前地址读:读出当前地址单元中的一个字节数据。
随机地址读:从给定的芯片的确定地址单元中读出一个字节数据。
顺序读:从给定的地址后连续读出n个字节的数据。
I2C总线各种信号及数据传输模式示意图如图1所示。
CPLD复杂可编程逻辑器件,是从PAL和GAL器件发展出来的器件,相对而言规模大,结构复杂,属于大规模集成电路范围。大规模可编程逻辑器件是EDA得以实现的硬件基础,通过编程,可灵活方便地构建和修改数字电子系统。可编程逻辑器件是集成电路技术发展的产物。很早以前,电子工程师们就曾设想设计一种逻辑可再编程的器件,但由于集成电路规模的限制,难以实现。20世纪70年代,集成电路技术迅猛发展,随着集成电路规模的增大,MSI(Medium Scale Integrated Circuit),LSI(Large Scale Integrated Circuit)出现,可编程逻辑器件才得以诞生和迅速发展。是一种用户根据各自需要而自行构造逻辑功能的数字集成电路。其基本设计方法是借助集成开发软件平台,用原理图、硬件描述语言等方法,生成相应的目标文件,实现设计的数字系统。
利用CPLD设计一种模块,如果能够将CPU发出的并行数据按上述I2C总线数据传输模式自动转换成串行数据输出,同时将接收到的I2C总线串行数据自动转换成并行数据供CPU读取,则不具备I2C总线接口的CPU也能通过对并口的操作轻松实现与I2C总线连接并同其他具备I2C总线接口的芯片交换数据。
2 I2C总线接口模块的CPLD实现
CPLD主要是由可编程逻辑宏单元(MC,Macro Cell)围绕中心的可编程互连矩阵单元组成。其中MC结构较复杂,并具有复杂的I/O单元互连结构,可由用户根据需要生成特定的电路结构,完成一定的功能。由于CPLD内部采用固定长度的金属线进行各逻辑块的互连,所以设计的逻辑电路具有时间可预测性,避免了分段式互连结构时序不完全预测的缺点。
上面简要介绍了I2C总线的信号以及I2C总线的数据传输模式,如果要使接口模块正常工作,CPU必须首先要通知模块执行什么操作,而后再把需要的数据依次送入模块中,考虑到I2C总线的速率可以在0~3.4 Mbit/s之间,为了适应不同外设的需要,模块还应在CPU的控制下自由调整数据传送速率。
中读取工作状态数据、模块接收数据。据此设计出基于CPLD的I2C总线接口模块如图2所示。
该设计由7个单元组成,它们分别是:用于调整I2C总线数据传输速率的Clock单元;用于实现同CPU并行接口的PcPort单元:用于产生I2C总线工作时序的I2CStep单元;用于产生数据传输时序的BitTiming单元;用于产生I2C总线使能信号的En12C单元:用于产生I2C总线接口模块工作状态指示的Status单元:以及用于产生I2C接口时钟信号SDL和数据串行输入输出信号SDA的I2CPORT单元。
2.1 Clock单元
整个接口模块以CPU的系统时钟作为主时钟信号,模块传输数据的速率受该时钟频率的控制,时钟频率高则模块传输数据的速率也高,反之亦然。考虑到各种具有I2C总线接口的芯片的工作速率差别较大(从几十kB/s到几MB/s),该接口模块的工作速率必须能够灵活调整,以适应不同外设芯片的接口需要。
Clock单元实际上就是一个分频器,它在输出频率控制码CKSEL[70]的控制下产生对PCCLK分频后合适的时钟信号供I2C接口使用。
2.2 I2CStep单元
通过对图1中I2C总线各种工作模式的分析,可知不同的工作模式都是按特定的工作流程串行输入、输出数据的,例如字节写模式的工作流程为:发送开始信号、串行输出被叫芯片的片选地址、发送写信号、等待被叫芯片响应、串行输出被叫芯片存储单元的地址、等待被叫芯片响应、串行输出写入的数据、等待被叫芯片响应、发送结束信号结束本次操作。
为了使接口模块正确工作,模块在接收到来自CPU的工作模式控制信号I2CMD[20]后,根据工作模式的不同产生接口模块工作流程。当前流程结束后由Status单元产生IncStep信号,控制工作流程指向下一阶段。该模块的功能类似一个计数器,它在I2CMD[20]和I2CStep的共同作用下,产生长度不等的工作流程信号Step[60]。
2.3 BitTiming单元
在I2C总线工作流程的不同阶段,I2C接口模块需要按一定的时序完成不同的工作,通过对总线数据传输模式的分析可知,在一个数据传输模式的所有工作流程中,输入、输出8位数据的工作流程用时长,需要25个工作时序周期,为了满足所有工作流程的需要,工作时序Bit-Timing单元被设计成长可产生31个时钟周期的工作时序。
该单元在IncStep=‘1’时复位工作时序;在EnTiming信号有效后的每个SysCLK的上升沿使工作时序信号EnTiming加1,用于控制I2CPORT单元按给定的时序串行输入、输出数据信息。
2.4 Status单元
在I2C总线工作过程中,CPU需要随时了解I2C接口模块的发送数据寄存器是否为空、接收数据寄存器是否准备数据好、从机响应信号是否正确、当前工作流程是否完成等工作状态,只有在发送数据寄存器为空时,CPU才可以向接口模块写入待传输数据;只有在接收数据寄存器数据准备好后,CPU才可以从接口模块读入正确的接收数据;从机响应信号不正确时,CPU应立即发出结束信号结束本次操作;当前工作流程未完成前不能进行下一流程。
在该单元中,共有4种输出信号,它们分别是:用于指示发送数据寄存器是否为空的TxSTS状态,该状态在CPU写入数据后置‘1’,数据被发送后清‘0’;用于指示接收数据准备好状态的RxSTS信号,该信号在模块接收到完整的数据后置‘1’,数据被CPU读走后清‘0’;用于指示模块工作状态的ACKSTS信号,该信号在模块工作正常(接收到从机响应信号)时自动置‘1’,工作不正常时自动清‘0’;用于使工作流程指向下一阶段的IncStep信号,该信号在当前工作流程完成后由模块自动产生,用于使模块的工作流程指向下一阶段。
2.5 EnI2C单元
在I2C总线接口模块中,BitTiming单元何时开始产生工作时序,需要时序信号控制,I2CPORT单元何时向I2C总线输出信息、何时从I2C总线上读入信息也需要时序信号控制。这些控制时序的产生由EnI2C单元完成。
EnI2C单元在I2CMD[20]、Step[60]、TxSTS、RxSTS等信号的控制下,从预先存储于单元内部的一组I2C工作时序信息中读出当前的时序信息输出,控制BitTiming和I2CPORT单元工作。
模块中,预先存储的I2C工作时序信息实现如下:
2.6 12CPORT单元
本单元是整个设计的,用于完成数据的I2C总线输出以及I2C总线输入数据的读入。同时产生接口模块的各种工作状态。
该单元的工作过程为:在SysCLK的下降沿分别读入工作使能信号和工作时序信号,如果此时EnIdle=‘1’则强制I2C总线进入空闲模式;如果EnStart=‘1’,则使I2C总线输出开始信号;如果EnWrite=‘1’,则使I2C总线输出8位数据信号;如果EnInACK=‘1’,则从I2C总线读入从机响应信号;如果EnRead=‘1’,则从I2C总线读入8位数据;如果EnOutACK=‘1’。则使I2C总线输出主机响应信号;如果EnStop=‘1’,则使I2C总线输出结束信号;在整个工作过程中,模块会自动根据工作情况,设置各种状态控制信号。
图3是用QuartusII9.0对该单元仿真的时序图。
2.7 PcPort单元的实现
该单元是模块与CPU的接口,CPU通过该单元向接口模块写入工作模式控制信息、需要发送的数据以及I2C工作速度控制信息;同时通过该单元读入从机响应信息、从机输出数据、发送接收寄存器状态等信息。
3 应用实例
该模块工作于主模式,主要应用于没有I2C专用接口的CPU通过并口方便地与具有I2C接口的外设连接并交换信息。
图4给出了CPU通过该模块与X24C04E2PROM接口的例子。
在图中,PC104 CPU通过数据总线、地址总线、读、写信号线与I2C接口模块相连,I2C接口模块则通过SDL、SDA与X24C04相连,PC104CPU输出的并行数据,经过I2C接口模块转换后变成符合I2C总线模式要求的串行数据输出到X24C04,X24C04输出的串行数据经过I2C接口模块转换后,变成并行数据供PC104CPU读取。使用该模块后CPU操作I2C总线就像操作并口一样方便。该电路的控制软件流程如图5所示。
本文设计的接口模块只能工作于主机模式,并且在整个系统中只能有一个主机工作。在从机因处理其他工作而暂不能响应主机时,模块没有设计等待功能,只能发送总线结束信号结束当前操作,待从机空闲时再重新开始通信。
4 结论
20世纪70年代,早的可编程逻辑器件--PLD诞生了。其输出结构是可编程的逻辑宏单元,因为它的硬件结构设计可由软件完成(相当于房子盖好后人工设计局部室内结构),因而它的设计比纯硬件的数字电路具有很强的灵活性,但其过于简单的结构也使它们只能实现规模较小的电路。为弥补PLD只能设计小规模电路这一缺陷,20世纪80年代中期,推出了复杂可编程逻辑器件--CPLD。目前应用已深入网络、仪器仪表、汽车电子、数控机床、航天测控设备等方面。
通过CPLD实现并口到I2C总线接口的转换,可以使不具备I2C总线接口的CPU通过并口方便地控制I2C总线设备,使用该模块可以简化控制软件的编程,加快系统设计的实现,在I2C总线操作过程中,转换模块自动发出开始信号、结束信号,不需要CPU干预。
本文设计的I2C接口模块只能工作于主模式,只能应用于主机系统;在模块的设计中,没有考虑多主机的情况,对多主机的总线竞争没有设计仲裁功能;模块的页面读写数据数不能超过32个字节,在32个字节之内,CPU可以通过主动设置工作模式为“110”而终止当前操作,达到连续读写小于32个字节数据的目的,超过32个字节的连续数据读写操作将使模块工作错误。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。