ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:139.58KB ,
资源ID:3159319      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3159319.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(IIC时序程序.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

IIC时序程序.docx

1、IIC时序程序I2C总线信号时序分析在I2C总线通信的过程中,参与通信的双方互相之间所传输的信息种类归纳如下。主控器向被控器发送的信息种类有:启动信号、停止信号、7位地址码、读写控制位、10位地址码、数据字节、重启动信号、应答信号、时钟脉冲。被控器向主控器发送的信息种类有:应答信号、数据字节、时钟低电平。下面对I2C总线通信过程中出现的几种信号状态和时序进行分析。总线空闲状态。I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。启动信号。在时钟线SCL保持高电平期间,数据线

2、SDA上的电平被拉低(即负跳变),定义为I2C总线总线的启动信号,它标志着一次数据传输的开始。启动信号是一种电平跳变时序信号,而不是一个电平信号。启动信号是由主控器主动建立的,在建立该信号之前I2C总线必须处于空闲状态,如图1所示。图1 I2C总线上的启动信号和停止信号停止信号。在时钟线SCL保持高电平期间,数据线SDA被释放,使得SDA返回高电平(即正跳变),称为I2C总线的停止信号,它标志着一次数据传输的终止。停止信号也是一种电平跳变时序信号,而不是一个电平信号,停止信号也是由主控器主动建立的,建立该信号之后,I2C总线将返回空闲状态。数据位传送。 在I2C总线上传送的每一位数据都有一个时

3、钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。进行数据传送时,在SCL呈现高电平期间,SDA上的电平必须保持稳定,低电平为数据0,高电平为数据1。只有在SCL为低电平期间,才允许SDA上的电平改变状态。逻辑0的电平为低电压,而逻辑1的电平取决于器件本身的正电源电压VDD(当使用独立电源时),如图2所示。图2 I2C总线上的数据位传送应答信号。I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字

4、节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P,如图3所示。图3 I2C总线上的应答时序插入等待时间。如果被控器需要延迟下一个数据字节开始传送的时间,则可以通过把时钟线SCL电平拉低并且保持,使主控器进入等待状态。一旦被控器释放时钟线,数据传输就得以继续下去,这样就使得被控器得到足

5、够时间转移已经收到的数据字节,或者准备好即将发送的数据字节。带有CPU的被控器在对收到的地址字节做出应答之后,需要一定的时间去执行中断服务子程序,来分析或比较地址码,其间就把SCL线钳位在低电平上,直到处理妥当后才释放SCL线,进而使主控器继续后续数据字节的发送,如图4所示。图4 I2C总线上的插入等待时间重启动信号。在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数据通信(发送或接收),而又不释放总线,就需要利用重启动Sr信号时序。重启动信号Sr既作为前一次数据传输的结束,又作为后一次数据传输的开始。利用重启动信号的优点是,在前后两次通信之间主控器不需要

6、释放总线,这样就不会丢失总线的控制权,即不让其他主器件节点抢占总线。时钟同步。如果在某一I2C总线系统中存在两个主器件节点,分别记为主器件1和主器件2,其时钟输出端分别为CLK1和CLK2,它们都有控制总线的能力。假设在某一期间两者相继向SCL线发出了波形不同的时钟脉冲序列CLK1和CLK2(时钟脉冲的高、低电平宽度都是依靠各自内部专用计数器定时产生的),在总线控制权还没有裁定之前这种现象是可能出现的。鉴于I2C总线的“线与”特性,使得时钟线SCL上得到的时钟信号波形,既不像主器件1所期望的CLK1,也不像主器件2所期望的CLK2,而是两者进行逻辑与的结果。CLKI和CLK2的合成波形作为共同

7、的同步时钟信号,一旦总线控制权裁定给某一主器件,则总线时钟信号将会只由该主器件产生,如图5所示。图5 I2C总线上的时钟同步总线冲突和总线仲裁。假如在某I2C总线系统中存在两个主器件节点,分别记为主器件1和主器件2,其数据输出端分别为DATA1和DATA2,它们都有控制总线的能力,这就存在着发生总线冲突(即写冲突)的可能性。假设在某一瞬间两者相继向总线发出了启动信号,鉴于:I2C总线的“线与”特性,使得在数据线SDA上得到的信号波形是DATA1和DATA2两者相与的结果,该结果略微超前送出低电平的主器件1,其DATA1的下降沿被当做SDA的下降沿。在总线被启动后,主器件1企图发送数据“101”

8、,主器件2企图发送数据“100101”。两个主器件在每次发出一个数据位的同时都要对自己输出端的信号电平进行抽检,只要抽检的结果与它们自己预期的电平相符,就会继续占用总线,总线控制权也就得不到裁定结果。主器件1的第3位期望发送“1”,也就是在第3个时钟周期内送出高电平。在该时钟周期的高电平期间,主器件1进行例行抽检时,结果检测到一个不相匹配的电平“0”,这时主器件1只好决定放弃总线控制杈;因此,主器件2就成了总线的惟一主宰者,总线控制权也就最终得出了裁定结果,从而实现了总线仲裁的功能。从以上总线仲裁的完成过程可以得出:仲裁过程主器件1和主器件2都不会丢失数据;各个主器件没有优先级别之分,总线控制

9、权是随机裁定的,即使是抢先发送启动信号的主器件1最终也并没有得到控制杈。系统实际上遵循的是“低电平优先”的仲裁原则,将总线判给在数据线上先发送低电平的主器件,而其他发送高电平的主器件将失去总线控制权,如图6所示。图6 I2C总线上的总线仲裁总线封锁状态。在特殊情况下,如果需要禁止所有发生在I2C总线上的通信活动,封锁或关闭总线是一种可行途径,只要挂接于该总线上的任意一个器件将时钟线SCL锁定在低电平上即可。/通用MSP430I2C程序#include MSP430x14x.h/P3.2 SCL/P3.3 SDA#define SDA_1 P3OUT |= BIT3 /SDA = 1#defin

10、e SDA_0 P3OUT &= BIT3 /SDA = 0#define SCL_1 P3OUT |= BIT2 /SCL = 1#define SCL_0 P3OUT &= BIT2 /SCL = 0#define DIR_IN P3DIR &= BIT3; SDA_1 /I/O口为输入#define DIR_OUT P3DIR |= BIT3 /I/0口为输出#define SDA_IN (P3IN 3) & 0x01) /Read SDAunsigned int a50;static void Delay(unsigned int n) unsigned int i; for (i=0

11、; in;i+) ; void Init(void) SCL_1; Delay(5); SDA_1; Delay(5);void Start(void) SDA_1; Delay(5); SCL_1; Delay(5); SDA_0; Delay(5); SCL_0; Delay(5);void Stop(void) SDA_0; Delay(5); SCL_1; Delay(5); SDA_1; Delay(5);void WriteByte(unsigned char WritEDAta) unsigned char i; for (i=0; i 7) & 0x01) = 0x01) SD

12、A_1; else SDA_0; Delay(5); SCL_1; WriteData = WritEDAta 1; Delay(5); SCL_0; SDA_1; Delay(5); Delay(5);unsigned char ReadByte(void) unsigned char i; unsigned char TempBit = 0; unsigned char TempData = 0; SCL_0; Delay(5); SDA_1; for (i=0; i8; i+) Delay(5); SCL_1; Delay(5); DIR_IN; if (SDA_IN = 0x01 /*

13、sda=1*/) TempBit = 1; else TempBit = 0; DIR_OUT; TempData = (TempData 1) | TempBit; SCL_0; Delay(5); return(TempData);void ReceiveAck(void) unsigned char i = 0; SCL_1; Delay(5); DIR_IN; while (SDA_IN = 0x01 /*sda=1*/) & (i 255)/*调试方便,可以不要*/) i+; DIR_OUT; SCL_0; Delay(5);void Acknowledge(void) SCL_0;

14、 Delay(5); DIR_OUT; SDA_0; SCL_1; Delay(5); SCL_0;unsigned int ReadWord(unsigned char unit/*address*/) unsigned char HighData = 0; unsigned char LowData = 0; unsigned int TempData = 0; Start(); WriteByte(0xa0); ReceiveAck(); WriteByte(unit); ReceiveAck(); Start(); WriteByte(0xa1); ReceiveAck(); LowData = ReadByte(); Acknowledge(); HighData = ReadByte();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1