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

查看: 5752|回复: 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, &amp;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, &amp;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, &amp;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 &amp; 0xFF00) &gt;&gt; 8));  //地址高字节
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, (uint8_t)(WriteAddr &amp; 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 &amp; 0xFF00) &gt;&gt; 8));  //地址高字节
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, (uint8_t)(ReadAddr &amp; 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 &amp; 0xFF00) &gt;&gt; 8));  //地址高字节
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, (uint8_t)(WriteAddr &amp; 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 &amp; 0xFF00) &gt;&gt; 8));  //地址高字节
 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, (uint8_t)(ReadAddr &amp; 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) &amp; 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版