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

STM32L151这个芯片进行I2C通信

[复制链接]
labi41 提问时间:2013-11-27 15:48 /
项目中使用的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 Periph  clock 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);
   
  /*!< GPIO  configuration */ 
  /* 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 Peripheral  Enable */
  I2C_Cmd(sEE_I2C, ENABLE);
  /* Apply sEE_I2C configuration  after 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_t  num)
{
 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) return  sEE_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) return  sEE_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;
}
 
收藏 评论5 发布时间:2013-11-27 15:48

举报

5个回答
勒布朗 回答时间: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 测下你的硬件, 不是硬件问题就重新理下程序
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版