(摘要:空闲时,时钟线数据线都是高电平,主机发送数据前,要在时钟为高电平时,把数据线从高电平拉低,数据发送采取高位先行,时钟线低电平时可以修改数据线,时钟线高电平时要求数据线稳定,数据为8bit,发到第九个bit时,是应答位,另一个设备应答为低电平为ack,高电平为nack,结束通信,时钟线高电平时,把数据线从低电平拉高。)

(主设备发送完起始信号,第一个字节是设备地址8bit,最后一位为0表示主机发数据,从机收数据,反之主收从发,所以设备可以有2^7个)

 e2prom芯片

IIC(Inter-Integrated Circuit)又称I2C,是是IICBus简称,所以中文应该叫集成电路总线。是飞

利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展而来的一种同

步串行半双工通信总线方式。该总线允许同时连接多个设备(芯片)。每块芯片在总线上拥有特定的

地址。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取

IIC从属设备地址。

上图所示是IIC的总线的使用场景,所有挂载在IIC总线上的设备都有两根信号线,一根是数据线SDA,另一根是时钟线SCL。这两个信号线都是双向的。作为一种通信方式, IIC总线在某一时刻,总线只允许有一个设备处于发送状态,所发生的数据被总线上所有的设备所接收。 IIC通信协议包含有设备地址,只有发送方携带的地址与某个接收方的地址相同时,接收方才真正执行相关的指令.

IIC总线规定,设备在空闲时,两根总线都处于高电平状态。为保证这种状态,数据线SDA和时钟线SCL都要外接上拉电阻。 对于I.MX来说,这个上拉电阻也可以在引脚电器配置中设置。

IIC总线上连接的若干设备中,每次通信前,发送方首先发送一个“起始”信号,其实信号就是在SCL为高电平时, SDA发送一个低电平。当其它设备接收到这个其实信号后,将进行一次“总线仲裁”。意思就是设备(除发送起始信号的那个设备以外的)都将处于聆听状态。

IIC总线进行数据传送时,时钟线(SCL)上的信号为高电平期间,数据线(SDA)上的数据必须保持稳定。只有在时钟线(SCL)上的信号为低电平期间,数据线(SCL)上的高电平或低电平状态才允许变化。同时, SCL信号由数据启动发送的设备提供。输出到数据线(SDA)上的每个字节必须是8位。数据传送时,先传送最高位(MSB),后传送最低位(LSB)

发送器每发送一个字节(8个bit),就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。 主机SCL拉高,读取从机SDA的电平。对于反馈有效应答位ACK的要求是:接收器在第9个时钟脉冲之前的低电平期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平。

数据线(SDA)为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节。

数据线(SDA)为高电平时,规定为非应答位(NACK),表示接收器没有成功接收该字节。

当发送方发送完最后一个bit后,需要发送一个结束标志来终止整个通信过程。当时钟线SCL 为高电平时,数据线SDA 由低电平向高电平跳变。

上图就是一个完整的IIC通信时序图。

由于I2C总线是一种总线式连接方式,意味着在同样的两根线上可能连接有多个不同的设备,这种总线式连接方案通常会被设计为主从应答通信方式。也就是说,对于总线上连接的所有设备来说,有一个设备是主设备,而其他设备都是从设备。设备之间的通信都是由主设备发起的,从设备被动应答主设备。这里不难看出: 1、从设备之间是无法直接完成通信的; 2、总线上的从设备必须拥有一个独一无二的标识,这个标识被称为设备地址。设备地址类似一个人的名字,因为在I2C总线通信过程中,无论哪个设备发送数据,其他所有设备都能够监听得到,所以每次通信时,主设备先发送要访问的子设备地址,每个子设备都把监听到的这个地址拿来跟自己进行匹配,只有匹配成功的子设备才是真正需要操作的设备。

按照I2C标准,主设备发起通信时先发送一个起始信号,之后发送的第一个字节就是子设备的设备地址。需要注意的是。设备地址本身只占7个比特,最后一个比特所代表的是之后的数据流向。 0代表主发从收,通常描述为写, 1表示从发主收,通常描述为读。

例如,某个设备的从机地址为0x48(二进制0100 1000b),主机在发送完起始信号之后要发送要发送的从机地址其实是1001 000x,这里x就是数据流向位。如果x为0,表示接下来主机发送数据,从机接收数据,如果x为1,表示接下要求从机发送数据,主机接收数据

I.MX6ULL本身有四路I2C控制器,但是I.MX6ULL-Mini 开发板上只在I2C2控制器上连接了一个触控装置,用于检测用户点击了屏幕的哪个位置。关于触摸屏的操作我们之后再加以说明。而I2C1、 3、4控制器是空置的,我们可以用杜邦线连接我们需要接入的任意传感器。这里我们在I2C1上连接两个传感器AT24C02和LM75为例,作为本次I2C实验内容。

首先是AT24C02,这是一款EEPROM,是一种非易失性存储器。同类型的芯片还有AT24C04,AT24C08,之间的区别仅仅是存储大小不同。既然是一种存储器,那么对其操作无外乎有两种操作,读取和写入操作。这两种操作又同时面临了一个问题,读取和写入的位置。由于AT24C02有256个字节的空间,因此无论读取还是写入,都必须先告诉24C02读取或者写入的位置,即地址。因此,我们不难总结出对24C02的两种操作流程,我们分别加以说明:

接下来讨论从24C02中读取数据,事实上读取数据可以通过两种不同的方式进行,第一种方式是主机先发送设备地址,然后再发送要读取的位置地址。需要注意的是,虽然最终的目的是要从从机那里读取数据,但是由于我们需要先把读取的存储地址发送给从机,因此发送设备地址时我们把数据流向设置为写。发送完存储地址之后,第一种做法是发送停止位,然后重新启动通信,这次我们把发送设备地址时的数据流向设置为读,然后就顺序读取若干字节

第一种方式。这种读从机方式需要两次通信才行。大多数情况下我们并不采用这种方式,而是采用第二种方式,形式于此类似,不同之处仅在于第一次通信之后不发停止位,而是立即重新发送从机地址并标记数据流向为读:

上图就是完整的第二种方式的时序,可见这种方式在发送完写入地址之后并未结束通信,而是重新发送起始信号并改变数据流量,因此这种方式效率更高。需要注意的是,大多数I2C芯片都支持两种方式,但是在读取到最后一个字节的时候,注意必须回复NACK,否则可能会导致从机通信异常。

I.MX6U 提供了 4 个 I2C 外设,通过这四个 I2C 外设即可完成与 I2C 从器件进行通信I.MX6U的 I2C 支持两种模式:标准模式和快速模式,标准模式下 I2C 数据传输速率最高是 100Kbits/s,在快速模式下数据传输速率最高为 400Kbits/s。

先介绍一下跟I2C相关的寄存器,首先看一下 I2Cx_IADR(x=1~4)寄存器,这是I2C 的地址寄存器, ADR(bit7:1)位有效,用来保存 I2C 从设备地址数据。当我们要访问某个 I2C 从设备的时候就需要将其设备地址写入到 ADR 里面。

寄存器 I2Cx_IFDR 也只有 IC(bit5:0)这个位,用来设置 I2C 的波特率, I2C 的时钟源可以选择IPG_CLK_ROOT=66MHz,通过设置 IC 位既可以得到想要的 I2C 波特率。需要注意的是不像其他外设的分频设置一样可以随意设置,手册第1464页给出了I2Cx_IFDR[bit5:0]为不同的值时的分频值。比如现在 I2C 的时钟源为 66MHz,我们要设置I2C 的波特率为 100KHz,那么IC 就可以设置为 0X15,也就是 640 分频。 66000000/640=103.125KHz≈100KHz。

寄存器 I2Cx_I2CR 的各位含义如下:

• IEN(bit7): I2C 使能位,为 1 的时候使能 I2C,为 0 的时候关闭 I2C;

• IIEN(bit6): I2C 中断使能位,为 1 的时候使能 I2C 中断,为 0 的时候关闭 I2C 中断;

• MSTA(bit5):主从模式选择位,设置 IIC 工作在主模式还是从模式,为 1 的时候工作在主模式,为 0的时候工作在从模式;

• MTX(bit4):传输方向选择位,用来设置是进行发送还是接收,为 0 的时候是接收,为 1 的时候是发送;

• TXAK(bit3):传输应答位使能,为 0 的话发送 ACK 信号,为 1 的话发送 NO ACK 信号;

• RSTA(bit2):重复开始信号,为 1 的话产生一个重新开始信号。寄存器 I2Cx_I2SR 的各位含义如下:

• ICF(bit7):数据传输状态位,为 0 的时候表示数据正在传输,为 1 的时候表示数据传输完成;

• IAAS(bit6):当为 1 的时候表示 I2Cx_IADR 寄存器中的地址是从设备地址。为0表示I2Cx_IADR是自己的地址;

IBB(bit5): I2C 总线忙标志位,当为 0 的时候表示 I2C 总线空闲,为 1 的时候表示 I2C 总线忙;

• IAL(bit4):仲裁丢失位,为 1 的时候表示发生仲裁丢失。仲裁丢失在手册第1455页有说明,如果多个设备同时尝试连接总线,则其中一个成为主设备。硬件会立即将仲裁失败的设备切换到Slave

Receive模式 。那么仲裁失败的设备就会产生仲裁丢失,导致此位置位。需要理解的是这种情况一定发生在发送起始位的时候,也就是说在发送完起始位之后应该判断此位是否为1;

• SRW(bit2):从机读写状态位,当 I2C 作为从机的时候使用,此位用来表明主机发送给从机的是读还是写命令。为 0 的时候表示主机要向从机写数据,为 1 的时候表示主机要从从机读取数据;

• IIF(bit1): I2C 中断挂起标志位,当为 1 的时候表示有中断挂起,此位需要软件清零;

• RXAK(bit0):应答信号标志位,无论作为主机还是从机,为 0 的时候表示接收到 ACK 应答信号,为1 的话表示检测到 NO ACK 信号。

最后一个寄存器就是 I2Cx_I2DR,这是 I2C 的数据寄存器,此寄存器只有低 8 位有效,当要发送数据的时候将要发送的数据写入到此寄存器,注意此时LSB代表的是数据流向,需要按照实际情况设置为1或者0;如果要接收数据的话直接读取此寄存器即可得到接收到的数据。

本次实验中我们通过 I.MX6ULL 的 I2C1 来写AT24C02,为完成这个实验,需要大家使用杜邦线外接AT24C02,如下图,我们需要连接4根线:电源、地、 SCL和SDA。查阅AT24C02手册可以看出24C02的供电电压从1.8~5.5V之间,电压越高速度越快,由于I.MX6ULL芯片本身供电是3.3V,所以我们接3.3V电源。查阅I.MX6ULL手册可以看出,该芯片UART4_RX是可以复用I2C1_SDA的, UART4_TX是可以复用I2C1_SCL的,因此24C02的SCL接43号针脚, SDA接SDA针脚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90712.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90712.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/90712.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为了安全应该使用非root用户启动nginx

nginx基线安全,修复步骤。主要是由于使用了root用户启动nginx。为了安全应该使用非root用户启动nginx一、检查项和问题检查项分类检查项名称身份鉴别检查是否配置Nginx账号锁定策略。服务配置检查Nginx进程启动账号。服务配置Nginx后端服务指定的Header隐藏状态服务…

论文解析篇 | YOLOv12:以注意力机制为核心的实时目标检测算法

前言:Hello大家好,我是小哥谈。长期以来,改进YOLO框架的网络架构一直至关重要,但尽管注意力机制在建模能力方面已被证明具有优越性,相关改进仍主要集中在基于卷积神经网络(CNN)的方法上。这是因…

学习C++、QT---20(C++的常用的4种信号与槽、自定义信号与槽的讲解)

每日一言相信自己,你比想象中更接近成功,继续勇往直前吧!那么我们开始用这4种方法进行信号与槽的通信第一种信号与槽的绑定方式我们将按键右键后转到槽会自动跳转到这个widget.h文件里面并自动生成了定义,我们要记住我们这个按钮叫…

Anolis OS 23 架构支持家族新成员:Anolis OS 23.3 版本及 RISC-V 预览版发布

自 Anolis OS 23 版本发布之始,龙蜥社区就一直致力于探索同源异构的发行版能力,从 Anolis OS 23.1 版本支持龙芯架构同源异构开始,社区就在持续不断地寻找更多的异构可能性。 RISC-V 作为开放、模块化、可扩展的指令集架构,正成为…

4万亿英伟达,凭什么?

CUDA正是英伟达所有神话的起点。它不是一个产品,而是一个生态系统。当越多的开发者使用CUDA,就会催生越多的基于CUDA的应用程序和框架;这些杀手级应用又会吸引更多的用户和开发者投身于CUDA生态。这个正向飞轮一旦转动起来,其产生…

Unity3D iOS闪退问题解决方案

前言 在Unity3D开发中解决iOS闪退问题需要系统性排查,以下是关键步骤和解决方案: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀! 1. 获取崩溃日志(关键第一步&#xff…

嵌入式八股文之 GPIO

1. GPIO 的基本概念(1) 什么是 GPIO?GPIO 的中文意思是通用输入输出端口(General Purpose Input/Output),是嵌入式系统中可编程控制的通用引脚,可通过软件配置为输入或输出模式。(背诵)(2) 它的…

Umi-OCR 的 Docker安装(win制作镜像,Linux(Ubuntu Server 22.04)离线部署)

前置博客:Ubuntu-Server 22.04.4 详细安装图文教程 wget命令在windows终端下不能使用的原因及解决办法 在 Ubuntu 22.04 LTS 上离线安装 Docker 手把手教你在Win11下安装docker Umi-OCR 安装docker时报错:workstation服务启动报错。错误1075&#…

力扣242.有效的字母异位词

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词。示例 1:输入: s "anagram", t "nagaram" 输出: true示例 2:输入: s "rat", t "car" 输出: false提示:1 < s.length, t.length < 5 * 104s…

基于Springboot+UniApp+Ai实现模拟面试小工具二:后端项目搭建

本节介绍本项目后端项目的开发工具及基础项目的搭建&#xff0c;包括开发工具介绍及后端项目的创建和依赖框架的引入及对应配置。 源码下载&#xff1a; 点击下载 讲解视频&#xff1a; UniappSpringbootKimi实现模拟面试小程序-Springboot项目创建一&#xff0e;开发工具 1.…

Linux711 Mysql

模版 root192.168.235.130s password:┌──────────────────────────────────────────────────────────────────────┐│ • MobaXterm Personal Edition v23.2 • ││…

QT 秘钥生成工具

该项目是注册机和验证机项目&#xff0c;分别是密钥生成工具&#xff0c;和密钥验证demo,可以识别电脑唯一标识码。#include "frmmain.h" #include "ui_frmmain.h" #include "qmessagebox.h" #include "qfile.h" #pragma execution_ch…

PyTorch神经网络训练全流程详解:从线性层到参数优化

目录 一、神经网络训练的核心组件 二、代码逐行解析与知识点 三、核心组件详解 3.1 线性层(nn.Linear) 3.2 损失函数(nn.MSELoss) 3.3 优化器(optim.SGD) 四、训练流程详解 五、实际应用建议 六、完整训练循环示例 七、总结 在深度学习实践中&#xff0c;理解神经网络…

从代码学习深度学习 - 针对序列级和词元级应用微调BERT PyTorch版

文章目录 前言针对序列级和词元级应用微调BERT单文本分类文本对分类或回归文本标注问答总结前言 在自然语言处理(NLP)的广阔天地里,预训练模型(Pre-trained Models)的出现无疑是一场革命。它们如同站在巨人肩膀上的探索者,使得我们能够利用在大规模文本语料上学到的丰富…

学习笔记丨卷积神经网络(CNN):原理剖析与多领域Github应用

本文深入剖析了卷积神经网络&#xff08;CNN&#xff09;的核心原理&#xff0c;并探讨其在计算机视觉、图像处理及信号处理等领域的广泛应用。下面就是本篇博客的全部内容&#xff01;&#xff08;内附相关GitHub数据库链接&#xff09; 目录 一、什么是CNN&#xff1f; 二、…

cnpm exec v.s. npx

1. 核心定位与设计目标 npx (Node Package Executor): 定位: Node.js 内置工具&#xff08;npm 5.2 起捆绑&#xff09;&#xff0c;核心目标是便捷地执行本地或远程 npm 包中的命令&#xff0c;无需全局安装。核心价值: 避免全局污染&#xff1a; 临时使用某个 CLI 工具&#…

我花10个小时,写出了小白也能看懂的数仓搭建方案

目录 一、什么是数据仓库 1.面向主题 2.集成 3.相对稳定 4.反映历史变化 二、数仓搭建的优势 1.性能 2.成本 3.效率 4.质量 三、数仓搭建要考虑的角度 1.需求 2.技术路径 3.数据路径 4.BI应用路径 四、如何进行数仓搭建 1.ODS层 2.DW层 3.DM层 五、写在最后…

OBB旋转框检测配置与训练全流程(基于 DOTA8 数据集)

&#x1f680; YOLO交通标志识别实战&#xff08;五&#xff09;&#xff1a;OBB旋转框检测配置与训练全流程&#xff08;基于 DOTA8 数据集&#xff09; 在专栏前面四篇里&#xff0c;我们完成了&#xff1a; ✅ Kaggle交通标志数据集下载并重组标准YOLO格式 ✅ 训练/验证集拆…

uniapp制作一个视频播放页面

1.产品展示2.页面功能(1)点击上方按钮实现页面跳转&#xff1b;(2)点击相关视频实现视频播放。3.uniapp代码<template><view class"container"><!-- 顶部分类文字 --><view class"categories"><navigator class"category-…

8.卷积神经网络基础

8.1 卷积核计算 import torch from torch import nn import matplotlib.pyplot as plt def corr2d(X,k):#计算二维互相关运算h,wk.shape#卷积核的长和宽Ytorch.zeros((X.shape[0]-h1,X.shape[1]-w1))#创建(X-H1,X-W1)的全零矩阵for i in range(Y.shape[0]):for j in range(Y.s…