[ZLG-ARM] 进入i2c中断跳不出来了,怎么回事?

[复制链接]
3057|7
 楼主| jstu023123 发表于 2008-8-23 09:46 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;我用2214和2131两开发板做i2c接收发送试验,2214作为主机发送数据,2131为从机接收数据,使用的是光盘里自带的例程<br />&nbsp;&nbsp;&nbsp;连接SDA,SCL和GND后,测试能进入中断的,用示波器测量,也有信号的,但回不了main函数,是不是哪儿需要修改下啊?!
zLgArM 发表于 2008-8-23 10:24 | 显示全部楼层

jstu023123

您好!<br />&nbsp;&nbsp;注意清除中断标识,此外注意确认是停留在中断服务子程序里而不是跑飞吗?
 楼主| jstu023123 发表于 2008-8-25 08:58 | 显示全部楼层

zLgArM

&nbsp;&nbsp;中断标识清了啊,程序是跑飞掉了,我用的是开发板套件里的程序,没有改动~~
 楼主| jstu023123 发表于 2008-8-29 11:57 | 显示全部楼层

郁闷ing,还没发现啥问题,各位大侠帮帮忙呀

&nbsp;&nbsp;&nbsp;还没有找到问题所在,郁闷中。。。我在进中断时led亮,出中断时led灭,结果就一亮一灭下,接下来没反应了,感觉中断了一次后跑飞掉了,我上位机发了10个数据,用示波器观察,时序完整,发的数据都是对的,下位机也有应答<br /><br />UINT8&nbsp;&nbsp;&nbsp;eeprom[256];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />UINT8&nbsp;&nbsp;&nbsp;adrpoint=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />UINT8&nbsp;&nbsp;&nbsp;slarv=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />UINT8&nbsp;IsFinished=0;<br /><br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_I2C(void)<br />{&nbsp;&nbsp;UINT8&nbsp;&nbsp;sta,&nbsp;addr;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;sta&nbsp;=&nbsp;I2STAT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IO1CLR&nbsp;=&nbsp;LED1;&nbsp;&nbsp;&nbsp;//&nbsp;灯亮<br />&nbsp;&nbsp;&nbsp;switch(sta&0xf8)<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;case&nbsp;&nbsp;0x60:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;接收到自身SLA+W<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x68:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x04;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0xA8:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;接收到SLA+R,或已发送数据并接收到ACK位。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0xB0:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0xB8:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2DAT&nbsp;=&nbsp;eeprom[adrpoint];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adrpoint++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x04;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0x80:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;接收到数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0==slarv)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;addr&nbsp;=&nbsp;I2DAT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;slarv&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;eeprom[adrpoint]&nbsp;=&nbsp;I2DAT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adrpoint++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(adrpoint==10)&nbsp;&nbsp;//接收到10个数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsFinished=1;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x04;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0xA0:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;已发送数据,并接收到非ACK<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;&nbsp;0xC0:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;总线结束,或总线重新启动<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;其它状态<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x04;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x38;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除标I2C标志位,STA、STO、SI<br />&nbsp;&nbsp;&nbsp;IO1SET&nbsp;=&nbsp;LED1;&nbsp;&nbsp;//&nbsp;灯灭<br /><br />&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;<br />}<br /><br /><br />int&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IO1DIR&nbsp;=&nbsp;LED1;<br />&nbsp;&nbsp;&nbsp;IO1SET&nbsp;=&nbsp;LED1;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2C_SlavInit(LPC2131_SLV);<br />&nbsp;&nbsp;&nbsp;IRQEnable(&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能IRQ中断<br /><br />&nbsp;&nbsp;&nbsp;while(IsFinished==0);&nbsp;&nbsp;//&nbsp;等待完成<br />&nbsp;&nbsp;&nbsp;IsFinished&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;while(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//让LED1闪烁,让用户感觉程序在运行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO1SET&nbsp;=&nbsp;LED1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(20);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO1CLR&nbsp;=&nbsp;LED1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(20);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return(0);<br />}<br />
yangvu 发表于 2008-8-29 12:13 | 显示全部楼层

re

<br />你最好说一下你的思路,看看是不是哪没考虑到。
 楼主| jstu023123 发表于 2008-8-29 14:13 | 显示全部楼层

回yangvu

&nbsp;&nbsp;现在只是想通过i2c总线接收主机发送的数据,从机LPC2131收到数据进行处理<br />&nbsp;&nbsp;main()中,中断使能、从机初始化,就等待完成标志置位,while(IsFinished==0);。中断时,先接收第一个数据(状态80H),即SLA+W,返回ACK,然后进入60H状态,返回ACK,接着开始接收数据,满足条件时置标志位,main中则会led闪烁。。。
minchen 发表于 2008-9-2 22:23 | 显示全部楼层

while(exp)的问题

exp有时候根本不会置位,建议使用软件延时比较安全。这种异常通常出现在主IIC的程序里面,产生不了中断。有很多可能性,我上次碰到的一种原因,是器件周边电路的电阻有问题,查了好半天,还有那个中断服务程序里面最好多几个状态标志。
 楼主| jstu023123 发表于 2008-9-3 11:14 | 显示全部楼层

回minchen

&nbsp;&nbsp;对的,是这儿问题,加了个延时。。。谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

93

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部