《AVR单片机嵌入式系统原理与应用实践》第16章 串行TWI接口应用 中的疑问???
Note: TWI工作在主机模式时,TWBR值应该不小于10。 否则主机会在SDA 与 SCL产生错误输出作为提示信号。问题出现于 TWI 工作在主机模式下,向从机发送 Start + SLA + R/W 的
时候 (不需要真的有从机与总线连接 )。
以上是AVR官方手册的说明。
但是马老师的书中的例子对TWBR的设置采用了默认的0,即再CPU=4MHz时,SCL=250KHZ。
是否违背了TWBR值应该不小于10。 这样会while(!(TWCR&(1<<TWINT))) {};
死在这里吗? 数据手册中的“TWI工作在主机模式时,TWBR值应该不小于10。”是针对早期的I2C器件,它们数据传输速率可“高达100kbit/s”
现在大部分的I2C器件都符合快速模式(位速率高达400kbit/s),所以这个规定松动了。但当系统使用16M,I2C器件是快速标准器件时,也会出问题。
快速器件的SCL<=400K,如果使用16M晶体的话,16000000 / (16 + 2(10)) = 16000000/36 = 444.444k,所以可能会出问题了。
问题是发出的起始信号太快了(SDA下降然后SCL下降的间隔太小),从机可能检测不到,没有回答,或者AVR自己也会检测错误,这时while(!(TWCR&(1<<TWINT))) {}; 就成了死循环了。
我的例子中,使用4M时钟,TWBR=0时,SCL也只有250K,远小于400K,所以没有问题。
=====================================================================================
具体I2C规范在我书的光盘中有参考资料。下面给出一段:
标准模式I2C总线规范在80 年代的初期已经存在,它规定数据传输速率可高达100kbit/s, 而且7 位寻址这个概念在普及中迅速成长。今天它已经作为一个标准被全世界接受。而且Philips Semiconductors和其他供应商提供了几百种不同的兼容IC。
为了符合更高速度的要求,以及制造更多可使用的从机地址,给数量不断增长的新器件,标准模式I2C总线规范不断升级。到今天它提供了以下的扩展
• 快速模式位速率高达400kbit/s
• 高速模式Hs 模式位速率高达3.4Mbit/s
=================================================================
这个行当不好干,机械的学习是不行的。AVR只是其中的一个要素,要有牢固的基础和广泛的知识,会分析和思考。 谢谢马老师
页:
[1]