I〈sup〉2〈sup〉C在CPLD上模拟实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
I〈sup〉2〈sup〉C在CPLD上模拟实现

I〈sup〉2〈sup〉C在CPLD上模拟实现   I2C总线是Philips推出的芯片间串行传输总线,因为其具有需要连线少(仅需一条串行时钟线和一条串行数据线),允许多主机控制,具有裁决和同步功能,可随意添加或摘除总线上的子器件等诸多优点,所以已经被广泛应用。另外由于Philips和其它厂商提供了种类众多的I2C兼容芯片,促使其成为世界性的工业标准。   对于那些没有硬件I2C接口的MCU,现行大都采用以下两种方法来实现:一种是在程序内部使用模拟I2C的软件包,该方法简单、需要硬件少,但程序开销大,相应速度有所下降,在有些场合不太合适。另一种是在MCU和I2C器件间加一片CPLD芯片,用该芯片完成模拟I2C的功能。这种方法虽然增加了硬件开销,但减少了MCU的负担,控制方式要灵活得多。当然,应用的环境、要求不同,选择的方法也会不同,下面仅就后者进行介绍。      1.I2C规则介绍      (1)空闲时SCL和SDA必须保证为高电平,以等待起始位的发生。   (2)启动和停止条件。在SCL稳定为高电平期间,SDA产生一个由高电平到低电平的跳变,此时即可启动总线,而结束条件与此相反。      (3)位传送。位传送发生在SCL稳定为高电平期间,此时不允许SDA线上发生数据跳变,否则会导致总线失控。每个时钟脉冲传送一个数据位。   (4)应答位。在启动条件和停止条件之间传送器传送给接收器的数据个数没有限制,每个8位字节后加一个应答位。主传送器产生高电平的应答位,由接收器将该位拉低,称为应答信号(ACK);主器件为接收器时,在接收了最后一个字节后不发应答信号,称为非应答信号(NO ACK)。   从接收器必须在接收到每个字节后产生一个应答位,主接收器也必须在接收从传送器传送的每个字节后产生一个应答位。   (5)写模式。主传送器首先向数据线发送从接收器地址,地址末尾一位为0,表示要进行写操作,得到应答后便向从接收器发送数据,每发送一个字节,读取一次应答位,为ACK则接着发送,为NO ACK则发送停止位。数据传送完后同样发送停止位。   (6)读模式。同样由主传送器线发送从接收器地址,地址末尾一位为1,表示要进行读操作。读完一个字节后,发送应答位,如想继续读操作,发送ACK,如想结束读操作,发送NO ACK。    当然,在模拟I2C时,我们只需按照I2C时序要求发送、接收数据,具体数据的含义由MCU进行解析,这样大大减小了模拟的复杂性。      2.设计思路      由以上可以看出,I2C在传输过程中存在几个固定状态,传输的过程也就是状态间进行转换的过程,因此我们很自然地联想到在编程时使用状态机的方法。   由于状态间转换要受到来自MCU信号的控制,例如控制何时发送起始位和停止位的start、stop信号,因此需要采用Mealy型状态机。   首先,我们可以将整个过程归结为四种状态:空闲状态(s_null)、发送起始位状态(s_start)、发送/接收字节状态(s_byte)、发送/接收应答状态(s_ack)、发送停止位状态(s_stop),type state_type is (s_null,s_start,s_byte,s_ack,s_stop)。图1为状态转换图。   其中的转移条件如下:① 当MCU发送起始信号,即令start保持一段高电平;      ②当起始信号start和结束信号stop均为低电平;③ 当发送或接收的数据不足8 Bit时,接着发送或接收;④ 当发送或接收的数据够8 Bit 时,接收或发送应答信号;⑤ 发送时,如果接收到的是应答位(ack=0),则接着发送数据;接收时,如果MCU未发送停止信号,则发送应答位(ack=0),接着接收;⑥ 发送时,如果接收的是非应答位(ack=1),则停止发送数据。接收时,如果MCU发出停止信号,则停止发送数据;⑦ 无任何条件;⑧ 没有来自MCU的起始信号和停止信号;⑨ 接收到MCU的停止信号,用于紧急情况。   另外,在时钟方面,一般系统中外部时钟输入为4MHz,I2C的普通传输速率约为100kb/s,因此需要一个内部分频器。假设时钟信号CLK为一个经分频后的500kHz的时钟信号,CL为一个经分频后的125kHz的时钟信号。   由于I2C中SCL信号是由主机控制发送的,并不等同于外部时钟,根据发送起始位、停止位以及读取数据时的时序要求,需要将4个CLK周期作为一个SCL周期,即一个SCL周期包含4个状态周期(s0、s1、s2、s3),然后根据所处的不同状态周期,对SCL和SDA进行控制操作。这样模拟的I2C传输速率将近125kb/s。   图2、3是一段发送起始位的程序时序图以及读取一个字节时的时序图。其中,

文档评论(0)

bokegood + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档