/*
*********************************************************************************************************
* 函 数 名: 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);
谢谢解答。 |