OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6604|回复: 4

iic中断通信问题

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-12-24
在线时间
0 小时
发表于 2014-2-25 17:21:21 | 显示全部楼层 |阅读模式
void I2C1_EV_IRQHandler(void)
{  
i2cEvent = I2C_GetLastEvent(I2C1);
  i2cEventGroup[i2cEventCounter++] = i2cEvent;  
  switch (i2cEvent)
  {
    case I2C_EVENT_MASTER_MODE_SELECT:                 /* EV5 */
      
      if(Direction == Transmitter)
      {
        I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Transmitter);
      }
      else
      {
        I2C_Send7bitAddress(I2C1, I2C1_SLAVE_ADDRESS7, I2C_Direction_Receiver);
      }
       
      break;
        
    case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED:  
      
      I2C_SendData(I2C1, i2cSendBuf[i2cSendCount++]); 
      if(i2cSendLen == 1)
        I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE);
        
      break;

  case I2C_EVENT_MASTER_BYTE_TRANSMITTING:  /* Without BTF, EV8 */     
      if(i2cSendCount < (i2cSendLen + 1))
      {
        I2C_SendData(I2C1, i2cSendBuf[i2cSendCount++]);
      }
      else 
      {      
        I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE);
      }
        
      break;

    case I2C_EVENT_MASTER_BYTE_TRANSMITTED: /* With BTF EV8-2 */
        if(bSubMenu_Rd == 0)
        {
          I2C_GenerateSTOP(I2C1, ENABLE);
          while(I2C_GetLastEvent(I2C1) == I2C_EVENT_MASTER_BYTE_TRANSMITTED)
            ;
          wrTaskState = 1;
        }
        else
        {
          Direction = Receiver;
// I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);
          I2C_GenerateSTART(I2C1, ENABLE);
        }
        I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);
      break;

    /* Master Receiver -------------------------------------------------------*/
    case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:
      if(i2cRevLen == 1)
      {
        I2C_AcknowledgeConfig(I2C1, DISABLE);
        I2C_GenerateSTOP(I2C1, ENABLE);
// I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE);
      }
      break;

   case I2C_EVENT_MASTER_BYTE_RECEIVED:
     i2cRevBuf[i2cRevCount++] = I2C_ReceiveData (I2C1);
     if(i2cRevCount == (i2cRevLen - 1))
     {
       I2C_AcknowledgeConfig(I2C1, DISABLE);
       I2C_GenerateSTOP(I2C1, ENABLE);
     }
     else if(i2cRevCount == i2cRevLen)
     {
       rdTaskState = 1;
     }
     else
       ;
     break;

    default:
      break;
  }

}
/**
void Write24C01(void)
{
u8 i;
  i2cSendLen = 4;//·???4×???????
  i2cSendCount = 0;
  
  bSubMenu_Rd = 0;
  Direction = Transmitter;
  
i2cSendBuf[0] = I2C_ADDRESS7;
for(i = 1;i < 5;i++)
i2cSendBuf = i;
  while((I2C1 -> SR2 & 0x02))//????
    ;
  I2C_GenerateSTART(I2C1, ENABLE);
}



void Read24C01(void)
{
    i2cSendLen = 1;//???·
    i2cSendCount = 0;
    
i2cRevLen = 4;
i2cRevCount = 0;
    Direction = Transmitter; //??·??????·
i2cSendBuf[0] = I2C_ADDRESS7;
    bSubMenu_Rd = 1;
    while((I2C1 -> SR2 & 0x02))
    ;
    I2C_GenerateSTART(I2C1, ENABLE);
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-12-24
在线时间
0 小时
 楼主| 发表于 2014-2-25 17:24:46 | 显示全部楼层
原子哥  帮忙看看   中断读的时候进不了 case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:这个中断    看了下中断事件是0x00030044  但是应该是0x00030040  不知道怎么回事啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-2-25 21:16:25 | 显示全部楼层
不好意思,我不用硬件IIC好多年了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-26 08:19:07 | 显示全部楼层
搞那么复杂干嘛,直接IO模拟,代码简洁得体,好看,硬件的你要考虑很多标志什么的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-12-24
在线时间
0 小时
 楼主| 发表于 2014-2-26 10:22:25 | 显示全部楼层
谢谢原子哥了,问题已经解决,仿真有点不靠谱,在板子上跑起来了,呵呵~~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-14 09:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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