什么是I2C
首先需要知道什么是I2C协议。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息(摘自百度百科)。I2C主要有两条线,一条SDA数据线,一条SCL时钟线。由于I2C支持主机与多从机之间的通信,所以在传输数据之前先进行寻址操作,才能与对应的从机建立通信。多从机的存在可能出现多个从机同时需要占用总线的情况,这时候就要通过总线仲裁来选择与某个从机进行通信了。每次通信发送或接收的数据为8位一个字节。
I2C时序图详解及通信协议程序
空闲时的SCL和SDA两条线都为高电平,每次通信结束后都需要释放总线,将SCL和SDA拉高。
起始信号和结束信号
起始信号和结束信号时序图如下:
可以看到起始信号是这样产生的:先将SDA数据总线拉低,再将SCL时钟线拉低;而结束信号与其实信号相反,先把SCL时钟线拉高后再将SDA数据总线拉高。
程序代码如下:
//起始信号
void I2C_start()
{
I2C_SCL_1;
I2C_SDA_1;
I2C_Delay();
I2C_SDA_0;
I2C_Delay();
I2C_SCL_0;
}
//结束信号
void I2C_stop()
{
I2C_SDA_0;
I2C_SCL_1;
I2C_Delay();
I2C_SDA_1;
}
数据传输
I2C要求在SCL高电平期间数据线保持稳定,在低电平期间SDA可以产生电平跳变和数据变化。
发送数据代码如下:
void I2C_sendbyte(uint8_t send_data)
{
uint8_t i;
for(i=0;i<8;i++)
{
if(send_data&(0X80>>i))
I2C_SDA_1;
else