野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 142|回复: 1

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

[复制链接]
发表于 2020-2-13 09:02:25 | 显示全部楼层 |阅读模式
/*
*********************************************************************************************************
* 函 数 名: i2c_SendByte
* 功能说明: CPU向I2C总线设备发送8bit数据
* 形    参:_ucByte : 等待发送的字节
* 返 回 值: 无
*********************************************************************************************************
*/
//以8Bit为一个单元,一个BIT一个BIT的发,高位先发,低位后发,
void i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;

//先发送字节的高位bit7
for (i = 0; i < 8; i++)
{  
  if (_ucByte & 0x80) //MSB在前
  {
   EEPROM_I2C_SDA_1();
  }
  else
  {
   EEPROM_I2C_SDA_0();
  }
  i2c_Delay();
  EEPROM_I2C_SCL_1();
  i2c_Delay();
  EEPROM_I2C_SCL_0();
  if (i == 7)
  {
    EEPROM_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 | EEPROM_I2C_WR);

谢谢解答。



回复

使用道具 举报

发表于 2020-2-14 10:46:31 | 显示全部楼层
读取ACK吧   
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|站点地图|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号-2 ) 大学生ARM嵌入式2群

GMT+8, 2020-8-14 03:51 , Processed in 0.130553 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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