你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 5751|回复: 6

iic 中断处理 求助【悬赏问答】

[复制链接]

7

主题

39

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-8-23 14:32:32 | 显示全部楼层 |阅读模式
void I2C_EV_IRQHandler(void)
{
 extern u16 Voltage;
 extern u16 n;
 extern u16 V[];
 int i=0;
 
 switch (I2C_GetLastEvent(I2C1) )
  {
     case I2C_EVENT_MASTER_MODE_SELECT:    
     I2C_Send7bitAddress(I2C1, 0x86, I2C_Direction_Transmitter); 
    break;
 
    case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED:   
       I2C_SendData(I2C1, V);
       i++;       
   break;
      
   case I2C_EVENT_MASTER_BYTE_TRANSMITTING:
    break;


 case I2C_EVENT_MASTER_BYTE_TRANSMITTED:
    if(i
回复

使用道具 举报

24

主题

591

回帖

0

蝴蝶豆

中级会员

最后登录
2020-12-2
发表于 2012-8-23 22:06:27 | 显示全部楼层

RE:iic 中断处理 求助

是怎么情况呢?描述清楚点吗!
回复 支持 反对

使用道具 举报

7

主题

39

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-8-27 14:56:06 | 显示全部楼层

回复:iic 中断处理 求助【悬赏问答】

回复第 2 楼 于2012-08-23 22:06:27发表:
是怎么情况呢?描述清楚点吗! 

两块stm32f107的板子,A采集ADC,通过iic传给B,B通过串口在PC上打印出电压值。直接将AB的SCL,SDA脚连接在一起。
应该是IIC通信没成功,B并未能接收到A传过来的值。
不知道我的中断处理函数有问题没,高手帮忙看一看,谢谢
回复 支持 反对

使用道具 举报

48

主题

209

回帖

0

蝴蝶豆

金牌会员

最后登录
1970-1-1
发表于 2012-8-29 16:49:22 | 显示全部楼层

回复:iic 中断处理 求助【悬赏问答】

 
此程序使用中。。。。。
void I2C_Configuration(void)

   I2C_InitTypeDef  I2C_InitStructure;
   GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure I2C1 pins: SCL PB6 and SDA PB7 */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7 | GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  /* Configure PB8as Output push-pull */
  /*PB8--I2C1_AT24C02_WP;*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);


  /* I2C1 configuration ------------------------------------------------------*/
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0XA4;    
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 100000;
 
 
  I2C_Cmd(I2C1, ENABLE);
  I2C_Init(I2C1, &I2C_InitStructure);
  I2C_AcknowledgeConfig(I2C1, ENABLE);/*允许1字节1应答模式*/
  }

/*******************************************************************************
* Function Name  : 写一个字节
* Description    :
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C_WriteByte(uint8_t Byte, uint16_t WriteAddr, uint8_t EE_Block )
{
   /* 起始位 */
   I2C_GenerateSTART(I2C1, ENABLE);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); 
   /*发送器件地址(写)*/
   I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Transmitter);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 
   /*发送地址*/
 I2C_SendData(I2C1, (uint8_t)((WriteAddr & 0xFF00) >> 8));  //地址高字节
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, (uint8_t)(WriteAddr & 0x00FF));      //地址低字节
 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
 /*写一个字节*/
   I2C_SendData(I2C1, Byte);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 
   /*停止位*/
   I2C_GenerateSTOP(I2C1, ENABLE);
 
    Standby(EE_Block);
  }

/*******************************************************************************
* Function Name  : 读一个字节
* Description    :
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
uint8_t I2C_ReadByte(uint16_t ReadAddr, uint8_t EE_Block )
{
 uint8_t Byte;
 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
  
 /*允许1字节1应答模式*/
 I2C_AcknowledgeConfig(I2C1, ENABLE);

 /* 发送起始位 */
    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
    /*发送器件地址(写)*/
    I2C_Send7bitAddress(I2C1, EE_Block , I2C_Direction_Transmitter);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 /*发送地址*/
    I2C_SendData(I2C1, (uint8_t)((ReadAddr & 0xFF00) >> 8));  //地址高字节
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, (uint8_t)(ReadAddr & 0x00FF));      //地址低字节
 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
  
 /*起始位*/
 I2C_GenerateSTART(I2C1, ENABLE);
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 
 /*器件读*/
 I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Receiver);
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
 
    I2C_AcknowledgeConfig(I2C1, DISABLE); //最后一位后要关闭应答的
    I2C_GenerateSTOP(I2C1, ENABLE);   //发送停止位
 
    
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */
    Byte = I2C_ReceiveData(I2C1);
 //再次允许应答模式
 I2C_AcknowledgeConfig(I2C1, ENABLE);
 return Byte ;
 }
/*******************************************************************************
* Function Name  : 写铁电
* Description    :
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
 void I2C_FM_Write(uint8_t *pBuffer, uint8_t no, uint16_t WriteAddr, uint8_t EE_Block )
{
 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
 /*起始位*/
 I2C_GenerateSTART(I2C1, ENABLE);
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 /*器件地址(写)*/
 I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Transmitter);
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 
   /*发送地址*/
 I2C_SendData(I2C1, (uint8_t)((WriteAddr & 0xFF00) >> 8));  //地址高字节
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, (uint8_t)(WriteAddr & 0x00FF));        //地址低字节
 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
 while(no--) 
 {
   I2C_SendData(I2C1, *pBuffer);
   pBuffer++;
   while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 }
 
 /*停止位*/
 I2C_GenerateSTOP(I2C1, ENABLE);
}
/*******************************************************************************
* Function Name  : 读铁电
* Description    :
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void I2C_FM_Read(uint8_t *pBuffer, uint8_t no, uint16_t ReadAddr, uint8_t EE_Block )
{
 
 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
  
 /* 发送起始位 */
    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/
    /*发送器件地址(写)*/
    I2C_Send7bitAddress(I2C1, EE_Block , I2C_Direction_Transmitter);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    /* Clear EV6 by setting again the PE bit */
    I2C_Cmd(I2C1, ENABLE);
 /*发送地址*/
   I2C_SendData(I2C1, (uint8_t)((ReadAddr & 0xFF00) >> 8));  //地址高字节
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, (uint8_t)(ReadAddr & 0x00FF));      //地址低字节
 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BTF) == RESET);
  
 /*起始位*/
 I2C_GenerateSTART(I2C1, ENABLE);
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 
 /*器件读*/
 I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Receiver);
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
 
    while (no)
    {
  if(no==1)
  {
       I2C_AcknowledgeConfig(I2C1, DISABLE); //最后一位后要关闭应答的
      I2C_GenerateSTOP(I2C1, ENABLE);   //发送停止位
  }
    
  if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) /* EV7 */
     {
      *pBuffer = I2C_ReceiveData(I2C1);
       pBuffer++;
       no--;
  }
    }
 //再次允许应答模式
 I2C_AcknowledgeConfig(I2C1, ENABLE);
 }/*******************************************************************************
* Function Name  : 判忙
* Description    :
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void Standby(uint8_t EE_Block)     
{
  vu16 Tmp = 0;
  do
  {
    /*起始位*/
    I2C_GenerateSTART(I2C1, ENABLE);
    /*读SR1*/
    Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);
    /*器件地址(写)*/
  
 I2C_Send7bitAddress(I2C1, EE_Block, I2C_Direction_Transmitter);
 
 

  }while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));
 
  I2C_ClearFlag(I2C1, I2C_FLAG_AF);
  /*停止位*/   
  I2C_GenerateSTOP(I2C1, ENABLE);
}
回复 支持 反对

使用道具 举报

4

主题

224

回帖

0

蝴蝶豆

初级会员

最后登录
2020-7-4
发表于 2012-9-2 00:21:49 | 显示全部楼层

RE:iic 中断处理 求助【悬赏问答】

I2C如果没有进中断,表示 中断配置有问题,如果没有实现功能,但是进了中断,再查看中断函数
回复 支持 反对

使用道具 举报

7

主题

39

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-9-3 09:41:00 | 显示全部楼层

回复:iic 中断处理 求助【悬赏问答】

回复第 5 楼 于2012-09-02 00:21:49发表:
I2C如果没有进中断,表示 中断配置有问题,如果没有实现功能,但是进了中断,再查看中断函数 

谢谢。的确没进中断。。这是我关于中断的问题https://www.eefocus.com/bbs/article_244_487156.html。不知道哪里没配置好,进不了
回复 支持 反对

使用道具 举报

7

主题

39

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2012-9-3 09:44:56 | 显示全部楼层

回复:iic 中断处理 求助【悬赏问答】

回复第 4 楼 于2012-08-29 16:49:22发表:
 
此程序使用中。。。。。
  /* Configure I2C1 pins: SCL PB6 and SDA PB7 */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7 | GPIO_Pin_6;
  
 
 

6,7脚不需要重映射吗?和fsmc的时钟重合了吧? 这个时钟我也不知道怎么关的掉,是不是ahb上的sram?不过我关了sram还是会卡在 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));这里。重映射到8,9脚后,会卡在while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));出不来。遇到过这个问题么?还没找到解决办法
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版