> 文章列表 > 跟着原子学I2C

跟着原子学I2C

跟着原子学I2C

I2C通讯

1、IIC总线介绍

集成电路总线,是一种同步串行半双工通信总线。

总线or协议?!

总线是数据传输通道,协议是数据传输规则。

1、1介绍

a、由时钟线SCL和数据线SDA组成,并且都接上拉电阻,确保总线空闲状态为高电平

b、总线支持多设备连接,允许多主机存在,每个设备都有一个唯一的地址。

c、连接到总线上的数目受总线的最大电容400pf限制

d、数据传输速率:标准模式100k bit/s 快速模式400k bit/s 高速模式3.4M bit/s。

1、2归纳

三个信号: 起始信号、停止信号、应答信号。

两个注意:数据有效性、数据传输顺序。

一个状态:空闲状态。

起始信号:当SCL为高电平时,SDA从高电平变为低电平。

停止信号:当SCL为高电平时,SDA从低电平变为高电平。

应答信号:上拉电阻影响下SDA默认为高,而从机拉低SDA就是确认收到数据,为ACK,如果没有收到,为NACK。

数据先发送高位,数据以字节(8bit)传输,数据在SCL高电平稳定。

空闲状态:SCL、SDA都是高电平。

1、3跟着正点原子写代码

起始信号

/*SDA、SCL开始都处于高电平,SCL为高电平期间,SDA从高到低跳变*/
void iic_start(void)
{IIC_SDA(1);IIC_SCL(1);IIC_delay();//delay时间看器件IIC_SDA(0);IIC_delay();IIC_SCL(0);//SCL拉低,钳住总线,准备发送/接收数据IIC_delay();
}

停止信号

/*SCL为高电平期间,SDA从低电平往高电平跳变*/
void iic_stop(void)
{ IIC_SDA(0);IIC_delay();IIC_SCL(1);IIC_delay();IIC_SDA(1);IIC_delay();
}

检测应答信号(主机)

//return:  1:fail  0:succeed
uint8_t iic_wait_ack(void) 
{IIC_SDA(1);//主机释放SDA线IIC_delay();IIC_SCL(1);//从机返回ACKIIC_delay();if(IIC_READ_SDA)//SCL高电平读取SDA状态{iic_stop();//SDA高电平表示从机NACKreturn 1;}IIC_SCL(0);iic_delay();return 0;
}

发送应答信号

void iic_ack(void)
{ IIC_SCL(0);IIC_delay();IIC_SDA(0);IIC_delay();IIC_SCL(1);IIC_delay();
}

发送非应答信号

void iic_ack(void)
{   
IIC_SCL(0); 
IIC_delay();
IIC_SDA(1);
IIC_delay(); 
IIC_SCL(1); 
IIC_delay();
}
发送1字节数据
void  iic_send_byte(uint8_t  data)
{for(uint8_t t=0;t<8;t++){IIC_SDA((data&0x80)>>7);IIC_delay(); IIC_SCL(1); IIC_delay();IIC_SCL(0);data<<=1;//左移1位,用于下一次发送   }IIC_SDA(1);//发送完成,主机释放SDA线}

读取1字节数据

void  iic_read_byte(uint8_t  ack)
{uint8_t receive =0;for(uint8_t t=0;t<8;t++){receive<<1;//高位先输出,先收到的数据位要左移IIC_SCL(1);IIC_delay();if(IIC_READ_SDA)receive++;IIC_SCL(0);IIC_delay();}if(!ack)iic_nack();else iic_ack();return receive;
}

包装材料