anydaywilldo 发表于 2009-8-4 11:10:10

《AVR单片机嵌入式系统原理与应用实践》第16章 串行TWI接口应用 中的疑问???

Note: TWI工作在主机模式时,TWBR值应该不小于10。 否则主机会在SDA 与 SCL产生错误输
出作为提示信号。问题出现于 TWI 工作在主机模式下,向从机发送 Start + SLA + R/W 的
时候 (不需要真的有从机与总线连接 )。

以上是AVR官方手册的说明。

但是马老师的书中的例子对TWBR的设置采用了默认的0,即再CPU=4MHz时,SCL=250KHZ。
是否违背了TWBR值应该不小于10。

anydaywilldo 发表于 2009-8-5 10:17:56

这样会while(!(TWCR&(1<<TWINT))) {};
死在这里吗?

machao 发表于 2009-8-6 00:43:33

数据手册中的“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只是其中的一个要素,要有牢固的基础和广泛的知识,会分析和思考。

anydaywilldo 发表于 2009-12-2 16:44:29

谢谢马老师
页: [1]
查看完整版本: 《AVR单片机嵌入式系统原理与应用实践》第16章 串行TWI接口应用 中的疑问???