打印
[STM32]

I2C总线协议

[复制链接]
1650|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
806849108|  楼主 | 2014-4-2 09:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void I2C_Start(void)
{
SDA_H();
SCL_H();
Delay_us(4);
if (!SDA_READ()) //SDA线为低电平则总线忙
{
  return;
}
SDA_L();
Delay_us(4);
if (SDA_READ()) //SDA线为高电平则总线忙
{
  return;
}
SCL_L();
}

uint8_t  I2c_Start(void)
{
SDA_H();
SCL_H();
  
Delay_us(4);
while( !SCL_READ() )  ; //如果读到的是低电平则等待 从机完成 added by mountain
if (!SDA_READ()) //SDA线为低电平则总线忙
{
  return I2C_OPERATE_ERROR;
}
SDA_L();
Delay_us(4);
if (SDA_READ()) //SDA线为高电平则总线忙
{
  return I2C_OPERATE_ERROR;
}
SCL_L();
return  I2C_OPERATE_SUCCESS;
}
这是I2C两个驱动程序 ,大家觉得有问题没?

相关帖子

沙发
MK60| | 2014-4-2 09:45 | 只看该作者
有问题:
SDA_L();
Delay_us(4);
if (SDA_READ()) //SDA线为高电平则总线忙,前面有SDA_L(),这个if就是多余的
{
  return;
}

使用特权

评论回复
板凳
806849108|  楼主 | 2014-4-2 10:08 | 只看该作者
MK60 发表于 2014-4-2 09:45
有问题:
SDA_L();
Delay_us(4);

这个在多主机系统中应该有用吧

使用特权

评论回复
地板
MK60| | 2014-4-2 10:09 | 只看该作者
本帖最后由 MK60 于 2014-4-2 10:16 编辑
806849108 发表于 2014-4-2 10:08
这个在多主机系统中应该有用吧

I2C接口是开漏结构,只要有一个端口输出低电平,该总线总是低电平。
只有if前面是SDA_H(),这时在if中判断SDA为高为低才有意义。

使用特权

评论回复
5
806849108|  楼主 | 2014-4-2 12:55 | 只看该作者
MK60 发表于 2014-4-2 10:09
I2C接口是开漏结构,只要有一个端口输出低电平,该总线总是低电平。
只有if前面是SDA_H(),这时在if中判断 ...

哦 明白 ,我再想问下第二个程序跟第一个程序比较 哪个更好?

使用特权

评论回复
6
MK60| | 2014-4-3 10:20 | 只看该作者
806849108 发表于 2014-4-2 12:55
哦 明白 ,我再想问下第二个程序跟第一个程序比较 哪个更好?

两个都是错的,无所谓好不好

使用特权

评论回复
7
806849108|  楼主 | 2014-4-3 11:05 | 只看该作者
MK60 发表于 2014-4-3 10:20
两个都是错的,无所谓好不好

除了多余的一次检测 哪里还有问题?

使用特权

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

本版积分规则

11

主题

120

帖子

0

粉丝