TWI接口和TWI接口器件使用

上传人:油条 文档编号:12963467 上传时间:2017-10-21 格式:DOC 页数:9 大小:150KB
返回 下载 相关 举报
TWI接口和TWI接口器件使用_第1页
第1页 / 共9页
TWI接口和TWI接口器件使用_第2页
第2页 / 共9页
TWI接口和TWI接口器件使用_第3页
第3页 / 共9页
TWI接口和TWI接口器件使用_第4页
第4页 / 共9页
TWI接口和TWI接口器件使用_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《TWI接口和TWI接口器件使用》由会员分享,可在线阅读,更多相关《TWI接口和TWI接口器件使用(9页珍藏版)》请在金锄头文库上搜索。

1、TWI 接口和 TWI 接口器件使用AVR 单片机的很多型号也具有两线制接口,即 TWI 接口。实际上 TWI 接口时序和常见的 CI2总线是兼容的。我们这本书结合讲的单片机 Atmega16 就有这种接口。这种接口的使用也十分广泛。比如本文会结合介绍的 EEPROM AT24C64;MAXIM 公司的温度传感器(查出型号) ;有的 A/D 转换器;菲利普还有专门的用这种总线的 I/O 扩展芯片。TWI 电路接线简单,占用 I/O,并且可以很多期间共享一个总线,使用比较方便,系统也很简洁。AVR 单片机用硬件实现了这种总线的时序,省去了很多编程工作。同时支持一条总线多个主设备的通讯。我们只需要

2、控制相关寄存器就能实现通过 TWI 传输数据。很大程度上减少了我们的工作量,从而使代码更简洁,开发更容易。下面我们会介绍 CI2的基本知识,AVR 的 TWI 接口的功能和使用,给出一个用 TWI 接口读写 I2接口的 EEPROM的例子,最后给出适用于 AVR-GCC 编译器的示例程序。一、 CI2总线的基本知识总线的信号线有两条,一条是时钟线 SCL,另一条是数据线 SDA。总线连接起来的时候,需要两个上拉电阻,器件内部这两个信号引脚是集电极开路(或者是漏极开路)的。这样总线上的器件只要有一个输出低电平总线就会被拉低(实际上就是所谓线与的逻辑) ,这主要用于总线仲裁。1.在 I2总线上,有

3、几个状态表示特殊的总线信号。开始和停止信号时序如下图所示:图上可以看出,在 SCL 位高电平时 SDA 的变化将产生总线开始和停止信号。SDA 从高电平跳变到低电平表示开始,从低电平跳变到高电平表示停止。数据的建立和有效:上图表示在传输数据时,SCL 高电平的时候,SDA 上的数据不能变化,因为前面已经说明,这是数据的变化将会认为是开始或者结束的信号。在 SCL 低电平时数据可以改变。2.主器件和从器件总线上可以有很多设备但是同时只能有一个主设备进行传输,从设备都有设备地址,当总线上的地址和从设备设置的地址一致时,传输在主设备和被寻址的从设备之间进行,其他设备相当于和总线分离。主设备产生 SC

4、L 信号。当总线上有多个主设备试图传输不同的数据的时候,就会产生总线仲裁问题。3. CI2的寻址过程在 总线上的数据传输,除了开始和停止之外,由于可以多个从设备共用总线还会有一个寻址过程。寻址过程通过主设备发送一定格式的寻址命令进行。寻址命令由起个位的从设备地址、一位读写标志和一位响应信号组成。七位的从设备地址可以由设计者任意设定,不过 0000000 是一个通用寻址地址。当主设备需要向所有的从设备传输同样的信息的时候,可以使用通用寻址地址,这时,总线上的所有设备拉低 SDA 线,响应这个命令。此后,主设备往总线上写的数据会被所有的相应这个寻址命令的从设备接收到。但是,一个通用的都命令是没有意

5、义的,因为有可能不同的从设备会向总线传送不同的数据(电平) ,从而引起总线冲突。从设备地址 11111xxx 需要留给将来的应用。有的从设备进一步规定了寻址的格式。比如ATMEL 公司 24CXX 系列的 EEPROM 就规定寻址的开始四位必须是 1010。这是根据相应器件的说明书设置相应的地址就行了。读写控制位是 1 的时候执行读操作,是 0 的时候执行写操作。往总线传输时最高位(MSB)最先送出,最后是读写指令,当相应器件被寻址的时候,它会拉低 SDA 线,作为回应。如果没有器件被正确寻址,或者要寻址的器件忙,则 SDA 会保持高。这是主设备就会知道寻址没有成功,可以发送一个停止命令,或者

6、重新开始命令。4. CI2的数据发送过程寻址以后就是数据发送过程。这时主设备负责产生时钟,发送开始和停止指令,接收设备需要接收到数据要发出回应。时钟的第九个周期如果 SDA 被拉低,表示接收回应,如果还是保持高,则表示没有回应。数据有八位,高位先传输。二、AVR 单片机的 TWI 接口AVR 单片机的提供了硬件实现 CI2总线时序的 TWI 接口,通过控制与此相关的特殊功能寄存器就能按照字节通过 总线传输数据。接口功能的详细介绍可以参考相应型号单片机数据手册,下面我们就 Atmega16 做一下简要介绍。1. 1. SCL 和 SDA 引脚两个管脚功能是和普通 I/O 复用的,当开始使用 TW

7、I 接口传输数据的时候,硬件会覆盖原来对这两个和 I/O 的设置,自己控制输入输出的方向。由于总线是需要上拉电阻的,AVR单片机这时允许内部上拉电阻有效,从而可以省去两个外部电阻。同时引脚的输入部分有毛刺去除电路,输出有斜率限制。2. 2. 波特率设置当 TWI 工作在主模式下的时候,AVR 单片机产生时钟信号驱动时钟线 SCL。时钟的周期由 TWI 的状态寄存器 TWSR 的预分频位和 TWI 的波特率寄存器 TWBR 决定。当 TWI 工作于从模式下时,不需要对波特率进行设置,不过系统的时钟必须大于 TWI 时钟线 SCL频率的 16 倍。下面是 SCL 频率和寄存器相应设置的关系的式子:

8、twpsclokSCLTWBRff 4)(216其中, SL就是 SCL 的频率, clokf是系统的时钟,TWBR 为 TWI 接口波特率寄存器的值(八位二进制数表示的数值) ,TWPS 表示 TWI 接口状态寄存器预分频为的值。需要注意的是,在 AVR 单片机工作于主模式时,TWPS 的值要大于 10,否则有可能产生不正确的输出。3. 3. 单片机的从设备地址AVR 单片机作为从设备的时候,需要一个从设备地址。这个地址设置在从设备地址寄存器TWAR 即可。TWAR 的最低位 TWGCE,是选择是否识别通用寻址地址的,如果置为 1,则在收到通用寻址指令时也会作出回应。4. 4. TWI 接口

9、相关中断在 TWI 接口完成了当前任务,需要软件响应的时候会把 TWTNT 置为 1。如果单片机中断允许,并且 TWCR 的 TWIE 为 1,就会产生相应中断。需要注意的是,中断服务程序执行后硬件不会自动把 TWINT 位置 0,必须通过软件向该位写 1 来清零。每次清零 TWINT 位意味着一次新的总线操作开始,所以在清零以前要保证访问 TWAR 和 TWSR,以及TWDR 的操作已经完成。三、AVR 单片机 TWI 接口的使用由于有了硬件的接口电路,我们不需要关系线上的时序了,不过使用中还要遵循总线规范。有一些要注意的问题。这一部分,介绍使用 TWI 接口发送总线信号的方法,给出简单的程

10、序。1. 1. 发送开始信号主设备对总线的合法操作都从发送开始命令开始。下面给出发送开始命令的程序:TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN); /* 发送开始命令 0 */while (TWCR & _BV(TWINT) = 0) ; /* 等待传送完毕*/首先将 TWINT 清零,接着程序向 TWI 控制寄存器的 TWSTA 位写 1,如果总线空闲 TWI就会往总线发送一个开始命令。否则,会等到总线上有一个停止信号的时候发送开始信号。TWEN 是接口允许控制位,置 1 表示接口允许,这是 TWI 接口控制 SCL 和 SDA 管脚。传送开始信号以后

11、要等待传送完毕才进行后面的操作。2. 2. 发送停止信号下面是发送停止信号的语句:TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN); /* 发送停止信号 */TWINT 和 TWEN 的设置和前面一样。在 AVR 单片机工作于主模式下,TWCR 中的TWSTO 位置 1 的时候,会在总线上产生一个停止信号。在从模式下,TWSTO 置 1,会使总线从错误状态恢复。3. 3. 发送数据这里所说的数据,可以是寻址命令,也可以是要发送的数据。下面是发送一个字节数据的代码:TWDR = data; /* 数据写入 TWI 接口数据寄存器 TWDR */TWCR = _

12、BV(TWINT) | _BV(TWEN); /* 清零中断标志,开始传输 */while (TWCR & _BV(TWINT) = 0) ; /* 等待传输完毕*/TWDR 就是 TWI 接口的数据寄存器,TWI 接口要发送的数据先写入这个寄存器,接收到的数据从这个寄存器读出。4. 4. 检查传输状态TWI 对总线进行操作以后,可以返回这次操作完成的状态。比如发送了开始信号, TWI 接口就会返回,总线是否正确进入开始状态。程序中可以检查这些状态,以确保每次操作正确进行,并对异常状态进行处理。TWSR 的高五位就是 TWI 的状态位。相应的状态在AVR 单片机的数据手册中都有详细的说明。在

13、AVR-GCC 编译器的包含文件中有一个twi.h 对这些状态定义了相应的宏。这里我们不再详细列出所有状态,给出一个带状态检查的程序:begin:TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN); /* 发送开始信号 */while (TWCR & _BV(TWINT) = 0) ; /* 等待发送完成 */switch (twst = TW_STATUS)case TW_START:break;case TW_MT_ARB_LOST:goto begin;default:return -1;/接着是下一步操作的代码程序中的 TW_START 就是一个宏表示

14、开始状态,TW_MT_ARB_LOST 表示主模式总线仲裁失败。这些定义参考头文件 twi.h。程序的功能就是如果总线处于开始状态继续下一步操作,如果是总线仲裁失败,重新发送开始信号,如果出现错误,返回错误标志。以上分别介绍了 TWI 接口基本操作的使用,但是在操作实际器件的时候必须是这些操作组合起来进行,所以我们下面给出一个通过 AVR 单片机读写 CI2总线接口的 EEPROM的例子,通过这个例子说明整个使用过程并给出相应示例程序。四、用 AVR 单片机的 TWI 接口读写 EEPROM这是一个用 TWI 接口读写 AT24C64 的例子。通过这个例子我们会说明 TWI 接口使用的整个过程

15、。1. 1. EEPROM 芯片简单介绍AT24C64 是 ATMEL 公司生产的 EEPROM。它共有 64K 位,按照字节寻址。下面是它的管脚图和管脚功能的列表。A2A1A0 是用来设置从设备地址的,这就意味着,可以有八个这样的器件共享一条总线。外部不连接的地址位缺省为 0。2. 2. 器件寻址和读写时序a. a. 器件寻址操作 EEPROM 的时候先要寻址希望访问的器件。寻址命令的结构和前面描述的是一样的不过,前四个字节必须是 1010 后面三个才是有效的器件地址。如果器件被正确寻址会输出 0 作为响应,否则进入空闲状态。下面是一个说明寻址命令结构的图:当然器件寻址的操作一般不会单独进行

16、,前面要有开始信号,后面将是读写操作。b. b. 读时序上面的图说明了,从 EEPROM 中读一个字节的时序。先是开始信号,然后是器件寻址操作,接着是两个字节要读的字节的地址。这些发送完毕以后,主设备要重新发送开始信号,再进行器件寻址操作,随后就会读出指定地址的数据。需要注意的是,在发送地址时的器件寻址操作,读写控制位置为写状态,在后一个器件寻址操作时,读写控制位置为读。读出一个字节后如果不发送停止信号,可以继续读出下一个字节,依此类推,知道读到对后一个地址,又会从零地址开始读出数据。c. c. 写时序下图是写操作的示意图.可以看出写操作比读简单一些。发送开始信号后,只需要一次器件寻址,读写控制置为写状态,接着发送要写入数据的地址,然后就是要写入的数据。如果只需要写入一个字节,传输完一个字节数据后发送停止信号就完成了一次写操作。不过 24C64 具有按页写的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号