EDN China > 设计实例 > 可编程器件 > PLD > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

(多图) 基于CPLD的I2C总线接口设计

21ic 郑采君?? 2011年03月28日 ?? 收藏0

  2.1 Clock单元

  整个接口模块以CPU的系统时钟作为主时钟信号,模块传输数据的速率受该时钟频率的控制,时钟频率高则模块传输数据的速率也高,反之亦然。考虑到各种具有I2C总线接口的芯片的工作速率差别较大(从几十kB/s到几MB/s),该接口模块的工作速率必须能够灵活调整,以适应不同外设芯片的接口需要。

  Clock单元实际上就是一个分频器,它在输出频率控制码CKSEL[7..0]的控制下产生对PCCLK分频后合适的时钟信号供I2C接口使用。

  2.2 I2CStep单元

  通过对图1中I2C总线各种工作模式的分析,可知不同的工作模式都是按特定的工作流程串行输入、输出数据的,例如字节写模式的工作流程为:发送开始信号、串行输出被叫芯片的片选地址、发送写信号、等待被叫芯片响应、串行输出被叫芯片存储单元的地址、等待被叫芯片响应、串行输出写入的数据、等待被叫芯片响应、发送结束信号结束本次操作。

  为了使接口模块正确工作,模块在接收到来自CPU的工作模式控制信号I2CMD[2..0]后,根据工作模式的不同产生接口模块工作流程。当前流程结束后由Status单元产生IncStep信号,控制工作流程指向下一阶段。该模块的功能类似一个计数器,它在I2CMD[2..0]和I2CStep的共同作用下,产生长度不等的工作流程信号Step[6..0]。

  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应立即发出结束信号结束本次操作;当前工作流程未完成前不能进行下一流程。这些状态信号全部由Status单元产生。

  在该单元中,共有4种输出信号,它们分别是:用于指示发送数据寄存器是否为空的TxSTS状态,该状态在CPU写入数据后置‘1’,数据被发送后清‘0’;用于指示接收数据准备好状态的RxSTS信号,该信号在模块接收到完整的数据后置‘1’,数据被CPU读走后清‘0’;用于指示模块工作状态的ACKSTS信号,该信号在模块工作正常(接收到从机响应信号)时自动置‘1’,工作不正常时自动清‘0’;用于使工作流程指向下一阶段的IncStep信号,该信号在当前工作流程完成后由模块自动产生,用于使模块的工作流程指向下一阶段。

  2.5 EnI2C单元

  在I2C总线接口模块中,BitTiming单元何时开始产生工作时序,需要时序信号控制,I2CPORT单元何时向I2C总线输出信息、何时从I2C总线上读入信息也需要时序信号控制。这些控制时序的产生由EnI2C单元完成。

  EnI2C单元在I2CMD[2..0]、Step[6..0]、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对该单元仿真的时序图。

用QuartusII9

  2.7 PcPort单元的实现

  该单元是模块与CPU的接口,CPU通过该单元向接口模块写入工作模式控制信息、需要发送的数据以及I2C工作速度控制信息;同时通过该单元读入从机响应信息、从机输出数据、发送接收寄存器状态等信息。

  3 应用实例

  该模块工作于主模式,主要应用于没有I2C专用接口的CPU通过并口方便地与具有I2C接口的外设连接并交换信息。

  图4给出了CPU通过该模块与X24C04E2PROM接口的例子。

CPU通过该模块与X24C04E2PROM接口的例子

  在图中,PC104 CPU通过数据总线、地址总线、读、写信号线与I2C接口模块相连,I2C接口模块则通过SDL、SDA与X24C04相连,PC104CPU输出的并行数据,经过I2C接口模块转换后变成符合I2C总线模式要求的串行数据输出到X24C04,X24C04输出的串行数据经过I2C接口模块转换后,变成并行数据供PC104CPU读取。使用该模块后CPU操作I2C总线就像操作并口一样方便。该电路的控制软件流程如图5所示。

电路的控制软件流程

  通过上述应用实例可以看出,本文设计的接口模块只能工作于主机模式,并且在整个系统中只能有一个主机工作。在从机因处理其他工作而暂不能响应主机时,模块没有设计等待功能,只能发送总线结束信号结束当前操作,待从机空闲时再重新开始通信。

  4 结论

  本设计的创新点在于:通过CPLD实现并口到I2C总线接口的转换,可以使不具备I2C总线接口的CPU通过并口方便地控制I2C总线设备,使用该模块可以简化控制软件的编程,加快系统设计的实现,在I2C总线操作过程中,转换模块自动发出开始信号、结束信号,不需要CPU干预。

  本文设计的I2C接口模块只能工作于主模式,只能应用于主机系统;在模块的设计中,没有考虑多主机的情况,对多主机的总线竞争没有设计仲裁功能;模块的页面读写数据数不能超过32个字节,在32个字节之内,CPU可以通过主动设置工作模式为“110”而终止当前操作,达到连续读写小于32个字节数据的目的,超过32个字节的连续数据读写操作将使模块工作错误。


上一页12下一页
?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

CPLD? I2C总线? Quartus? PROM?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈