TWI:ATMega
系列单片机内集成两线制串行接口模块,ATmegl文档称为TWI接口事实上TWI与PHILIOS的I2C总线是同一回事,之所以叫它TWI是因为这样命名可使ATmel避免交术语版税。所以,TWI是兼容I2C的一种说法。
I2C总线最只要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10KPS的最大传输率支持40个组件,I2C总线的另一个优点是,它支持多主控(MULTIMASTERING),其中任何能够进行发送和接受的设备都可以称为主总线,一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接受数据。在CPU与被控IC之间、IC与IC之间进行双向传送、最高传送速率100KBPS.各种被控制电路均并联在这条总线上,最高传送速率100KBPS.各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能,CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定调整的类别(如对比度、亮度等)及需要调整的量。这样各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
oI2C总线在传送数据过程中共有三种类型信号,
它们分别是:开始信号、结束信号和应答信号。
o开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
o结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
o应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
o这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
发送地址跟上面右边那个两个发送数据 0
1
是一样的由时钟来锁存相应的数据位,地址共七位,第8位是读还是写状态,读的话置1 写 置0
。第9位是应答为,切记应答位不是单片机发出的,而是I2C器件发出的。应答位是这样产生的,I2C器件在接收到完整的8位数据之后,I2C器件判定接受成功,它会向总线发送一个应答信号,可以看到就是在一个时钟脉冲期间,数据线SDA保持低电平就是0,当然发送完地址位之后呢?就发送数据,长度可能是可能1个字节或多个字节。数据的个数跟器件是有关系的。比如AT24C02
EEPROM芯片对他进行读写操作 如写可以进行1 2
4 8 字节,当地址数据结束后来一个结束信号。表示这一帧结束了。
下面说下ATmega 16 的TWI模块。下图 (由于ATmega 16 的技术文档讲的比较详细了,所以我们也结合atmege 16
的数据手册说了)。
这是两线的一些特点:(自己翻一下吧)
一、简单,但是强大而灵活的通讯接口,只需两根线
二、支持主机和从机的操作
三、器件可以工作于发送或接受
四、7位地址空间允许128个从机
五、高达400KHZ的数据传输率
六、斜率受控制的输出驱动器
七、可以抑制总线的尖峰噪声控制器
八、完全可变成的从机地址以及公共地址
九、睡眠时地址匹配可以唤醒AVR
首先看下数据传输和帧格式下图(传输 数据 (位))
(TWI总线上数据位的传送与时钟脉冲同步。时钟线为高时,数据线电压必须保持稳定,除非在启动与停止的状态下。官方的解释)
其实这个图说明在SCL为高电平期间 SDA 数据必须稳定0 或1
当然还有起始位与停止位如下图
(翻译如下)
{
主机启动与停止数据传输。主机在总线上发出START信号以启动数据传输;在总线上发出STOP信号以停止数据传输。在START与STOP
状态之间,需要假定总线忙,不允许其它主机控制总线。特例是在START与STOP
状态之间发出一个新的START状态。这被称为REPEATED
START状态,适用于主机在不放弃总线控制的情况下启动新的传送。在REPEATED
START之后,直到下一个STOP,需要假定总线处于忙的状态。这与START是完全一样的,因此在本手册中,如果没有特殊说明,START与REPEATEDSTART均用START表述。如下所示,START与STOP状态是在SCL线为高时,通过改变SDA电平来实现的。
}
开始停止时序图
像这个图中间的一些开始停止和从新开始在绝大数都是用不到的。就不细说了。
下图是地址数据包格式(好好看看是 地址数据的讲解)
翻译下:所有在TWI总线上传送的地址包均为9位,包括7位地址位、1位READ/WRITE控制
位与1位应答位。如果READ/WRITE为1,则执行读操作;否则执行写操作。从机被寻
址后,必须在第九个SCL (ACK)周期通过拉低SDA作出应答。若该从机忙或有其它原因
无法响应主机,则应该在ACK周期保持SDA为高。然后主机可以发出STOP状态或
REPEATED START 状态重新开始发送。地址包包括从机地址与分别称为SLA+R或
SLA+W的READ或WRITE位。
地址字节的MSB首先被发送。从机地址由设计者自由分配,但需要保留地址0000 000
作为广播地址。
当发送广播呼叫时,所有的从机应在ACK周期通过拉低SDA作出应答。当主机需要发送
相同的信息给多个从机时可以使用广播功能。当Write位在广播呼叫之后发送,所有的从
机通过在ACK周期通过拉低SDA作出响应。所有的从机接收到紧跟的数据包。注意在整
体访问中发送Read位没有意义,因为如果几个从机发送不同的数据会带来总线冲突。
所有形如1111 xxx格式的地址都需要保留,以便将来使用。
地址包格式图下图:
这个图从右边往左边看先发送的最高位 最后发的是低位。 从 1---9 最后一位 ACK 响应。
下面是数据包下图
官方解释
可见数据包是8位数据加一个应当位。
下图是地址和数据包一个完整的传输。组合一起
SLA +RW 就是地址数据 的传送的字节数由应用程序的协议决定。
1个字节 2 4 8
个字节数据。
下图是多主机总线系统如图(这个大部分场合用不到所以不用看 以后可以了解下)
解释
下面讲解下TWI 模块的使用方法:如图构成
首先看下SCL SDA
有两个引脚 是在22
与23 脚 PC0 PC1 下面是这两脚的说明
还有一个波特率发声单元与USART相似 他控制SCL
的时钟周期,当然这个比特率有两个寄存器决定,TWBR
TWPS 有SCL frequency
公式的。CPU的单片机晶振频率 除以 16加上2倍的TWBR
乘以4的TWPS它的次数注意:如果工作在主机模式不应该小于10 下面有解释
下面是总线的接口单元主要包括一些寄存器总线总裁。我们没必要关心然后又一个地址匹配单元看下啊(只有在多级通讯时候多个单片机进行I2C通讯时候我们给每个单片机设置一个本机地址如果匹配了表示发给自己的,初学者一般也不看)最下面是控制器有图都复制上来吧!还有官方中文解释。
解释有下图
其实都不重要我们要TWI 寄存器它的使用是重要的。呵呵开始讲吧!最终我们的应用都是对这些寄存器操作。
首先是比特率上面有公式第一个寄存器

这个是控制寄存器非常重要。
第二个寄存器
TWCR
首先是第7位 TWINT: TWI 中断标志
在什么时候产生中断呢?当发送完 地址包 数据包 ,注意这一位清0呢。必须手动清0
必须通过软件写1,不像其他的中断能够自动置1.
第6位 (使能TWI 应答)这个TWEA 在多级通讯时候,就是有其他的I2C器件向AVR单片机发送数据,这时候AVR
单片机在接受到一帧数据之后,它会发送一个应答位,也就是使能这位后,向发送放返回一个应答位这种信息。

官方解释

第5位(是一个状态标志位,TWSTA它表示的是TWI START 这个信号。第4位 和第5位都是多级通讯用的到的。)
官方解释
第3位:TWWC 是TWI 的写碰撞标志。
就是标志出TWDR 数据寄存器是否可以写。如果为低的时候可以写数据
第2位:TWI 使能。置位此位TWI 。如果使用TWI模块此位必须模块激活。
第1位:是保留位没有作用的。
第0位:TWIE 使能TWI 中断。 (要中断方式使用TWI 总线的的话就要使能这个位 置位)
第3个寄存器:状态寄存器
它的第7位到第3位
5位反应TWI逻辑总线的状态,不同的状态的状态代码会在后面部分描述,所以我们在读取这5位状态代码的时候,读取方法就是先读取这个寄存器然后通过与这个0b11111000将最后两位屏蔽掉因为TWPS是预分频位,在比特率发生器里面是有作用的,有公式的
4的指数
第四个寄存器:TWDR (类似于USART
SPI 的数据寄存器差不多的)
发送模式包含 字节,接受模式包含接受到的数据。
第五个寄存器:TWAR
从机地址寄存器
(多级通讯用的到)
如何使用TWI
其实这个图跟一次完整数据传输类似的。所有的不同在这第
3个阶段结束的时候有一个TWI中断触发也就是TWINT这一位被置位,可以用于触发中断。
第一步 :向TWCR 写一个1 使能一个START 信号。就是通过TWCR
寄存器的内容进行一个发START信号的操作。发送成功之后会有一个TWINT中断,在中断里面SCL时钟不采取任何动作的。
第二步:在中断里面通过查询 status code 就是那五位数据看是何种状态,来确定是start
发送完成中断。
第三步:发送一个地址包,就是程序将SLA(从机地址)
+W (读写位)就是7位从机地址加1位读写位,写入到TWDR 数据寄存器对这些寄存器进行一些确认操作。
第四步:在数据包发送完成和接受到ACK信号之后继续等待第2个中断。接收到ACK信号之后呢TWINT会置位 。
第五步:再处理一次中断,在这个中断里写入数据字节,也是8位数据
第六步:8位数据发送成功接受到ACK TWINT 会再次置位,那么这个 status
code 会指示出发送完成。当然这只是发送一个字节数据,如果发送多个数据这个过程会持续多次,一直到数据发送完成。
第七步:接受完成之后且接收到ACK
我们这里会发送一个STOP信号,也是通过写TWCR寄存器来实现的。当然STOP发送成功之后不会触发中断。值得注意的是中间如果进行多字节的读或写的话发送的字节数是由编程来把握的,也就是说AVR单片机不会知道你要发多少个字节。所以这个处理相当于在第7步这里。如果我们程序判断我们程序已经发送完毕,我们就发一个STOP信号若如果,没有就重复一下第五步。这就是ATmega
16的TWI总线的使用方法。下面我们结合24c02一个实际的程序来给大家吹吹牛。
oAT24C02是由ATMEL公司提供的,I2C总线串行EEPROM,其容量为2Kbit(256B),工作电压在2.7V~5.5V之间,生产工艺是CMOS工艺。
各引脚功能如下。
A2~A0:器件地址选择引脚。将这3个引脚配置成不同的编码值,在同一串行总线上最多可扩充8片同一容量或不同容量的24系列串行EEPROM芯片。
SDA:串行数据输入输出口,是一个双向的漏极开路结构的引脚,容量扩展时可以将多片24系列的SDA引脚直接相连。
SCL:串行移位时钟控制端。写入时上升沿起作用,读出时下降沿起作用。
WP:硬件写保护控制引脚。当其为低电平时,正常写操作,高电平时,对EEPROM部分存储区域提供硬件写保护功能,即对被保护区域只能读不能写。
GND:接地。
VCC:接+5V电压
2k位 256*8 =
2K
等于256b
地址值相当于低三位 0 1 2 组合 8个数字
7 硬件写保护 低电平 可以正常写操作 高 的话只能读 所以我们接地OK了
它的相关电路设计如下图
我们设置的时候都会将他的地址值变为0 0 1 2 全接地线 ,5 6
PC0 PC1 因为第2功能是TWI 总线
0.1uf进行电源退耦,一般数字芯片 高速的数字时钟对所在电源产生干扰。净化电源。
容量计算方法
AT24Cxx:01~1024
容量=xx X 1Kbit
型号系列列表
AT24C01 1K(128X8)
AT24C02 2K(256X8)
AT24C04 4K(512X8)
AT24C08 8K(1KX8)
AT24C16 16K(2KX8)
AT24C512 512K(64KX8)
AT24C1024 1M(128KX8)
值得一提是AVR单片机片上自带EEPROM
芯片,而且是1K字节相当于24C08这个容量。而我们24c02实际应用并不大。当然有一些应用场合必须外置的。因为是学习板,因为这个芯片比较常见,学习I2C总线的作用。
下图为总体的操作流程
写
与读的操作流程和上面的7步可以对比下。器件地址的表示方法等下讲一下。器件地址的高4位是0xa0
1010 低四位 前3位就是 a0 a1
a2 第4位是
读写地址 然后等待ACK 。
数据地址相当于数据 在256字节的 存储器里面的编址,它处于数据包的一部分是8位的。
所以这个是写是 地址一个
数据2 个
数据1是数据所处的地址 第2是数据的内容
这就是写一字节的操作流程。
右边是读类似。
读出的是多个字节 循环判断是否是最后一个字节,而24c02是 ACK 就是ACK 来产生的,最后产生一个停止位
所以这个读操作相当于是 地址包1个字节 数据包是多个字节。
下面结合程序来大家讲解AT24C02应用。
打开整体测试板程序 我没有哦
# 需要此头文件