[STM32] I2C总线协议

[复制链接]
1909|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为高为低才有意义。
 楼主| 806849108 发表于 2014-4-2 12:55 | 显示全部楼层
MK60 发表于 2014-4-2 10:09
I2C接口是开漏结构,只要有一个端口输出低电平,该总线总是低电平。
只有if前面是SDA_H(),这时在if中判断 ...

哦 明白 ,我再想问下第二个程序跟第一个程序比较 哪个更好?
MK60 发表于 2014-4-3 10:20 | 显示全部楼层
806849108 发表于 2014-4-2 12:55
哦 明白 ,我再想问下第二个程序跟第一个程序比较 哪个更好?

两个都是错的,无所谓好不好
 楼主| 806849108 发表于 2014-4-3 11:05 | 显示全部楼层
MK60 发表于 2014-4-3 10:20
两个都是错的,无所谓好不好

除了多余的一次检测 哪里还有问题?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

120

帖子

0

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