Protues-ATmega8仿真老杨工作室young45@126.com第七讲IIC通信的学习提要:主要学习用Atmega8的IIC通信。前面我们学习了一种主要的通信方式:串口通信。接下来我们要学习一种新的通信方式:IIC(TWI)通信。7.1IIC通信的特点:首先我们简单了解一下IIC总线:IIC总线是一种串行数据总线,只有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。在IIC总线上传送的一个数据字节由八位组成。总线对每次传送的字节数没有限制,但每个字节后必须跟一位应答位。数据传送首先传送最高位MSB。首先由主机发出启动信号S(SDA在SCL高电平期间由高电平跳变为低电平),然后由主机发送一个字节的数据。启动信号后的第一个字节数据具有特殊含义:高七位是从机的地址,第八位是传送反向位,0表示主机发送数据(写),1表示主机接收数据(读)。被寻址到的从机设备按传送方向位设置为对应工作方式。标准IIC总线设备都有一个七位地址,所有连接在IIC总线上的设备都接收启动信号后的第一个字节,并将接收到的地址进行比较,如果地址相符,则为主机要寻访的从机,应在第九位应答时钟脉冲时向SDA线送出低电平作为应答。除了第一字节是通用呼叫地址或十位从机地址之外第二字节开始即数据字节。数据传送完毕,由主机发出停止信号P(SDA在SCL高电平期间由低电平调变为高电平)。ATmega8单片机提供了实现标准两线串行总线通信的硬件接口IIC(在AVR单片机中通常叫TWI),其主要特点如下:1.只需要两根线实现灵活的串行通信接口;2.支持主控/被控器件操作模式;3.器件可作为发送器件或接收器件;4.7位的地址空间,支持最大为128个从机地址;5.支持多主机模式;6.高达400kHz的数据传输率;7.斜率受限的输出驱动器;8.噪声监控电路防止总线上的毛刺;9.全可编程的从机地址;10.地址监听中断使AVR从休眠模式唤醒。学习应用之前,我们还是先了解要用到的寄存器:TWBR、TWCR、TWSR、TWDR、TWAR。一.TWI波特率寄存器TWBR7..0:用于设置波特率发生器的分频因子,波特率发生器是一个频率分频器,当工作在主控器模式下,它产生和提供SCL引脚上的时钟信号。计算公式如下:162()4TWPSCPUClockSCLTWBR=+×二.TWI控制寄存器TWCR:第7位TWI中断标志位:TWINTProtues-ATmega8仿真老杨工作室young45@126.com当TWI接口完成当前工作,期待应用程序响应时,该位被置位。如果全局中断I和TWCR寄存器中的TWIE都为1,MCU将跳到TWI中断向量。一旦TWINT标志位被置位,时钟线SCL将被拉为低。在执行中断服务程序时,TWINT标志位不会由硬件自动清零,必须通过软件写入逻辑1来清零。清零TWINT标志位将开始TWI接口的操作,因此对TWI地址寄存器TWAR、TWI状态寄存器TWSR和TWI数据寄存器TWDR的访问,必须在清零TWINT标志位前。第6位TWI应答ACK允许:TWEA该位控制应答ACK信号的发生。如果TWEA位被置1时,在一下情况下ACK脉冲将在TWI总线上发生:1.器件作为被控器件时,接收到呼叫自己的地址;2.当TWAR寄存器中的TWGCE位被置位时,接收到一个通用呼叫地址;3.器件作为主控器件接收器或被控器接收器时,接收到一个数据字节。如果清零TWEA位,将使器件暂时虚拟地脱离TWI总线。地址识别匹配功能需要通过TWEA位为1来重新开始。第5位TWI起始START信号状态位:TWSTA当要将器件设置为串行总线上的主控器时,则需要设置TWSTA位为1。TWI接口硬件检查总线是否空闲。如果总线空闲,将在总线上发出一个起始START信号。但是如果总线并不空闲,TWI将等到总线上一个终止STOP信号被检测到后,再发出一个新的起始START信号,以获得总线的控制权而成为主控制器。当起始START信号发出后,TWSTA位将由硬件清零。第4位TWI终止STOP信号状态位:TWSTO当芯片在主控器模式时,设置TWSTO位为1,将在总线上发出一个终止STOP信号。电终止STOP信号发出后,TWSTO位将被自动清零。电芯片在被控器模式时,置位TWSTO位用于从错误状态恢复。此时,TWI接口并不发出终止STOP信号,但硬件接口模块返回正常的初始未被寻址的被控器模式,并释放SCL和SDA线为高阻状态。第3位TWI写冲突标志位:TWWC在TWINT位为0时,试图向TWI数据寄存器TWDR写数据,TWWC位将被置位。在TWINT位为1时,写TWDR寄存器将自动清零TWWC标志位。第2位TWI允许位:TWENTWEN位用于使能TWI接口操作和激活TWI接口。当TWEN位被写为1时,TWI接口模块将I/O引脚PC5和PC4转换成SCL和SDA引脚,使能斜率限制器和毛刺滤波器。如果该位被清零,TWI接口模块将被关闭,所有TWI传输将被终止。第1位保留第0位TWI中断使能:TWIE当改为被写为1,同时全局中断I被置位1时,只要TWINT标志位为1时,TWI中断请求即被使能。三.TWI状态寄存器TWSR:第7..3位TWI状态位:TWS7..3这5位反映了TWI逻辑状态和TWI总线的状态。注意,从TWSR寄存器中读取的值包括了5位状态值和2位预分频值。因此,当检查状态位时,应该将预分频器位屏蔽,使状态检验与分频器无关。Protues-ATmega8仿真老杨工作室young45@126.com第2位保留。第1..0位TWI预分频器位:TWPS1..0这些位可被读写,用于设置波特率的预分频率。TWPS1TWPS0预分频值00101410161164四.TWI数据寄存器TWDR7..0:这8位包括将要发送的下一个数据字节,或TWI总线上最后一个接收的数据字节。当TWI不处在字节移位操作过程时,该寄存器可以被写,即当TWI中断标志位TWINT由硬件置位时,其可以被写。注意:在第一次TWI中断发生前,数据寄存器不能由用户初始化。当TWINT位被置位时,TWDR中的数据保持稳定。当数据被移出时,总线上的数据同时也被移入,因此TWDR的内容总是总线上出现的最后字节,除非当MCU从休眠模式中由TWI中断而唤醒。五.TWI被控器地址寄存器:TWAR第7..1位TWI被控器地址寄存器:TWA6..1用作存放TWI单元的被控器地址;当TWI被设置为被控接收器或被控发生器时,在TWAR中应设置被控器寻址地址;而在主控器模式下,不需要设置TWAR;在多主竞争的总线体系中,如果器件的角色即可以为主控器又可为被控器时,必须设置TWAR寄存器。第0位TWI通用呼叫(或广播呼叫)识别允许位:TWGCE如果改为被置位,将使能对TWI总线上的通用地址的呼叫(或广播呼叫)和识别。TWI数据发送处理过程如下:7.2IIC通信的应用:读写外部存储器24C02前面我们学习了IIC通信的理论知识,下面我们就试着应用IIC通信来读写外部存储器24C02,有了前面的知识,在Protues上仿真就很简单了,下面我先给出电路图:Protues-ATmega8仿真老杨工作室young45@126.com我们用到的硬件有:串口终端、ATmega8和存储器24C02C。我们要实现的功能也很简单:回顾前面串口通信的内容,我们用串口终端作对外接口,开始提示用户输入一个字符,串口收到该字符,保存到24C02中,然后我们在从24C02中读取该字符,读出后也显示在串口终端上;接下来再提示用户输入新的字符……,同上,不停的作这个操作。怎么样,很简单吧,你也来试试:Protues-ATmega8仿真老杨工作室young45@126.comProtues-ATmega8仿真老杨工作室young45@126.comProtues-ATmega8仿真老杨工作室young45@126.com我们要注意的是IIC的读写过程,每次发送命令或写数据后TestAck()的返回值是不同的;另外就是读取24C02时,要先发写命令帧,写入要读取地址,然后重启,再发读取命令帧,读取数据。