cisen / blog

Time waits for no one.
135 stars 20 forks source link

IIC/I2C 总线相关 #912

Open cisen opened 4 years ago

cisen commented 4 years ago

总结

tock

原理

I2C是两根线,SDA(数据)和SCL(时钟),也是一种同步传输协议。主机在发送开始信号之后,先发送7个比特的地址位和1个比特的读写位,每个从机有自己的I2C地址,当发现该条指令是发给自己的时候,拉低SDA线(即回复ACK信号),然后主机发送或接收数据,完成传输。传输完成之后,主机发送停止位,完成该次传输。

地址分配

地址的分配方法有两种:

高7位为地址码,其分为两部分:

高4位属于固定地址不可改变,由厂家固化的统一地址; 低三位为引脚设定地址,可以由外部引脚来设定(并非所有器件都可以设定); 常用IIC接口通用器件的器件地址是由种类型号以及寻址码组成的,共7位。如格式如下: D7 D6 D5 D4 D3 D2 D1 D0 器件类型由:D7-D4 共4位决定的。这是由半导公司生产时就已固定的了,也就是说这4位已是固定的。用户自定义地址码:D3-D1共3位。这是由用户自己设置的,通常的作法如EEPROM这些器件是由外部IC的3个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。所以为什么同一IIC总线上同一型号的IC只能最多共挂8片同种类芯片的原因

区别

异同点和使用场景吧。首先,I2C和SPI都是同步协议,都有时钟信号,在一条总线上也都可以挂多个从设备,**但是I2C的从设备是通过地址来区分的,SPI的从设备是通过片选线来区分的,所以SPI总线上,每多挂一个从设备,就要多用一个线作为片选线,而I2C则不用,只要地址不冲突,可以随便挂设备。但是,I2C总线速度一般普遍慢于SPI,I2C一般的速度是100kbs、400kbps和1Mbps,而SPI的速度可以在几Mbps,也可以10+Mbps。所以看使用场合,低速的话,I2C就挺合适的,如果速度快一些,则一般都要选用SPI。另外,I2C总线的管脚都是开漏输出,必须外接上拉电阻,阻值可以根据总线速度来推算,一般我们常用400kbps传输速率,上拉电阻选用2.2K。UART和SPI、I2C不同,他是异步传输的,一般来说传输速度比较慢,传统的传输速度一般在115200bps或以下,不过现在大部分UART控制器也能支持到4Mbps或者8Mbps了。UART目前最常用的就是调试接口,因为UART比较简单,所以CPU输出log一般都通过一个UART口来输出。