本文最后更新于20 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
起始条件
SCL高电平期间,SDA从高电平切换到低电平
void I2C_Start(void)
{
SCL = 1;
SDA = 1;
SDA = 0;
SCL = 0;
}
终止条件
SCL高电平期间,SDA从低电平切换到高电平
void I2C_Stop(void)
{
SCL = 1;
SDA = 0;
SDA = 1;
}
发送一个字节
SCL低电平期间,主机将数据位依次放到SDA线上,然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即发送一个字节
void I2C_SendByte(unsigned char Byte)
{
unsigned char i = 0;
for(i = 0; i < 8; i++ ) //循环8次
{
SDA = Byte & (0x80 >> i); //每一次循环取其中一位
SCL = 1;
SDA = 0;
}
}
接收一个字节
SCL低电平期间,从机将数据位依次放到SDA线上,然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前需要释放SDA)
unsigned char I2C_ReceiveByte(void)
{
unsigned char i, Byte = 0x00;
SDA = 1;
for(i = 0; i < 8; i++ ) //循环8次
{
SCL = 1;
if(SDA){Byte |= 0x80;};
SCL = 0;
}
return Byte;
}
发送应答
在接收一个字节后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
void I2C_SendAck(unsigned char AckBit)
{
SDA = AckBit;
SCL = 1;
SCL = 0;
}
接收应答
在发送完一个数据后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
unsigned char I2C_ReceiveAck(void)
{
unsigned char AckBit;
SDA = 1; //释放SDA
SCL = 1;
AckBit = SDA;
return AckBit;
}
AT24C02读写
AT24C02数据帧
AT24C02的设备地址有8bit组成,高4位为固定的1010,低4位由3位的设备地址及1位的读写位组成
AT24C02的固定地址位1010,A0,A1,A2为高电平