[STM8]

STM8 IIC 一直进中断

[复制链接]
2187|8
手机看帖
扫描二维码
随时随地手机跟帖
wsl_5631|  楼主 | 2017-6-6 10:41 | 显示全部楼层 |阅读模式
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  if(I2C->SR2)
  {
      I2C->SR2 = 0;
  }
  if(I2C_GetITStatus(I2C_ITPENDINGBIT_STARTDETECTION))
  {
      I2C_ClearITPendingBit(I2C_ITPENDINGBIT_STARTDETECTION);
      IIC_Receive_event = 1;        //START
  }
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_STOPDETECTION))
  {
      ////I2C_ClearITPendingBit(I2C_ITPENDINGBIT_STOPDETECTION);
      IIC_Receive_event = 3;        //STOP
  }
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_RXNOTEMPTY))
  {
     //// I2C_ClearITPendingBit(I2C_ITPENDINGBIT_RXNOTEMPTY);
      IIC_Receive_data = I2C_ReceiveData();
      IIC_Receive_event = 2;        //接收到数据
  }
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_TXEMPTY))
  {
      ////I2C_ClearITPendingBit(I2C_ITPENDINGBIT_TXEMPTY);
      IIC_Receive_event = 4;        //发送寄存器空
  }
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_TRANSFERFINISHED))  //发送完成   
  {
      I2C_ClearITPendingBit(I2C_ITPENDINGBIT_TRANSFERFINISHED);
  }
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_HEADERSENT))  //发送完成   
  {
      I2C_ClearITPendingBit(I2C_ITPENDINGBIT_HEADERSENT);   //10-bit Header sent
  }   
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_ADDRESSSENTMATCHED))  //地址发送完成/匹配
  {
      I2C_ClearITPendingBit(I2C_ITPENDINGBIT_ADDRESSSENTMATCHED);  
  }      
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_WAKEUPFROMHALT))  //唤醒
  {
      I2C_ClearITPendingBit(I2C_ITPENDINGBIT_WAKEUPFROMHALT);  
  }   
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_OVERRUNUNDERRUN))  //Overrun/Underrun
  {
      I2C_ClearITPendingBit(I2C_ITPENDINGBIT_OVERRUNUNDERRUN);  
  }        
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE))  //确认失败
  {
      I2C_ClearITPendingBit(I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE);  
  }   
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_ARBITRATIONLOSS))  //!< Arbitration Loss  
  {
      I2C_ClearITPendingBit(I2C_ITPENDINGBIT_ARBITRATIONLOSS);  
  }
  else if(I2C_GetITStatus(I2C_ITPENDINGBIT_BUSERROR))  //Misplaced Start or Stop condition
  {
      I2C_ClearITPendingBit(I2C_ITPENDINGBIT_BUSERROR);     
  }   
  else
  {
      nop();
  }
      
}
我所有的中断事件都列举出来了,还是会一直进入中断,nop()这个位置。 出来后又进,崩溃了。
初始化如下
I2C_ITConfig((I2C_IT_TypeDef)(I2C_IT_ERR |I2C_IT_EVT|I2C_IT_BUF),ENABLE);
  I2C_Init(100000,0X51,I2C_DUTYCYCLE_2,I2C_ACK_CURR,I2C_ADDMODE_7BIT,CLK_GetClockFreq());
  I2C_Cmd(ENABLE);
请指点,谢谢大家
mmuuss586| | 2017-6-6 12:14 | 显示全部楼层
那程序里,把所有的中断标志位都清下看看

使用特权

评论回复
airwill| | 2017-6-6 12:33 | 显示全部楼层
估计是中断标志没有清除引起的.
最好借助仿真器看一下外设寄存器.

使用特权

评论回复
wsl_5631|  楼主 | 2017-6-6 13:22 | 显示全部楼层
I2C->SR1  I2C->SR2  I2C->SR3全部清也不行。 示波器观察一下,发现我主机的IIC_SCL是没上拉的(这个不能更改,原来是挂的24C02,主机模拟IIC,SCL不需要上拉),上电复位前是低的,然后来了个高电平。相当于产生一个STOP,STM8作为从机就不正常了。不正常时SCL被STM8 一直拉低了

使用特权

评论回复
wsl_5631|  楼主 | 2017-6-6 14:05 | 显示全部楼层
本帖最后由 wsl_5631 于 2017-6-6 14:21 编辑

else if(I2C_GetITStatus(I2C_ITPENDINGBIT_STOPDETECTION))
  {
      ////I2C_ClearITPendingBit(I2C_ITPENDINGBIT_STOPDETECTION);
      IIC_Receive_event = 3;        //STOP
  }
明明 SR1 = 0X10 为什么就是不进这个分支,就是判断不到这个标志

使用特权

评论回复
来看看,我也不懂

使用特权

评论回复
LRP103981836| | 2017-9-20 11:02 | 显示全部楼层
看不懂

使用特权

评论回复
kingkits| | 2017-9-20 11:18 | 显示全部楼层
通常你只需要读一次状态,再读就不对了。

使用特权

评论回复
IICeeprom| | 2017-9-21 11:12 | 显示全部楼层
如果你没有仿真器,建议你在中断里把各个状态位都用串口打印出来,这样虽然会让你的程序发生一些莫名其妙的问题,但是这样能让你知道你的程序究竟是在哪里,以前我就是这样调的

使用特权

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

本版积分规则

43

主题

335

帖子

2

粉丝