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

各位大侠,帮看看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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版