I2C协议,即IIC,是串行数据传输协议,结构可以分为:开始条件,地址位,读写位,应答位,数据位,停止条件。
1.开启信号:SCL高电平期间,SDA从高电平切换到低电平
/*
* @brief I2C开始
* @param 无
* @retval 无
*/
void I2C_Start()
{
I2C_SCL=1;
I2C_SDA=1; //设置初值
I2C_SDA=0; //起始标志:SCL高时SDA下降
I2C_SCL=0; //为之后方便,也置0
}
2.主机发送从机地址:通常地址位占7位数据
如果主设备需要将数据发送到从设备,则第八位设置为 0
;
如果接收数据,则将第八位设置为 1
。
3.应答信号ACK:应答信号由接受方产生,接收方拉低SDA为应答,高电平为非应答
/*
* @brief I2C发送应答
* @param SendAck:应答位,1应答,0无应答
* @retval 无
*/
void I2C_SendAck(unsigned char SendAck)
{
I2C_SDA=SendAck;
I2C_SCL=1;
I2C_SCL=0;
}
/*
* @brief I2C接受应答
* @param 无
* @retval ReceiveAck:应答位,1应答,0无应答
*/
unsigned char I2C_ReceiveAck()
{
unsigned char ReceiveAck;
I2C_SDA=1; //释放SDA
I2C_SCL=1;
ReceiveAck=I2C_SDA; //读取应答位
I2C_SCL=0;
return ReceiveAck;
}
4.数据信号:发送方将一次8位信号放入SDA上
/*
* @brief I2C发送一位字节
* @param 发送的一位字节
* @retval 无
*/
void I2C_SendByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
I2C_SDA=Byte&(0x80>>i); //从高位开始送入数据
I2C_SCL=1;
I2C_SCL=0; //先上后下,送入
}
}
/*
* @brief I2C接受一位字节
* @param 无
* @retval 接受的一位字节
*/
unsigned char I2C_ReceiveByte()
{
unsigned char Byte=0x00,i;
I2C_SDA=1;
for(i=0;i<8;i++)
{
I2C_SCL=1;
if(I2C_SDA) { Byte |= (0x80>>i);} //从高位开始送入数据,如果此位是1,Byte对应位置1
I2C_SCL=0;
}
return Byte;
}
5.结束信号:SCL高电平期间,SDA从低电平切换到高电平
/*
* @brief I2C停止
* @param 无
* @retval 无
*/
void I2C_Stop()
{
I2C_SDA=0; //设置初值
I2C_SCL=1;
I2C_SDA=1; //结束标志:SCL高时SDA上升
}
总时序:
开始信号
主机发送从机地址+应答信号ACK
数据信号+应答信号ACK
……
数据信号+应答信号ACK
结束信号