labi41 发表于 2013-11-27 15:48:22

STM32L151这个芯片进行I2C通信

项目中使用的STM32L151这个芯片进行I2C通信总是不稳定,用使用过的吗?能帮我分析一下,谢谢。
 
现在的问题时:现在读数据是很多时候停在了while(!I2C_CheckEvent(sEE_I2C,I2C_EVENT_MASTER_MODE_SELECT))这个位置。
 
有的时候还继续运行下去。
 
读取的数据只有一个字节,如果读取2个字节,第二个字节都是00。
 
void I2C_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 I2C_InitTypeDef  I2C_InitStructure;
  
  /*!<sEE_I2C Periph clock enable */
  RCC_APB1PeriphClockCmd(sEE_I2C_CLK,ENABLE);
 
  /*!< sEE_I2C_SCL_GPIO_CLK and sEE_I2C_SDA_GPIO_CLK Periphclock enable */
  RCC_AHBPeriphClockCmd(sEE_I2C_SCL_GPIO_CLK |sEE_I2C_SDA_GPIO_CLK, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
 
  /*Reset sEE_I2C peripheral */
  RCC_APB1PeriphResetCmd(sEE_I2C_CLK,ENABLE);
 
  /* Release reset signal of sEE_I2C IP */
 RCC_APB1PeriphResetCmd(sEE_I2C_CLK, DISABLE);
   
  /*!< GPIOconfiguration */ 
  /* Connect PXx to I2C_SCL*/
 GPIO_PinAFConfig(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_SOURCE,sEE_I2C_SCL_AF);
  /* Connect PXx to I2C_SDA*/
  GPIO_PinAFConfig(sEE_I2C_SDA_GPIO_PORT,sEE_I2C_SDA_SOURCE, sEE_I2C_SDA_AF); 
  /*!< Configure sEE_I2C pins: SCL */  
 GPIO_InitStructure.GPIO_Pin = sEE_I2C_SCL_PIN;
  GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
 GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
 GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);
  /*!< Configure sEE_I2C pins: SDA */
  GPIO_InitStructure.GPIO_Pin =sEE_I2C_SDA_PIN;
  GPIO_Init(sEE_I2C_SDA_GPIO_PORT,&GPIO_InitStructure); 
 
 
 
 
  /*!< I2C configuration*/
  /* sEE_I2C configuration */
  I2C_InitStructure.I2C_Mode =I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
 I2C_InitStructure.I2C_OwnAddress1 = I2C_SLAVE_ADDRESS7;
 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
 I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
 I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED;
 
  /* sEE_I2C PeripheralEnable */
  I2C_Cmd(sEE_I2C, ENABLE);
  /* Apply sEE_I2C configurationafter enabling it */
  I2C_Init(sEE_I2C, &I2C_InitStructure);
//   /* Enable the sEE_I2C peripheral DMA requests */
//  I2C_DMACmd(sEE_I2C, ENABLE);
}
 

 
uint8_t I2C_ReadNByte (uint8_t sla, uint32_t suba, uint8_t *s, uint32_tnum)
{
 sEETimeout = sEE_FLAG_TIMEOUT;
  while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY))
  {
    if((sEETimeout--) == 0) return sEE_FAIL;
 }

  I2C_GenerateSTART(sEE_I2C,ENABLE);//------------------------------------------------------------
 
  sEETimeout = sEE_FLAG_TIMEOUT;
  while(!I2C_CheckEvent(sEE_I2C,I2C_EVENT_MASTER_MODE_SELECT))
  {
    if((sEETimeout--) == 0) returnsEE_FAIL;
  }
 
 I2C_Send7bitAddress(sEE_I2C, sla,I2C_Direction_Transmitter);//----------------------------------------------
  /*!< Test on EV6 and clear it */
  sEETimeout =sEE_FLAG_TIMEOUT;
  while(!I2C_CheckEvent(sEE_I2C,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  {
    if((sEETimeout--) ==0) return sEE_FAIL;
  }
 I2C_Cmd(I2C2, ENABLE);

 I2C_SendData(sEE_I2C, suba);               //-----------------------------

  sEETimeout =sEE_FLAG_TIMEOUT;
  while(I2C_GetFlagStatus(sEE_I2C,I2C_EVENT_MASTER_BYTE_TRANSMITTED) == RESET)
  {
    if((sEETimeout--) ==0) return sEE_FAIL;
  }
 
  I2C_GenerateSTART(sEE_I2C,ENABLE);   //---------------------------------------------------
 
  sEETimeout = sEE_FLAG_TIMEOUT;
  while(!I2C_CheckEvent(sEE_I2C,I2C_EVENT_MASTER_MODE_SELECT))
  {
    if((sEETimeout--) == 0) returnsEE_FAIL;
  }
 
 I2C_Send7bitAddress(sEE_I2C, sla+1, I2C_Direction_Receiver); //-----------------------------------
 
 sEETimeout =sEE_FLAG_TIMEOUT;
 while(I2C_GetFlagStatus(sEE_I2C,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) == RESET)
 {
  if((sEETimeout--)== 0) return sEE_FAIL;
 }    

 I2C_AcknowledgeConfig(sEE_I2C, DISABLE);

 (void)sEE_I2C->SR2; 
 
 I2C_GenerateSTOP(I2C2,ENABLE);
 
 sEETimeout =sEE_FLAG_TIMEOUT;
 while(I2C_GetFlagStatus(sEE_I2C,I2C_EVENT_MASTER_BYTE_RECEIVED) == RESET)
 {
  if((sEETimeout--) == 0)return sEE_FAIL;
 }  

  do
  {   

    *s = I2C_ReceiveData(sEE_I2C);
   
    num--;       
   
    sEETimeout= sEE_FLAG_TIMEOUT;
    while(sEE_I2C->CR1 & I2C_CR1_STOP)
   {
      if((sEETimeout--) == 0) return sEE_FAIL;
    } 
 
 }while(num!=0);
 
  I2C_AcknowledgeConfig(I2C2, ENABLE);
 (void)sEE_I2C->SR2;
 
  return sEE_OK;
}
 

勒布朗 发表于 2013-11-29 21:31:17

RE:STM32L151这个芯片进行I2C通信

本人遇到这种情况多数是硬件的问题。用示波器检查IIC配置是否正确。检查是否有数据发出

dzc2001 发表于 2013-11-30 17:56:38

RE:STM32L151这个芯片进行I2C通信

你的I2C上面挂了几个外设?

fengye5340 发表于 2013-12-2 10:59:17

RE:STM32L151这个芯片进行I2C通信

这种情况下,可能是硬件问题导致的。最好先检测一下硬件.在程序上,可以用模拟I2C测试一下你的硬件。

hzrobin 发表于 2013-12-2 15:50:20

回复:STM32L151这个芯片进行I2C通信

这个可以直接用库做做呀,用库里面的就是损失了最高优先级

有缘于你 发表于 2013-12-3 12:22:34

RE:STM32L151这个芯片进行I2C通信

先用模拟IIC 测下你的硬件, 不是硬件问题就重新理下程序
页: [1]
查看完整版本: STM32L151这个芯片进行I2C通信