打印

stm32的I2C库的I2C_CheckEvent函数的问题

[复制链接]
6732|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunmonth|  楼主 | 2009-12-31 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sunmonth 于 2009-12-31 16:44 编辑

这是库函数:
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{
  uint32_t lastevent = 0;
  uint32_t flag1 = 0, flag2 = 0;
  ErrorStatus status = ERROR;
    assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  assert_param(IS_I2C_EVENT(I2C_EVENT));
    flag1 = I2Cx->SR1;
  flag2 = I2Cx->SR2;
  flag2 = flag2 << 16;
   lastevent = (flag1 | flag2) & FLAG_Mask;
   if (lastevent == I2C_EVENT )
  {
     status = SUCCESS;
  }
  else
  {
     status = ERROR;
  }
  return status;
}

将lastevent = (flag1 | flag2) & FLAG_Mask;改为:lastevent = (flag1 | flag2) & I2C_EVENT;行不行?
沙发
lxyppc| | 2009-12-31 17:53 | 只看该作者
不能,这里是“有且只有”的意思
改了后就变成“有不限于”的意思

使用特权

评论回复
板凳
sunmonth|  楼主 | 2010-1-1 00:16 | 只看该作者
stm32的I2C状态位有时莫名改变,如果用lastevent = (flag1 | flag2) & FLAG_Mask,容易在  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))时死机,既然你判断某位,直接lastevent = (flag1 | flag2) & I2C_EVENT不行吗?

使用特权

评论回复
地板
lxyppc| | 2010-1-1 21:09 | 只看该作者
看了下I2C Event的定义
状态并不只是1位,而是位组合,且组合间有包含的关系,不能用楼上所说的方式

使用特权

评论回复
5
梅川酷子| | 2010-1-3 13:02 | 只看该作者
上位电阻太大,速度太快的话,I2C会不稳定,如果出现死等的话,试试把速度调小,再不行按个小的上拉电阻

使用特权

评论回复
6
lut1lut| | 2010-1-4 11:21 | 只看该作者
正如2楼所说,“(flag1 | flag2) & FLAG_Mask“之后,再与I2C_EVENT比较,要求是“有,且仅有这几个标志满足”;而如果按照LZ所的直接“(flag1 | flag2) & I2C_EVENT”,那就是“只要这几个标志满足即可”。

至于LZ在3楼说的,死在while处,那是因为已经有意想不到的标志也置位了。库里的写法,显然检测更严格。如果按照LZ那样,改后,通是通的过,但是已有潜在的问题,即不该置位的标志意外地置位了。即使这里的while通过,下面也要出问题。

使用特权

评论回复
7
wolf330824| | 2010-1-8 09:24 | 只看该作者
3楼,我也遇上这个问题了,您是如何解决的?请教 下。谢谢

使用特权

评论回复
8
pkat| | 2010-1-8 09:41 | 只看该作者
5楼的建议蛮好,试试换下上啦电阻

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

192

帖子

0

粉丝