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

各位大侠,帮看看IIC接收数据的问题

[复制链接]
mochou-267688 提问时间:2017-11-5 22:03 /
各位,用STM32L051单片机做从机接收其他模块的数据,使用寄存器操作,为什么IIC中断只能进一次,大家帮看下,谢谢。
/**
  * Brief   This function configures I2C1, slave.
  * Param   None
  * Retval  None
  */
void Configure_I2C1_Slave(void)
{
  /* Configure RCC for I2C1 */
  /* (1) Enable the peripheral clock I2C1 */
  /* (2) Use APBCLK for I2C CLK */
  RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; /* (1) */
  RCC->CCIPR &= ~RCC_CCIPR_I2C1SEL; /* (2) */

  /* Configure I2C1, slave */
  /* (3) Timing register value is computed with the AN4235 xls file,
         fast Mode @400kHz with I2CCLK = 16MHz, rise time = 100ns,
         fall time = 10ns */
  /* (4) Periph enable, address match interrupt enable, receive interrupt enable */
  /* (5) 7-bit address = 0x5A */
  /* (6) Enable own address 1 */
  I2C1->TIMINGR = (unsigned int)0x00300619; /* (3) */
  I2C1->CR1 = I2C_CR1_PE | I2C_CR1_RXIE | I2C_CR1_ADDRIE; /* (4) */
  I2C1->OAR1 |= (unsigned int)(I2C1_OWN_ADDRESS << 1); /* (5) */
  I2C1->OAR1 |= I2C_OAR1_OA1EN; /* (6) */

  /* Configure IT */
  /* (7) Set priority for I2C1_IRQn */
  /* (8) Enable I2C1_IRQn */
  NVIC_SetPriority(I2C1_IRQn, 0); /* (7) */
  NVIC_EnableIRQ(I2C1_IRQn); /* (8) */
}

/**
  * Brief   This function handles I2C1 interrupt request.
  * Param   None
  * Retval  None
  */
void I2C1_IRQHandler(void)
{
  unsigned int I2C_InterruptStatus = I2C1->ISR; /* Get interrupt status */

  if((I2C_InterruptStatus & I2C_ISR_ADDR) == I2C_ISR_ADDR)
  {
    I2C1->ICR |= I2C_ICR_ADDRCF; /* Address match event */
  }
  else if((I2C_InterruptStatus & I2C_ISR_RXNE) == I2C_ISR_RXNE)
  {
    /* Read receive register, will clear RXNE flag */
     CLearLinkErrorCnt();
     if(iicRecDataFlag == FALSE)
     {
       iicRecBuf[iicRecBufIndex] =  I2C1->RXDR;
       iicRecBufIndex++;
       if(iicRecBufIndex == IICWINFOLEN)
       {
         iicRecDataFlag = TRUE;
         iicRecBufIndex = 0;
       }
     }

  }
  else
  {
    error = ERROR_I2C; /* Report an error */
    NVIC_DisableIRQ(I2C1_IRQn); /* Disable I2C1_IRQn */
  }       
}

收藏 1 评论4 发布时间:2017-11-5 22:03

举报

4个回答
mochou-267688 回答时间:2017-11-6 08:43:46
没有人遇到吗,大家帮看下,
MrJiu 回答时间:2017-11-7 11:33:37
个人建议,ST的I2C最好用模拟的,否则就用SPI!!!

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2017-12-25 10:31:59
硬件I2C的使用,提供一个参考:
http://blog.sina.com.cn/s/blog_59bab09f0101s6m6.html

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

watershade 回答时间:2017-12-25 12:34:13
看一下I2C1_IRQHandler函数,因为对寄存器名称不太了解表示没有完全看懂。
I2C1->ICR |= I2C_ICR_ADDRCF;
的作用不太了解。你是想用这个语句去触发什么吗?
但感觉问题出在else if这个块里面。
建议你设置断点看一看是不是handler程序进入这里出的问题。
如果是,建议你看看这里面
if(iicRecDataFlag == FALSE)
做了事情,而如果不是是不是也要做一些事情。

抱歉,瞄了一眼真没看懂

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版