zoukankan      html  css  js  c++  java
  • 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了,接下来就是按部就班的传输数据了。

  • 相关阅读:
    华为手机内核代码的编译及刷入教程【通过魔改华为P9 Android Kernel 对抗反调试机制】
    AndroidStudio升级到4.0之后,出现Warning: Default Activity not found解决办法
    Python解决gensim加载doc2vec或work2vec向量训练模型文件太慢甚至无法访问的情况
    layui 上传插件控制上传文件个数(换个角度思考问题)
    CDN访问异常重定向
    sql 语句优化
    swipper全屏垂直滚动获取高度问题
    tp6.0相对于tp5.1的变化
    项目打包文件ipa包瘦身
    load和initialize的区别
  • 原文地址:https://www.cnblogs.com/uestcman/p/9271348.html
Copyright © 2011-2022 走看看