mochou-267688 发表于 2017-11-5 22:03:51

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

各位,用STM32L051单片机做从机接收其他模块的数据,使用寄存器操作,为什么IIC中断只能进一次,大家帮看下,谢谢。
/**
* Brief   This function configures I2C1, slave.
* Param   None
* RetvalNone
*/
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
* RetvalNone
*/
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 =I2C1->RXDR;
       iicRecBufIndex++;
       if(iicRecBufIndex == IICWINFOLEN)
       {
         iicRecDataFlag = TRUE;
         iicRecBufIndex = 0;
       }
   }

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

mochou-267688 发表于 2017-11-6 08:43:46

没有人遇到吗,大家帮看下,

MrJiu 发表于 2017-11-7 11:33:37

个人建议,ST的I2C最好用模拟的,否则就用SPI!!!

无薪税绵 发表于 2017-12-25 10:31:59

硬件I2C的使用,提供一个参考:
http://blog.sina.com.cn/s/blog_59bab09f0101s6m6.html

watershade 发表于 2017-12-25 12:34:13

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

抱歉,瞄了一眼真没看懂
页: [1]
查看完整版本: 各位大侠,帮看看IIC接收数据的问题