硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3097|回复: 5
收起左侧

[有问必答] 请问程序里IO模拟I2C的发送字节里的释放总线怎么理解?

[复制链接]

5

主题

3

回帖

18

积分

新手上路

积分
18
发表于 2020-2-13 09:02:31 | 显示全部楼层 |阅读模式
/*
*********************************************************************************************************
* 函 数 名: i2c_SendByte
* 功能说明: CPU向I2C总线设备发送8bit数据
* 形    参:  _ucByte : 等待发送的字节
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;
/* 先发送字节的高位bit7 */
for (i = 0; i < 8; i++)
{
  if (_ucByte & 0x80)
  {
   I2C_SDA_1();
  }
  else
  {
   I2C_SDA_0();
  }
  i2c_Delay();
  I2C_SCL_1();
  i2c_Delay();
  I2C_SCL_0();
  if (i == 7)
  {
    I2C_SDA_1(); // 释放总线
  }
  _ucByte <<= 1; /* 左移一个bit */
  i2c_Delay();
}
}

其它都理解,里面的:
  if (i == 7)
  {
    I2C_SDA_1(); // 释放总线
  }
当全部8位发送完毕后,SDA置高,这时就算释放总线了?这时SCL没有变高。
(备注)当SDA和SCL都为高电平时,就称之为释放总线。或者 SCL保持高电平的状态下,SDA出现上升沿。停止信号过后,总线被认为“空闲”。
如果理解为发送地址后的读写控制位也不对呀,后面有调用的该函数的时候,特意加上了读写控制位。
/* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */
  i2c_SendByte(_Address | I2C_WR);

谢谢解答。

回复

使用道具 举报

5

主题

3

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2020-2-13 11:12:54 | 显示全部楼层
貌似只是主机单纯的释放I2C总线,接下来可能是主机重新占用I2C,也可能是是从机I2C,与ACK/NACK,地址位方向R/W都无关。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107028
QQ
发表于 2020-2-13 11:52:01 | 显示全部楼层
可以不用加,有专门的停止和等待应答API。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2020-2-16 12:04:19 | 显示全部楼层
你的SDA高电平时,SCL就是低电平。
回复

使用道具 举报

5

主题

85

回帖

100

积分

初级会员

积分
100
发表于 2020-2-17 12:49:34 | 显示全部楼层
个人理解,由于配置的SDA为开漏输出,释放总线即拉高SDA,SDA变成高阻态,不会干扰SDA信号,
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2020-2-19 11:46:25 | 显示全部楼层
也可以这么理解,发送指令完事了,确保下一次可以正常使用,这就要稳妥的释放总线。释放总线,两个线的电平就要就绪状态。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 16:00 , Processed in 0.178260 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表