嵌入式之I2C总线及协议

I2C 总线

  • I2C是 同步 串行 半双工 总线
  • I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。
  • I2C通讯只需要2条双向总线——一条数据线SDA(serial data:串行数据线),一条时钟线SCL(serial clock:串行时钟线)。SDA线用于传输数据,SCL线用于同步数据收发。SDA线传输数据是大端传输(字节高位先传),每次传输8bit,即1字节。支持多主控(multi-mastering),任何时间点只能有一个主控。每个连接到总线的设备都有一个独立的地址addr,共7个bit,主机正是利用该地址对设备进行访问。SDA和SCL总线都需要连接上拉电阻,当总线空闲时,两根线均为高电平。连接到总线上的任意器件输出低电平都会将总线信号拉低,即各器件的SDA和SCL都是线与的关系。多个主机同时使用总线时,需要用仲裁方式决定哪个设备占用总线,不然数据将会产生冲突。(如下所示)
    在这里插入图片描述
    以下是 Mini6410 的I2C芯片电路原理图
    在这里插入图片描述

I2C 协议

  • I2C不是指的软件定义的协议,而是硬件规范

  • 空闲状态
    SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;

  • . 开始和结束信号
    开始信号SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。起始信号由主控制器产生
    结束信号SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。结束信号也只能由主控制器产生
    在这里插入图片描述

  • 数据传递
    SCL为低电平时,SDA才能发生跳变;
    SCL为高电平时,SDA必须保持

    在这里插入图片描述

  • 应答信号ACK
    I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。

  • 无应答信号NACK
    在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途:
    a. 一般表示接收器未成功接收数据字节;
    b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。

  • I2C协议格式
    I2C协议格式(如下图)
    在这里插入图片描述

I2C 芯片地址确定

  • 芯片地址 7位 或者是 10位
  • 芯片地址格式 :芯片ID + 硬件工程师确定ID (CHIPID + VarID),但是会限制所用到的同一厂商的芯片个数
  • 对于Mini6410所用到的I2C芯片 (AT24LC04),I2C芯片的地址就是0x50
    在这里插入图片描述
  • 类似的I2C芯片地址硬件设计
    在这里插入图片描述

关于I2C 寄存器的相关文档可以参考S3C6410的用户手册中IIC一章,想要理解IIC的操作还需要进行相关寄存器的配置。

链接:https://pan.baidu.com/s/1waTxUGk7yOq67Whw-yrL4Q
提取码:krvz

这篇博客只是对I2C总线及协议的简单介绍,算作一个普及,关于IIC在linux下的使用与操作还需要进行深入的系统性的学习,后续博客会更新,长路漫漫!!!

猜你喜欢

转载自blog.csdn.net/qq_41782149/article/details/100023353