单片机应用系统 I.docx
- 文档编号:11680041
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:15
- 大小:161.70KB
单片机应用系统 I.docx
《单片机应用系统 I.docx》由会员分享,可在线阅读,更多相关《单片机应用系统 I.docx(15页珍藏版)》请在冰豆网上搜索。
单片机应用系统I
I²C总线介绍
一、I²C总线的特性
在单片机应用系统中推广I²C总线后将会大大改变单片机应用系统结构、性能,对单片机的应用开发带来以下好处。
1、可最大限度地简化结构,二线制的I²C串行总线使得各电路单元之间只需最简单的2线连接,而且总线接口都已集成在器件中,不需另加总线接口电路,这样减少电路板面积,提高了可靠性,降低了成本。
2、可实现电路系统的模块化、标准化设计。
在I²C总线上各单元电路相互之间没有其它连线,用户常用的单元电路基本上与系统电路无关,故极易形成用户自己的标准化、模块化设计。
3、I²C总线各节点具有独立的电气特性,各节点单元电路能在相互不受影响的情况下,甚至在系统供电情况下接入或撤出,且系统可方便地对某一节点电路进行故障诊断与跟踪,有极好的可维护性。
4、I²C总线系统构成具有最大的灵活性、系统改型设计、或对已加工好的电路板需扩展功能时,对原有设计及电路板系统影响最小,同时标准I²C总线模块的组合开发大大地缩短了新品的开发周期。
二、标准模式I²C总线规范
I²C总线通过2根线——串行数据(SDA)和串行时钟(SCL)线连接到总线上的任何一个器件,每个器件都应有一个唯一的地址,而且都可以作为一个发送器或接收器。
此外,器件在执行数据传输时也可以被看作是主机或从机。
发送器:
本次传送中发送数据(不包括地址和命令)到总线的器件。
接收器:
本次传送中从总线接收数据(不包括地址和命令)的器件。
主机:
初始化发送、产生时钟信号和终止发送的器件,它可以是发送器或接收器。
主机通常是微控制器。
从机:
被主机寻址的器件,它可以是发送器或接收器。
I²C总线是一个多主机的总线,也即可以连接多于一个能控制总线的器件到总线。
当2个以上能控制总线的器件同时发动传输时,只能有一个器件能真正控制总线而成为主机,并使报文并不被破坏,这个过程叫做仲裁。
与此同时,能使多个能控制总线的器件产生时钟信号的同步。
SDA和SCL都是双向线路,连接到总线的器件的输出级必须是漏极开路或集电极开路,都通过一个电流源或上拉电阻连接到正的电源电压,这样才能够实现线与功能。
当总线空闲时,这2条线路都是高电平。
在标准模式下,数据传输的速度为0~100Kbit/s。
1、位传输
I²C总线上每传输一个数据位必须产生一个时钟脉冲。
(1)数据的有效性
SDA线上的数据必须在时钟线SCL的高电平周期保持稳定,数据线的电平状态只有在SCL线的时钟信号是低电平时才能改变,如图1所示。
在标准模式下,高低电平宽度必须不小于4.7Ns。
图1I²C总线的位传输
(2)起始和停止条件
在I²C总线中,唯一违反上述数据有效性的是起始(S)和停止(P)条件,如图2所示。
起始条件(重复起始条件);在SCL线是高电平时,SDA线从高电平向低电平切换。
停止条件:
在SCL线是高电平时,SDA线由低电平向高电平切换。
图2起始和停止条件
起始和停止条件一般由主机产生。
起始条件作为一次传送的开始,在起始条件后总线被认为处于忙的状态。
停止条件作为一次传送的结束,在停止条件的某段时间后,总线被认为再次处于空闲状态。
重复起始条件既作为上次传送的结束,也作为下次传送的开始。
2、数据传输
(1)字节格式
发送到SDA线上的每个字节必须为8位。
每次传输可以发送的字节数量不受限制。
每个字节后必须跟一个应答位。
首先传输的是数据的最高位(MSB),见图3所示。
图3I²C总线的数据传输
(2)应答
相应的应答时钟脉冲由从机产生。
在应答的时钟脉冲期间,发送器释放SDA线(高)。
在应答的时钟脉冲期间,接收器必须将SDA线拉低,使她在这个时钟脉冲的高电平期间保持稳定的低电平。
如图3-3中时钟信号SCL的第9位。
一般说来,被寻址匹配的从机或可继续接收下一字节的接收器将产生一个应答。
若作为发送器的主机在发送完一个字节后,没有收到应答位(或收到一个非应答位),或作为接收器的主机没有发送应答位(或发送一个非应答位),那么主机必须产生一个停止条件或重复起始条件来结束本次传输。
若从机—接收器不能接收更多的数据字节,将不产生这个应答位:
主机—接收器在接收完最后一个字节后不产生应答,通知从机—发送器数据结束。
3、仲裁与时钟发生
(1)同步
时钟同步通过各个能产生时钟的器件线与连接到SCL线上来实现的,上述的各个器件可能都有自己独立的时钟,各个时钟信号的频率、周期、相位和占空比可能都不相同,由于“线与”的结果,在SCL线上产生的实际时钟的低电平宽度由低电平持续时间最长的器件决定,而高电平宽度由高电平持续时间最短的器件决定。
(2)仲裁
当总线空闲时,多个主机同时启动传输,可能会有不止一个主机检测到满足起始条件,而同时获得主机权,这样就要进行仲裁。
当SCL线是高电平时,仲裁在SDA线发生,当其他主机发送低电平时,发送高电平的主机将丢失仲裁,因为总线上的电平与它自己的电平不同。
仲裁可以持续多位,它的第一个阶段是比较地址位,如果每个主机都尝试寻址相同的器件,仲裁会继续比较数据位,或者比较响应位。
因为I²C总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息。
(3)用时钟同步机制作为握手
器件可以快速接收数据字节,但可能需要更多时间保存接收到的字节或准备一个要发送的字节。
此时,这个器件可以使SCL线保持低电平,迫使与之交换数据的器件进入等待状态,直到准备好下一字节的发送或接收。
4、传输协议
(1)寻址字节
主机产生起始条件后,发送的第一个字节为寻址字节,该字节的头7位(高7位)为从机地址,最低位(LSB)决定了报文的方向,“0”表示主机写信息到从机,“1”表示主机读从机中的信息,如图4所示。
当发送了一个地址后,系统中的每个器件都将头7位与它自己的地址比较。
如果一样,器件会应答主机的寻址,至于是从机—接收器还是从机—发送器都由R/W位决定。
图4起始条件后的第一个字节
从机地址由一个固定的和一个可编程的部分构成。
例如:
某些器件有4个固定的位(高4位)和3个可编程的地址位(低3位),那么同一总线上共可以连接8个相同的器件。
I²C总线委员会协调I²C地址的分配,保留了2组8位地址(0000XXXX和1111XXXX),这2组地址的用途可查阅有关资料。
(2)传输格式
主机产生起始条件后,发送一个寻址字节,收到应答后跟着就是数据传输,数据传输一般由主机产生的停止位终止。
但是,如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr)和寻址另一个从机,而不是首先产生一个停止条件。
在这种传输中,可能有不同的读/写格式结合。
可能的数据传输格式有:
主机—发送器发送数据到从机—接收器。
见图5,寻址字节的“R/W”位为0,数据传输的方向不改变。
寻址字节后,主机—接收器立即读从机—发送器中的数据,见图6。
寻址字节的“R/W”位为1。
在第一次从机产生的响应时,主机—发送器变成主机—接收器,从机—接收器变成从机—发送器。
之后,数据由从机发送,主机接收,每个应答由主机产生,时钟信号CLK仍由主机产生。
若主机要终止本次传输,则发送一个非应答信号(/A),接着主机产生停止条件。
复合格式,见图7。
传输改变方向的时候,起始条件和从机地址都会被重复。
但R/W位取反。
如果主机—接收器发送一个重复起始条件,它之前应该要发送一个非应答信号(/A)。
图5主机—发送器发送数据到从机—接收器,传输方向不变。
图6寻址字节后,主机—接收器立即读从机—发送器中的数据
图7复合格式
三、虚拟I²C总线汇编程序软件包(V1.1)
为了非常方便地对I²C从器件进行快速的、正确的读写操作,为此我们设计了硬件I²C总线操作平台软件包。
本软件包是字节方式下的硬件I²C总线软件包,只要用户给子程序提供几个主要的参数,即可轻松地完成任何I²C总线外围器件的应用程序设计。
I²C总线是PHILIPS公司推出的芯片间串行数据传输总线,2根线(SDA、SCL)即可实现完善的全双工同步数据传输,能够十分方便地构成多机系统和外围器件扩展系统。
I²C器件是把I²C的协议植入器件的I/O接口,使用时器件直接挂到I²C总线上,这一特点给用户在设计应用系统时带来了极大的便利。
I²C器件无须片选信号,是否选中是由主器件发出的I²C从地址决定的,而I²C器件的从地址是由I²C总线委员会实行统一发配。
我们推出的I²C总线的操作平台软件包,只要你给出器件从地址,即可进行字节读、字节写、多字节读、多字节写,能够非常方便地使用I²C器件,无须你介入底层的I²C操作协议。
1、A51软件包概述
此软件包是用在单主I²C总线上,硬件接口是SDA、SCL,使用MCU的I/O来模拟SDA/SCL总线。
设计有/无子地址的子程序是根据I²C器件的特点,目的在于将地址和数据彻底分开。
软件包的接口界面为:
IRDBYTE(无子地址)读单字节数据(现行地址读)
IWRBYTE(无子地址)写单字节数据(现行地址写)
IRDNBYTE(有子地址)读N字节数据
IWRNBYTE(有子地址)写N字节数据
IRDNBYTEEXT(无子地址)读N字节数据
IWRNBYTEEXT(无子地址)写N字节数据
说明:
现行地址读/写即专指无子地址的器件,不给定子地址的读/写操作。
软件包占用内部资源:
R0,R1,R2,R3,ACC,Cy。
使用前须定义变量:
SLA器件从地址,SUBA器件子地址,NUMBYTE读/写的字节数,位变量ACK。
使用前须定义常量:
SDA、SCL总线位,MTD发送数据缓冲区首址
接口子程序出口参数ACK为0时表示器件无应答
2、软件包清单
……………………………………………………………………………………………
MCS-51单片机模拟I²C软件包(V1.1)
文件名:
VI²C_ASM.INC
功能说明:
本模拟I²C软件包包含了I²C操作的底层子程序,使用前要定义
好SCL和SDA。
在标准8051模式(12Clock)下,对主频要求是不高于12MHz
(即1个机器周期1us);若Fosc>12MHz则要增加相应的NOP指令数。
(总线
时序符合I²C标准模式,100Kbit/S)
……………………………………………………………………………………………
启动I²C总线子程序:
START:
SETBSDA
NOP
SETBSCL;起始条件建立时间大于4.7us
NOP
NOP
NOP
NOP
NOP
CLRSDA
NOP;起始条件锁定时大于4us
NOP
NOP
NOP
NOP
CLRSCL;钳住总线,准备数据
NOP
RET
结束总线子程序:
STOP:
CLRSDA
NOP
SETBSCL;发送结束条件的时钟信号
NOP;结束总线时间大于4us
NOP
NOP
NOP
NOP
SETBSDA;结束总线
NOP;保证一个终止信号和起始信号的空闲时间大于4.7us
NOP
NOP
NOP
RET
发送应答信号子程序:
MACK:
CLRSDA;将SDA置0
NOP
NOP
SETBSCL
NOP;保持数据时间,即SCL为高时间大于4.7us
NOP
NOP
NOP
NOP
CLRSCL
NOP
NOP
RET
发送非应答信号:
MNACK:
SETBSDA;将SDA置1
NOP
NOP
SETBSCL
NOP
NOP;保持数据时间,即SCL为高时间大于4.7us
NOP
NOP
NOP
CLRSCL
NOP
NOP
RET
检查应答位子程序(返回值,ACK=1时表示有应答):
CACK:
SETBSDA
NOP
NOP
SETBSCL
CLRACK
NOP
NOP
MOVC,SDA
JCCEND
SETBACK;判断应答位
CEND:
NOP
CLRSCL
NOP
RET
发送字节子程序(字节数据放入ACC,每发送一字节要调用一次CACK子程序,取应答位):
WRBYTE:
MOVR0,#08H
WLP:
RLCA;取数据位
JCWR1
SJMPWR0;判断数据位
WLP1:
DJNZR0,WLP
NOP
RET
WR1:
SETBSDA;发送1
NOP
SETBSCL
NOP
NOP
NOP
NOP
NOP
CLRSCL
SJMPWLP1
WR0:
CLRSDA;发送0
NOP
SETBSCL
NOP
NOP
NOP
NOP
NOP
CLRSCL
SJMPWLP1
读取字节子程序(读出的值在ACC,每取一字节要发送一个应答/非应答信号):
RDBYTE:
MOVR0,#08H
RLP:
SETBSDA
NOP
SETBSCL;时钟线为高,接收数据位
NOP
NOP
MOVC,SDA;读取数据位
MOVA,R2
CLRSCL;将SCL拉低,时间大于4.7us
RLCA;进行数据位的处理
MOVR2,A
NOP
NOP
NOP
DJNZR0,RLP;未够8位,再来一次
RET
以下是用户接口子程序:
无子地址器件写字节数据
入口参数:
数据为ACC、器件从地址SLA
占用:
A、R0、CY
IWRBYTE:
PUSHACC
IWBLOOP:
LCALLSTART;启动总线
MOVA,SLA
LCALLWRBYTE;发送器件从地址
LCALLCACK
JNBACK,RETWRB;无应答则跳转
POPACC;写数据
LCALLWRBYTE
LCALLCACK’
LCALLSTOP
RET
RETWRB:
POPACC
LCALLSTOP
RET
无子地址器件读字节数据
入口参数:
器件从地址SLA
出口参数:
数据为ACC
占用:
A、R0、R2、CY
IRDBYTE:
LCALLSTART
MOVA,SLA;发送器件从地址
INCA
LCALLWRBYTE
LCALLCACK
JNBACK,RETRDB
LCALLRDBYTE;进行读字节操作
LCALLMNACK;发送非应答信号
RETRDB:
LCALLSTOP;结束总线
RET
向器件指定子地址写N字节数据
入口参数:
器件从地址SLA、器件子地址SUBA、发送数据缓冲区MTD、发送字节数NUMBYTE
占用:
A、R0、R1、R3、CY
IWRNBYTE:
MOVA,NUMBYTE
MOVR3,A
LCALLSTART;启动总线
MOVA,SLA
LCALLWRBYTE;发送器件从地址
LCALLCACK
JNBACK,RETWRN;无应答则退出
MOVA,SUBA;指定子地址
LCALLWRBYTE
LCALLCACK
MOVR1,#MTD
WRDA:
MOVA,@R1
LCALLWRBYTE;开始写入数据
LCALLCACK
JNBACK,IWRNBYTE
INCR1
DJNZR3,WRDA;判断写完没有
RETWRN:
LCALLSTOP
RET
向器件指定子地址读取N字节数据
入口参数:
器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE
出口参数:
接收数据缓冲区MTD
占用:
A、R0、R1、R2、R3、CY
IRDNBYTE:
MOVR3,NUMBYTE
LCALLSTART
MOVA,SLA
LCALLWRBYTE;发送器件从地址
LCALLCACK
JNBACK,RETRDN
MOVA,SUBA;指定子地址
LCALLWRBYTE
LCALLCACK
LCALLSTART;重新启动总线
MOVA,SLA
INCA;准备进行读操作
LCALLWRBYTE
LCALLCACK
JNBACK,IRDNBYTE
MOVR1,#MRD
RDN1:
LCALLRDBYTE;读操作开始
MOV@R1,A
DJNZR3,SACK
LCALLMNACK;最后一字节发非应答位
RETRDN:
LCALLSTOP;并结束总线
RET
SACK:
LCALLMACK
INCR1
SJMPRDN1
无子地址器件写N字节数据
入口参数:
器件从地址SLA、发送数据缓冲区MTD、发送字节数NUMBYTE
占用:
A、R0、R1、R3、CY
不发送子地址SUBA,直接发送多个数据
IWRNBYTEEXT:
MOVA,NUMBYTE
MOVR3,A
LCALLSTART;启动总线
MOVA,SLA
LCALLWRBYTE;发送器件从地址
LCALLCACK
JNBACK,RETWRNE;无应答则退出
MOVR1,#MTD
WRDAE:
MOVA,@R1
LCALLWRBYTE;开始写入数据
LCALLCACK
JNBACK,RETWRNE
INCR1
DJNZR3,WRDAE;判断写完没有
RETWRNE:
LCALLSTOP
RET
无子地址器件读取N字节数据
入口参数:
器件从地址SLA、器件子地址SUBA、接收字节数NUMBYTE
出口参数:
接收数据缓冲区MTD
占用:
A、R0、R1、R2、R3、CY
说明:
此函数不发送子地址,也不重新启动总线,而是直接读取多个数据
IRDNBYTEEXT:
MOVR3,NUMBYTE
LCALLSTART
MOVA,SLA
INCA
LCALLWRBYTE;发送器件从地址
LCALLCACK
JNBACK,RETRDNE
MOVR1,#MRD
RDNE1:
LCALLRDBYTE;读操作开始
MOV@R1,A
DJNZR3,SACKE
LCALLMNACK;最后一字节发非应答位
RETRDNE:
LCALLSTOP;并结束总线
RET
SACKE:
LCALLMACK
INCR1
SJMPRDNE1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机应用系统 单片机 应用 系统