51单片机模拟I2C总线的数据传送.doc_第1页
51单片机模拟I2C总线的数据传送.doc_第2页
51单片机模拟I2C总线的数据传送.doc_第3页
51单片机模拟I2C总线的数据传送.doc_第4页
51单片机模拟I2C总线的数据传送.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51单片机模拟I2C总线的数据传送学习交流QQ群126500542(验证信息:千寻琥珀心)本文主要介绍I2C总线的数据传送、数据传输的协议以及传输的格式并对单片机与I2C总线的接口予以说明,并给出单片机口模拟I2C主机的时序,其实时序一看懂了,程序也就出来了。汇编和C.在将单片机模拟I2C之前,先来了解一下I2C。I2c总线是由一根数据线SDA和一根时钟线SCL组成,他们都是双向传输线,既可用于发送也可用于接收。一般总线挂接在主器件上时处于备用状态即处于空闲状态,要求I2C总是显示为高电平,故需要在电路中对这两总线加上拉电阻。将其拉为高电平,只用当需要关闭I2C总线时,SCL线才会变为低电平。在I2C总线上,SDA是数据线,SCL为时钟线,注意每传送一位数据,都要有一个对应的SCL线上的脉冲信号。即SDA和SCL是一一对应的,总线又规定,在传送数据的时候,SCL为高电平时要求SDA线上的数据稳定。也就是说当SCL为高电平时,不允许SDA线上的数据发生变化。当SCL线为低电平时,才允许SDA线上的数据发生变化。注意数据传送时,先传送最高位,好I2C总线上的数据信号基本上就这样了,简单的说了一下,下面我们就来看看其他几个信号。起始信号、停止信号、应答信号和非应答信号。起始信号顾名思义,即为发送数据的开始,停止信号即为发送数据的结束。应答信号,由于i2c总线是双总线,数据线只有SDA,所以总线规定,要求每发送完一个字节的数据,就得产生一个应答信号,但需要注意的是,这里的应答信号不是有从机产生的,而是像起始信号和停止信号一样是由主机产生的。发送设备在应答时钟脉冲高电平期间释放SDA线(高电平),转由接收器控制。接收设备在这个时钟内必须将SDA拉为低电平,以产生有效地应答信号。下面将给出时序图。(简言之就是有主机控制的SDA线转由从机控制,以相应主机数据已成功发送)但是如果从机不能接收下一个字节,(注意此处是下一个字节,说明上一字节已经接收完成并产生应答)比如正在处理一个外部中断,则可以先把SCL线拉低,是主机处于等待状态。当从机准备好时,即中断处理完成时再释放SCL线,是数据传送继续进行。但是当数据传送完但是没有产生应答信号时,如一个从机正在处理一个实时时间,不能接受(或不能产生应答信号时),从机必须使SDA线保持高电平,此时主机产生一个信号,即为非应答信号,是传送异常结束。但是当主机作为接收器时,主机对最后一个字节不予应答(非应答信号),以向从机之处数据传送结束,从机释放SDA线使其变为高电平,使主机产生一个结束信号。晕,感觉上面写的看着挺乏的,没办法,美工不好,又不是写小说。只以作为一个参考资料罢了。当然主要是为我自己服务。以后用着稍微方便点。虽然不敢说方便。也可稍微加深了一下对I2C的理解与记忆。何乐而不为。好,下面我们来看看I2C总西安的传输协议。传输协议吗,一样,顾名思义,任何一事物他都有自己内在的规律,只有理解了这种规律和他们相处才会更融洽些,而不会陌生的很尴尬。在上面我们已经对I2C总线的传输协议小坐了一点介绍,下面我们继续接着,当主机发送一个起始信号后,接着他就得发送数据了,发送的第一个字节数据位寻址字节,此字节决定了选取从机中的哪一个从机,相当于片选信号,在这8位字节中,其中高7位为从机地址,最后一位为读写方向控制位,何为读写方向,简言之就是控制主机是读信息还是写信息,当此位为0时,主机写,当此位为1时,主机读。好,我们还是看看他的高7位吧,当主机发送一个寻址自节后,系统中的每个从机都会将从7位数据与自己的地址进行比较,若相同则从机会应答主机寻址。在这7位数据中,高四位为固有地址,我们是不能对其进行操作编程的,但是后三位是可操作,可编程的。所以可以设置这三位来选择哪个从机被主机选中,这三位的排列方式有23=8种,故总线上可挂接8个I2C器件。对于主控器件也就是主机的读写操作,这里就不做介绍了,您可以根据上述的起始信号、应答信号、非应答信号、停止信号7个位和R/W自行思考(注意每发送完一个字节都要有一个应答位,在发送完寻址字节之后,就是发送数据了,数据为8位。之后也要寻址信号,如果之后不发送数据了,可以直接一停止信号结束,但是如果还想发送或者改变发送方向,可以重新一个起始信号,然后在寻址通过改变R/W来改变传送方向。)再次指出的是如果主机作为接收器件即读取从机的信息,最后一个字节,主机不发送应答信号即发送非应答信号,以向从机说明接收完毕,让从机停止发送。哎,要命啊,没办法,人家规定的,线少了,规矩也就多了。综上部分描述,以下是别人给出的结论无论总线处于何种方式,起始信号、终止信号和寻址字节均由主控器件发送和被控器件接收。寻址字节中7位地址为器件地址,即被寻址的被控器件的固有地址,R/W方向由于指定SDA线上数据传送的方向,R/W=0为主控器件写被控器件收,R/W=1为主控器件收被控器件写。总线上传输的每个字节后必须跟一个应答或非应答。感觉上面总结的比较好,几句就概括了我写的大部分内容。可是这几句,呵呵,就这几句,呵呵,几乎没多少用,就像,有钱花不出去一样,不过,没事,留着,总有会用到的。好,下面我们就来看看各个信号的时序,并给出相应的程序起始信号:根据上面的时序直接写程序就行了,从SDA开始,假设使用12MHZ晶振,则每个机器周期为1us。则程序如下(一下程序也按此)STA:SETBSDASETB SCL/SDA起始条件建立为大于4.7USNOPNOPNOPNOPNOPCLRSDA/按时序图拉低NOPNOPNOPNOPNOP/SCL在SDA拉低时延时大于4USCLRSCLRETC程序Void i2c_start()SDA=1;SCL=1;NOP;/此处的NOP将会在最后给出宏定义SDA=0;NOP;SCL=0;停止信号:汇编:STOP:CLR SDASETB SCLNOPNOPNOPNOPNOPSETB SDANOPNOPNOPNOPNOPCLR SDACLR SCLRETC语言Void i2c_stop()SDA=0;SCL=1;NOP;SDA=1;NOP;SDA=0;SCL=0;应答信号:汇编YINGDA:CLR SDASETB SCLNOPNOPNOPNOPNOPCLR SCLSETB SDARETC语言:Void i2c_yingda()SDA=0;SCL=1;NOP;SCL=0;SDA=1非应发信号:汇编:FEI:SETB SDASETB SCLNOPNOPNOPNOPNOPCLR SCLCLR SDAC语言:Void i2c_fei()SDA=1;SCL=1;NOP;SCL=0;SDA=0;好,本文到此也就告一段落了,置于下面的发送接收单个字节,发送接收多个字节,以及应答位检测的问题,在这里就不在将程序贴出了,感兴趣的话,可以百度一下,其实上述的时序知道怎么写了,下面的就好做了,就当作为一个作业留给你们了。嘻嘻。如果还有疑问的话,可加上面的QQ群进行讨论。最后我将上面的C语言及汇编时的端口定义一下。当然这只对需要的人的。SCL BIT 80H.0(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论