STM8S103k3 I2C问题

[复制链接]
5197|9
 楼主| kinso 发表于 2010-6-9 16:33 | 显示全部楼层 |阅读模式
STM8S103k3 I2C在STVD+cosmic下编译成功,
Debug时使用simulator程序正常,用ST—LINK链接到MCU时,
停在while(!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT))处;
刚接触ST芯片,很多东西都不了解。不知是何故,望高人指点!
uCHAR I2CWriteByte(uCHAR cDevAddr, uCHAR cReg,uCHAR cData)
{
  //I2cInit();
  I2C_GenerateSTART(ENABLE);
  /*EV5*/
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
  I2C_Send7bitAddress(cDevAddr,I2C_DIRECTION_TX );
     /* Test on EV6 and clear it */
   while(!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
   I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
   
  I2C_SendData(cReg);
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
  I2C_SendData(cData);
   while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  I2C_GenerateSTOP(ENABLE);
}
 楼主| kinso 发表于 2010-6-9 16:35 | 显示全部楼层

STM8S103k3 I2C问题

STM8S103k3 I2C在STVD+cosmic下编译成功,
Debug时使用simulator程序正常,用ST—LINK链接到MCU时,
停在while(!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT))处;
刚接触ST芯片,很多东西都不了解。不知是何故,望高人指点!
uCHAR I2CWriteByte(uCHAR cDevAddr, uCHAR cReg,uCHAR cData)
{
  //I2cInit();
  I2C_GenerateSTART(ENABLE);
  /*EV5*/
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
  I2C_Send7bitAddress(cDevAddr,I2C_DIRECTION_TX );
     /* Test on EV6 and clear it */
   while(!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
   I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
   
  I2C_SendData(cReg);
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
  I2C_SendData(cData);
   while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  I2C_GenerateSTOP(ENABLE);
}
 楼主| kinso 发表于 2010-6-9 17:55 | 显示全部楼层

STM8S103k3 I2C问题

STM8S103k3 I2C在STVD+cosmic下编译成功,
Debug时使用simulator程序正常,用ST—LINK链接到MCU时,
停在while(!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT))处;
刚接触ST芯片,很多东西都不了解。不知是何故,望高人指点!

uCHAR I2CWriteByte(uCHAR cDevAddr, uCHAR cReg,uCHAR cData)
{
  //I2cInit();
  I2C_GenerateSTART(ENABLE);
  /*EV5*/
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_START_SENT));
  I2C_Send7bitAddress(cDevAddr,I2C_DIRECTION_TX );
     /* Test on EV6 and clear it */
   while(!I2C_CheckEvent(I2C_EVENT_MASTER_ADDRESS_ACKED));
   I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED);
   
  I2C_SendData(cReg);
  while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  
  I2C_SendData(cData);
   while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  I2C_GenerateSTOP(ENABLE);
}
香水城 发表于 2010-6-9 21:46 | 显示全部楼层
电路图?
 楼主| kinso 发表于 2010-6-10 09:14 | 显示全部楼层
因为硬件还没齐,所以只飞了几根线出来,调试I2C 。
两种环境下,flag1和flag2的值不同,在程序I2CWriteByte前;
除了初始化外;没有对I2C->SR1和I2C->SR2的其余操作,应该不会有硬件置位。
不知何故。望不吝赐教!

ErrorStatus I2C_CheckEvent(I2C_Event_TypeDef I2C_Event)
{

  u8 flag1 = 0;
  u8 flag2 = 0;
  ErrorStatus status = ERROR;

  /* Check the parameters */
  assert_param(IS_I2C_EVENT_OK(I2C_Event));

  flag1 = I2C->SR1;
  flag2 = I2C->SR2;

  /* Check which SRx register must be read */
  if (((u16)I2C_Event & (u16)0x0F00) == 0x0700)
  {
    /* Check whether the last event is equal to I2C_EVENT */
    if (flag1 & (u8)I2C_Event)
    {
      /* SUCCESS: last event is equal to I2C_EVENT */
      status = SUCCESS;
    }
    else
    {
      /* ERROR: last event is different from I2C_EVENT */
      status = ERROR;
    }
  }
  else /* Returns whether the status register to check is SR2 */
  {
    if (flag2 & (u8)I2C_Event)
    {
      /* SUCCESS: last event is equal to I2C_EVENT */
      status = SUCCESS;
    }
    else
    {
      /* ERROR: last event is different from I2C_EVENT */
      status = ERROR;
    }
  }

  /* Return status */
  return status;

}
秋天落叶 发表于 2010-6-10 10:21 | 显示全部楼层
香主怀疑是你的硬件连接问题,LZ还是把电路图贴出来看看吧
zhengwanjun1314 发表于 2013-10-16 18:47 | 显示全部楼层
本帖最后由 zhengwanjun1314 于 2013-10-16 18:49 编辑

朋友,能否把stm8s103k的i2c代码发给我啊?最近在搞这个?都找不到资料?
我的邮箱1052979283@qq.com 感激不尽!
trumpxp 发表于 2013-10-16 20:48 | 显示全部楼层
我怀疑是电路硬件的问题   楼主   这一块   最好仔细将电路好好查一查吧
trumpxp 发表于 2013-10-16 20:54 | 显示全部楼层
电路  硬件这一块   楼主   仔细查一查   应该是接口电路的问题
sf116 发表于 2013-10-18 15:17 | 显示全部楼层
电源不共地会影响到IIC
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

16

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部