前言
I2C总线在硬件形式由有两根线组成SDA,SCL,是一种流行且强大的总线,适用于一主多从的场景,比如一个单片机挂载传感器,eeprom, adc等,如下图(图片源自网络)所示
电气特性
I2C总线使用的开漏的电气结构,这种结构可以有两种动作,释放总线,或者接地,也就是控制器可以将总线电压到地,也可以释放总线以允许上拉电阻拉高总线,因为高电平是由外部拉高的,没有设备能主动输出高电平,因此不会出现两个引脚一个高一个低造成短路,最多就是外部的高通过上拉电阻限流通过mos接地,单片机可以利用这个机制,比如先释放,再读取电平,如果释放总线的时候外部有器件拉低了电平,这时候读到的是总线被外部设备占用的状态也就是总线繁忙。
传输协议
I2C总线总是由主机发起,主机在传输的数据里包含从机的地址,每个处于I2C总线上的从设备均有独有的设备地址。
主机发送写到从机时
首先发送start标志+地址位7bit+读写位1bit, 然后从机给返回ACK, 接下来类似的流程发送寄存器地址,和要写的数据。
主机发送读到从机时
与主机发送写到从机有些类似,但是多了一个额外的步骤,那就是要写一遍,要读的寄存器发送start标志+地址位7bit+读写位1bit置0代表写,随后再发一个要读的字节要读的寄存器发送start标志+地址位7bit+读写位1bit置1代表读,然后才能接收。
驱动
一般来说单片机都内置I2C总线,使用内部的I2C个人感觉稳定性,功耗方面比单纯的模拟I2C,效率要高,个人的一点间接,具体应用的例子,等再发几篇读写传感器或者eeprom的文章吧。