搜索
bottom↓
回复: 14

TWI的START函数死循环了

[复制链接]

出0入0汤圆

发表于 2008-3-24 16:05:34 | 显示全部楼层 |阅读模式
最近在做IIC通信:   ATmega16,WINAVR;
通过串口调试发现程序刚进START函数就死那里了

void Start(void)
{
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));           //死在此处
}

在第一句当中,将TWCR的TWINT位置1就是清零,为什么会死在第2句的WHILE语句中呢?

请高手指教,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。

出0入296汤圆

发表于 2008-3-25 12:42:23 | 显示全部楼层
while(!(TWCR & BIT(TWINT)));
的意思是,如果TWINT位为0就一直循环……第一句写1清零 TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); 那么当然会导致While一直在那个地方循环啦。

出0入0汤圆

 楼主| 发表于 2008-3-27 13:48:27 | 显示全部楼层
谢谢 Gorgon Meducer

“TWINT 置1清零”这句话我没理解好!
在网上下载了几个 TWI 的例子,有的START语句就是上面那样写的,现在我就不理解了。    ?????
有的是 TWINT 置1 后延时一段时间,如下:

unsigned char wait;
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//开始
wait=32;
while(wait--);

出0入296汤圆

发表于 2008-3-29 09:27:40 | 显示全部楼层
TWINT是TWI状态机中断标志位,每当完成一个状态功能,它都会被置位。
你这句话的意思是要发送一个START信号,正常情况下,如果成功发送了一个START信号以后,系统会自动将TWINT位置1。

所以,我仔细回头看了一下TWI的Datasheet,我觉得你这部分代码应该是没有问题的。我建议你想办法监视一下TWSR中的状态码,这样容易帮助分析问题出在什么地方。


void Start(void)
{
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));           //死在此处
}

出0入0汤圆

发表于 2008-11-24 12:52:55 | 显示全部楼层
START信号这么写没有问题,我曾这么测试过;就是应该加上一些判断状态的信号,但是如何写我还没时间去测试。

个人认为这种判断是很必要的,作为一个实时系统,很难接受如果一旦TWI通信有问题而死在一个循环点的。

不知道傻孩子有没有这方面的使用经验

出0入296汤圆

发表于 2008-11-24 13:13:15 | 显示全部楼层
to&nbsp;【9楼】&nbsp;Alvinwang&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;我一般直接使用中断模式来驱动状态机,不会采用这种顺序查询模式……

出0入0汤圆

发表于 2008-11-24 15:51:04 | 显示全部楼层
明白,我用TWI驱动液晶也希望用中断模式,调试中……

也看过ARM上IIC读写EEPROM(友善之臂的例程)的例子,中断中要做很多处理,包括一些状态的判断和数据的发送等等。

但是这种方式,总觉得跟传统说法“中断中不做过多的处理”背道而驰,不知这应该如何处理?

出0入296汤圆

发表于 2008-11-24 15:55:02 | 显示全部楼层
to&nbsp;【11楼】&nbsp;Alvinwang&nbsp;

&nbsp;&nbsp;&nbsp;传统说的“中断中不做过多的处理”并不是说中断里面不能有过多的代码,而是说

中断不能占用太多的处理器时间,或者说不能一次做过多的事情,而状态机是一种根据

状态执行不同子处理的方法,代码虽多,但是每次执行中断处理程序的时间却并不长,

而且TWI协议本身是一个状态机驱动的通讯协议,对中断处理时间并不非常敏感(在通

讯速度不敏感的前提下),因此采用中断模式的TWI是没有问题的。

出0入0汤圆

发表于 2008-11-24 15:59:49 | 显示全部楼层
多谢傻孩子的提示,会在调试中继续体会。

晚上准备去书店看看你的《深入浅出AVR单片机》~

出0入296汤圆

发表于 2008-11-24 16:05:25 | 显示全部楼层
to&nbsp;【13楼】&nbsp;Alvinwang&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;关于TWI,我在书中有非常详细的介绍,以我理解的方式阐释了时钟同步和仲裁;

也给了详细的利用中断模式建立状态机的讲解。^_^希望多听听您的意见。目前论坛

还没有读者就这个问题给出过回馈——对于TWI的章节,其实也是我的得意之作之一……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-27 06:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表