i2c

定义

一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

原理

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。主机负责产生定时时钟和终止数据传送。

在硬件上,12C总线只需要一根数据线和一根时钟线两根线,SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线。发送到SDA 线上的每个字节必须为8 位,每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位。首先传输的是数据的最高位(MSB),如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL 保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL 后数据传输继续。

I2C和UART的区别

I2C能够1对多,UART只能1对1。因此I2C又叫I2C总线。例如一个主控要接5个外设,但是通常的主控都不可能有5个UART口。如果用UART就需要硬件扩展。如何一对多?
一根I2C总线上挂载多个设备,那么岂不是CPU发个什么数据,所有的外设都可以看得到?是的,就这样子的。只不过CPU先会发一个地址,所有的外设都会收到这个地址。这个地址就好比外设的名字。叫了你了,你就答应,没叫你就别答应。

I2C时序图


只能由主机(Master)发起数据传输请求,从机(Slave)只能被动响应。主机和从机都不说话的时候,两根线都是高电平。

主机先发送地址(Address),I2C上挂载的所有的设备都会收到这个地址,只有这个地址和自己的地址一致,才会响应(ACK)。主机发送地址的时候顺带还会说本次操作是读还是写(RW)。从机收到这个读写信号,如果是读,从机就准备好要被读取的数据等着主机来读,如果是写,从机就做好接收数据的准备。从机响应了,主机才会继续发数据。如果没有人响应,要么是从设备都挂了,要么是地址不对,总之就是有问题。

如果上面的都ok了,接下来就是按部就班的传输数据了。

原文地址:https://www.cnblogs.com/uestcman/p/9271348.html