IMX6ULL裸机篇之I2C协议

这篇具有很好参考价值的文章主要介绍了IMX6ULL裸机篇之I2C协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.  IIC实验简介

I2C 是最常用的通信接口,众多的传感器都会提供 I2C 接口来和主控相连。 比如摄像头、
加速度计、触摸屏等。
I.MX6U-ALPHA开发板 使用 I2C1 接口连接了一个距离传感器 AP3216C ,本章我们就来学习如何使用 I.MX6U I2C 接口来驱动 AP3216C ,读取 AP3216C 的传感器数据。

二.  I2C协议

1.  I2C简介

I2C 是很常见的一种总线协议 I2C 使用两条线在主控制器和从机之间进行数据通信。
一条是 SCL( 串行时钟线 ) ,另外一条是 SDA( 串行数据线 ) ,这两条数据 线需要接上拉电阻,总线空闲的时候 SCL SDA 处于高电平。
I2C 总线标准模式下速度可以 达到 100Kb/S ,快速模式下可以达到 400Kb/S

2.  I2C协议物理连接

I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C
从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C
设备了。
一个 I2C 总线连接多个 I2C 设备,如下图:

IMX6ULL裸机篇之I2C协议

3.  I2C协议

(1)   I2C 协议术语

I2C总线关键几点说明:
  I2C 使用两条线:SCL与SDL。这两根线必须要接一个上拉电阻,一般是 4.7K
②  I2C 是支持多从机的。
也就是一个 I2C 控制器下可以挂多个 I2C 从设备。通过从机地址来区分访问哪个从设备。
从机地址一般可以通过看器件手册知道。

起始位:

I2C 通信起始标志,通过这个起始位就可以告诉 I2C 从机,“我”要开始进行 I2C 通信了。在 SCL 为高电平的时候, SDA 出现下降沿就表示为起始位。
如下图所示:
IMX6ULL裸机篇之I2C协议

停止位:

停止 I2C 通信的标志位,和起始位的功能相反。在 SCL 位高电平的时候,SDA

出现上升沿就表示为停止位。

如下图所示:

IMX6ULL裸机篇之I2C协议

数据传输

I2C 总线在数据传输的时候要保证在 SCL 高电平期间, SDA 上的数据稳定,因此 SDA
的数据变化只能在 SCL 低电平期间发生。

如下图所示:

IMX6ULL裸机篇之I2C协议

应答信号

I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态,等待 I2C 从机应答,也就是
等到 I2C 从机告诉主机它接收到数据了。
应答信号是由从机发出的,主机需要提供应答信号所 需的时钟。
主机发送完 8 位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败。

(2)   I2C读写时序

I2C 写时序

I2C 总线单字节写时序 ,如下图所示:

IMX6ULL裸机篇之I2C协议

 

具体步骤如下:文章来源地址https://www.toymoban.com/news/detail-472624.html

 开始信号。

 发送 I2C 设备地址。

每个 I2C 器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个 I2C 器件。这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为 1 表示读操作,为 0 表示写操作。

③ I2C 器件地址后面跟着一个读写位,为 0 表示写操作,为 1 表示读操作。

  从机发送的 ACK 应答信号。

⑤ 重新发送开始信号。

⑥ 发送要写入数据的寄存器地址。

 从机发送的 ACK 应答信号。

  发送要写入寄存器的数据。

⑨ 从机发送的 ACK 应答信号。

  停止信号。

I2C 读时序

I2C 总线单字节读时序,如下图所示:
IMX6ULL裸机篇之I2C协议
I2C 单字节读时序比写时序要复杂一点。
读时序分为 4 大步骤:
第一步:发送设备地址,
二步: 发送要读取的寄存器地址,
第三步:重新发送设备地址,
第四步: I2C 从器件输出要 读取的寄存器值。

具体步骤如下:

(1)   主机发送起始信号。
(2)   主机发送要读取的 I2C 从设备地址。
(3)   读写控制位,因为是向 I2C 从设备发送数据,因此是写信号。
(4)   从机发送的 ACK 应答信号。
(5)   重新发送 START 信号。
(6)   主机发送要读取的寄存器地址。
(7)   从机发送的 ACK 应答信号。
(8)   重新发送 START 信号。
(9)   重新发送要读取的 I2C 从设备地址。
(10) 读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。
(11) 从机发送的 ACK 应答信号。
(12) I2C 器件里面读取到的数据。
(13) 主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。
(14) 主机发出 STOP 信号,停止 I2C 通信。

到了这里,关于IMX6ULL裸机篇之I2C协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • IMX6ull SPI 协议

    1.1 SPI SPI 全称是 Serial Perripheral Interface,也就是 串行外围设备接口 。 SPI 是 Motorola 公司推出的一种同步串行接口 技术,是一种高速、 全双工的同步通信总线 , SPI 时钟频率相比 I2C 要高很多,最高可以工作 在 上百 MH z。 SPI 以主从方式工作,通常是有一个主设备和一个或多

    2024年02月12日
    浏览(44)
  • 【IMX6ULL驱动开发学习】02.IMX6ULL烧写Linux系统

    由于我买的是正点原子的IMX6ULL阿尔法开发板,但是我是看韦东山老师视频学习的驱动 所以这里我烧录的方法是按照韦东山老师的课程来的 这里给出烧写Linux系统用到的工具 链接:https://pan.baidu.com/s/1bD-xxn3K8xQAVkJSaJmTzQ 提取码:af6w 下载解压后,可以看到烧写工具 烧写Linux系统

    2024年02月13日
    浏览(59)
  • iMX6ULL驱动开发 | 让imx6ull开发板支持usb接口FC游戏手柄

    手边有一闲置的linux开发板iMX6ULL一直在吃灰,不用来搞点事情,总觉得对不住它。业余打发时间就玩起来吧,总比刷某音强。从某多多上买来一个usb接口的游戏手柄,让开发板支持以下它,后续就可以接着在上面玩童年经典游戏啦。  我使用的是正点原子的I.MX6U-ALPHA 开发板,

    2024年02月14日
    浏览(54)
  • 【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

    通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号,查看内核中的gpiochip 查看 gpiochip ,以正点原子的IMX6ULL阿尔法开发板为例 查看原理图,发现led接的引脚是 GPIO1_IO3,对应 /sys/kernel/debug/gpio 中的 gpiochip0 组,gpiochip0 组从0开始算起, 所以 GPIO1_IO3 对应的标号就

    2024年02月10日
    浏览(78)
  • 【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)

    IMX6ULL一共有两个ADC,每个ADC都有八个通道,但他们共用一个ADC控制器 在imx6ull.dtsi文件中已经帮我们定义好了adc1的节点部分信息 注意 num-channels = 2; ,这个表示指定使用ADC1的两个通道,即通道1和通道2 如果你要使用多个ADC通道,修改这个值即可 配置ADC引脚的 pinctrl ,在自己的

    2024年02月12日
    浏览(63)
  • 【IMX6ULL驱动开发学习】05.IMX6ULL驱动开发_编写第一个hello驱动【熬夜肝】

    经过以下四个步骤,终于可以开始驱动开发了 01.安装交叉编译环境【附下载地址】 02.IMX6ULL烧写Linux系统 03.设置IMX6ULL开发板与虚拟机在同一网段 04.IMX6ULL开发板与虚拟机互传文件 一、获取内核、编译内核 二、创建vscode工作区,添加内核目录和个人目录 三、了解驱动程序编写

    2024年02月06日
    浏览(52)
  • 基于IMX6ULL的智能车载终端项目(代码开源)_imx6ull 开源 linux 项目 车载终端

    1.4 车载终端:杂项功能 车载终端是一个非常复杂且常用的装置,随着电车与自动驾驶技术的不断升级迭代,需求也与日俱增!我们往往需要在终端上附加许许多多其他的功能,比如:智能家居联动、车内环境监测、天气预报与网上浏览等! 作者强调:考虑到篇幅有限,作者

    2024年04月08日
    浏览(54)
  • 【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

    发现问题的契机: 学习异步通知的时候,自己实现一个功能:按键控制蜂鸣器,同时LED灯在闪烁 结果:LED好像也同时被按键控制了 最后调试结果发现: 应用层的 sleep 被驱动层的 kill_fasync 打断,所以sleep没有执行完就重新进入下一次循环了 修改代码后解决该问题 解决逻辑就

    2024年02月13日
    浏览(51)
  • 【IMX6ULL驱动开发学习】03.设置IMX6ULL开发板与虚拟机在同一网段(设置开发板静态IP)

    为什么要设置IMX6ULL与虚拟机通信? 因为要把在虚拟机下编译的文件传到IMX6ULL开发板上运行 设置好同一网段,可以互ping后,可以参考这篇博客,实现开发板与虚拟机的文件互传 IMX6ULL开发板与虚拟机互传文件 一、设置windows有线网卡 二、配置虚拟机双网卡(原本有一个NAT网卡

    2024年02月07日
    浏览(69)
  • IMX6ULL|libgpiod控制IO

    在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 export 、 unexport 、gpio{N}/direction, gpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。 在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐

    2024年01月25日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包