打印
[ZLG-ARM]

进入i2c中断跳不出来了,怎么回事?

[复制链接]
2103|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jstu023123|  楼主 | 2008-8-23 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   我用2214和2131两开发板做i2c接收发送试验,2214作为主机发送数据,2131为从机接收数据,使用的是光盘里自带的例程
   连接SDA,SCL和GND后,测试能进入中断的,用示波器测量,也有信号的,但回不了main函数,是不是哪儿需要修改下啊?!

相关帖子

沙发
zLgArM| | 2008-8-23 10:24 | 只看该作者

jstu023123

您好!
  注意清除中断标识,此外注意确认是停留在中断服务子程序里而不是跑飞吗?

使用特权

评论回复
板凳
jstu023123|  楼主 | 2008-8-25 08:58 | 只看该作者

zLgArM

  中断标识清了啊,程序是跑飞掉了,我用的是开发板套件里的程序,没有改动~~

使用特权

评论回复
地板
jstu023123|  楼主 | 2008-8-29 11:57 | 只看该作者

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

   还没有找到问题所在,郁闷中。。。我在进中断时led亮,出中断时led灭,结果就一亮一灭下,接下来没反应了,感觉中断了一次后跑飞掉了,我上位机发了10个数据,用示波器观察,时序完整,发的数据都是对的,下位机也有应答

UINT8   eeprom[256];           
UINT8   adrpoint=0;            
UINT8   slarv=0;                        
UINT8 IsFinished=0;

void   __irq IRQ_I2C(void)
{  UINT8  sta, addr;
   
   sta = I2STAT;                    
   
   IO1CLR = LED1;   // 灯亮
   switch(sta&0xf8)
   {  case  0x60:                // 接收到自身SLA+W
      case  0x68:               
            I2CONSET = 0x04;
            break;
            
      case  0xA8:        // 接收到SLA+R,或已发送数据并接收到ACK位。
      case  0xB0:
      case  0xB8:
            I2DAT = eeprom[adrpoint];
            adrpoint++;
            I2CONSET = 0x04;
            break;
            
      case  0x80:                   // 接收到数据
            if(0==slarv)
            {  addr = I2DAT;
               slarv = 1;
             }
            else
            {  eeprom[adrpoint] = I2DAT;
               adrpoint++;
             }
             
            if(adrpoint==10)  //接收到10个数据
              IsFinished=1; 

            I2CONSET = 0x04;              
            break;
            
      case  0xA0:                   // 已发送数据,并接收到非ACK
      case  0xC0:                   // 总线结束,或总线重新启动
      default:                      // 其它状态
            I2CONSET = 0x04;
            break;
   }  
   I2CONCLR = 0x38;                // 清除标I2C标志位,STA、STO、SI
   IO1SET = LED1;  // 灯灭

   VICVectAddr = 0x00;   
}


int  main(void)
{  
   IO1DIR = LED1;
   IO1SET = LED1;
   
   I2C_SlavInit(LPC2131_SLV);
   IRQEnable( );                // 使能IRQ中断

   while(IsFinished==0);  // 等待完成
   IsFinished = 0;
   while(1)                
   {    //让LED1闪烁,让用户感觉程序在运行
       IO1SET = LED1;
       delay(20);
       IO1CLR = LED1;
       delay(20);
   }
   return(0);
}

使用特权

评论回复
5
yangvu| | 2008-8-29 12:13 | 只看该作者

re


你最好说一下你的思路,看看是不是哪没考虑到。

使用特权

评论回复
6
jstu023123|  楼主 | 2008-8-29 14:13 | 只看该作者

回yangvu

  现在只是想通过i2c总线接收主机发送的数据,从机LPC2131收到数据进行处理
  main()中,中断使能、从机初始化,就等待完成标志置位,while(IsFinished==0);。中断时,先接收第一个数据(状态80H),即SLA+W,返回ACK,然后进入60H状态,返回ACK,接着开始接收数据,满足条件时置标志位,main中则会led闪烁。。。

使用特权

评论回复
7
minchen| | 2008-9-2 22:23 | 只看该作者

while(exp)的问题

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

使用特权

评论回复
8
jstu023123|  楼主 | 2008-9-3 11:14 | 只看该作者

回minchen

  对的,是这儿问题,加了个延时。。。谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

93

帖子

0

粉丝