ARM嵌入式学习--第十三天(I2C)

I2C

--介绍

    I2CInter-intergrated Circuit 集成电路总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有俩根双向的信号线一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;I2C总线硬件结构简单,简化了PCB布线,降低了系统成本,提高了系统的可靠性,因此在各个领域得到了广泛应用。

    I2C总线是一种多主机总线,连接在I2C总线上的器件分为主机从机主机有权发起和结束一次通信,从机只能被动呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测仲裁的功能来防止错误产生;每个连接到I2C总线上的器件都有一个唯一的地址(7bit),传输数据的设备间是简单的主从关系,每个器件既可以作为主机也可以作为从机但同一时刻只能有一个主机总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器

    I2C总线可以通过外部连线进行在线检测,便于系统故障诊断和调试故障可以立即被寻址,软件也有利于标准化和模块化,缩短开发时间

    串行的八位双向数据传输速率在标准模式下可达100bit/s快速模式下可达400bit/s高速模式下可达3.4Mbit/s

--通信过程

    1.主机发送起始信号启用总线

    2.主机发送一个字节数据指明从机地址和后续字节的传输方向

    3.被寻址的从机发送应答信号回应主机

    4.发送器发送一个字节

    5.接收器发送应答信号回应发送器

    6.  .......(循环步骤4,5)

    7.通信完成后主机发送停止信号释放总线

注意点:

    第四步和第五步用的是发送器和接收器,不是主机和从机,这是由第一个字节的最后一位决定主机给从机发送,还是从机给主机发送。也就是说,第一个字节和最后的停止信号一定是主机发给从机的,但中间就不一定了。

    发送数据过程中不允许改变发送方向

--I2C总线的信号类型

    I2C总线在传输数据过程中共有3种类型信号:开始信号、结束信号、响应信号

-开始信号(S)和结束信号(P)

    开始信号SCL为高电平时,SDA高电平向低电平跳变开始传送数据

    结束信号SCL为高电平时,SDA低电平向高电平跳变结束传输数据

    起始信号和停止信号都是由主机发出起始信号产生后总线处于占用状态,停止信号产生后总线被释放,处于空闲状态。(空闲时,SCL与SDA都是高电平

    停止情况由俩种:

        1.主机不想发了,就发送停止信号

        2.从机不想接了,不应答,主机就发送停止信号结束此次通信

-响应信号(ACK)

    接收器在接收到8位数据后,在第9个时钟周期,拉低SDA电平

(注意:SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化

 

 --I2C总线的数据传输格式

    I2C总线通信时每个字节为8位长度,数据传送时,先传送最高位(MSB)后传送低位,发送器发送完一个字节数据后接收器必须发送1位应答位来回应发送器,即一帧共有9位

启动一个传输时,主机先发送S信号,然后发出8位数据,这8位数据中前7位为从机地址,第8位表示传输的方向(0表示写操作,1表示读操作)从机收到后会发出一个ACK信号 

(注意:主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是从机发送器释放SDA线,以允许主机发出P信号结束传输)

--iMX6ull I2C控制器介绍

    inter IC提供标准I2C从机和主机的功能,I2C被设计为兼容标准NXP I2C总线协议

    I2C是一种双线串行总线,它提供了一种简单有效的数据交换方法,最大限度地减少了设备之间的互连,这种总线适用于需要在许多设备之间偶尔进行短距离通信的应用,灵活的标准允许将其他设备连接到总线上,以进行扩展和系统开发

-I2C控制器设计

-Clocks

    I2C有俩个输入时钟

    I2C的时钟源说明如下表所示

    外围时钟:这个时钟用于外围总线寄存器读写

    模块时钟:这是I2C的功能时钟。串行位时钟频率来源于模块时钟。模块时钟与外设时钟是同步的,在Fast模式下,模块时钟的最小频率应为12.8MHz,以实现400kbps的工作

 

-Arbitration procedure(仲裁程序)

    如果多个设备同时请求总线,总线时钟由一个同步过程确定,其中低周期等于设备中最长的时钟低周期,高周期等于最短的时钟低周期,数据仲裁程序决定了竞争设备的相对优先级

    如果一个设备发送高逻辑而另一个发送低逻辑,则失去仲裁;立即切换到Slave Receive模式,停止驱动I2Cn_SDA。在这种情况下,从主模式到从模式的转换不会生成Stop条件,同时,硬件在I2C状态寄存器(I2C_I2SR[IAL]表示仲裁丢失)中设置仲裁丢失位

 

-Initialization sequence(初始化顺序)

    在接口能够传输串行数据之前,必须初始化寄存器,如下所列:

        1.设置数据采样率(I2C_IFDR[IC]),从系统总线时钟获得SCL频率

        2.更新(I2C_IADR)中的地址以定义其从地址(地址范围从0到0x7f)

        3.设置I2C使能位(I2C_I2CR[IEN]),使能I2C总线接口系统

        4.修改I2C_I2CR中的位,使其选择“主从模式”、“收发模式”、和“中断使能”

-Generation of Start(Start的生成)

    初始化程序完成后,可以通过选择主传输模式来发送串行数据,在多主总线系统中,需要测试忙碌的总线(I2C_I2SR[IBB])以确定串行总线是否空闲,如果总线是空闲的(IBB=0)则可以发送起始信号和第一个字节(从机地址)。写入数据寄存器的数据包括所需从机的地址,并且最低有效位指示传输方向

    停止和下一个开始条件之间的空闲时间内置在生成开始周期的硬件中,根据系统时钟和SCL周期的相对频率,在将调用地址写入数据寄存器(I2C_I2DR)后,可能需要等到I2C不忙,然后再将数据加载到数据寄存器(I2C_I2DR)中

-Generation of Stop(Stop的产生)

    数据传输结束后,主站发出停止信号,这可能发生再所有数据发送后,对于主接收器终止数据传输,它必须通过不确认最后一个数据字节通知从站发送器,这是通过在读取倒数第二个字节之前设置传输确认位(I2C_I2CR[TXAK])来完成的,在读取最后一个字节之前,必须生成停止信号

-Generation ofRepeated Start(重复启动的产生)

    在数据传输之后,如果主站仍然需要总线,它可以发出另一个启动信号,后面跟着另一个从站地址,而不用发出停止信号

-Post-transfer software response(传输后软件响应)

    发送或接收一个字节设置数据传输位(I2C)I2SR[ICF]),表示一个字节的通信完成。完成后,中断转台(I2C_I2SR[IIF])也被设置,如果设置了中断使能(I2C_I2CR[IIEN]),则会产生外部中断。软件必须首先清除中断例程中的中断状态(I2C_I2SR[IIF])

    数据传输位(I2C_I2SR[ICF])通过在接收模式下从I2C_I2DR读取或在传输模式下写入该寄存器来清除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966223.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫--简单登录

1,使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…

C# 解决“因为算法不同,客户端和服务器无法通信”的问题

目录 故障现象 开发运行环境 解决 实现携带证书的 API URL调用 其它 故障现象 实现微信退款功能,我们需要在微信支付商户后台申请安全证书,并调用退款API URL。在调试过程中为增添返回调试信息属性,重新对.net FrameWorkd 类库进行编译…

【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行

1 ollama 的安装与设置 ollama官网链接:https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。   其安装和模型路径配置操作流程如下: ollama的安装 这里选择命令安装curl -fsSL …

LLAMA-Factory安装教程(解决报错cannot allocate memory in static TLS block的问题)

步骤一: 下载基础镜像 # 配置docker DNS vi /etc/docker/daemon.json # daemon.json文件中 { "insecure-registries": ["https://swr.cn-east-317.qdrgznjszx.com"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.c…

快速上手——.net封装使用DeekSeek-V3 模型

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,用爱发电,去丈量人心,是否能达到人机合一?开工大吉 新的一年就这么水灵灵的开始了,在这里,祝各位读者新春快乐,万事如意! 新年伊…

高德地图python地理编码和geopandas应用判断坐标点空间位置

在本人另一篇文章(高德地图地理编码python(版本3.9)爬虫(含坐标转换及数据表模板)-CSDN博客)的基础上增加geopandas功能,使脚本能自动根据查找的高德地图坐标与现有的几何范围进行交互&#xff…

Pygame介绍与游戏开发

提供pygame功能介绍的文档:Pygame Front Page — pygame v2.6.0 documentation 基础语法和实现逻辑 与CLI不同,pygame提供了图形化使用界面GUI(graphical user interface)基于图像的界面可以创建一个有图像和颜色的窗口 要让py…

Unity VideoPlayer播放视屏不清晰的一种情况

VideoPlayer的Rnder Texture可以设置Size,如果你的视屏是1920*1080那么就设置成1920*1080。 如果设置成其他分辨率比如800*600会导致视屏不清晰。

使用PyCharm创建项目以及如何注释代码

创建好项目后会出现如下图所示的画面,我们可以通过在项目文件夹上点击鼠标右键,选择“New”菜单下的“Python File”来创建一个 Python 文件,在给文件命名时建议使用英文字母和下划线的组合,创建好的 Python 文件会自动打开&#…

02.06 网络编程_套接字

思维导图: 网络编程基础:套接字的使用 网络编程是现代软件开发中不可或缺的一部分,而套接字(Socket)是网络编程中用于实现不同主机间通信的基本工具。本文将详细介绍套接字的概念、创建方法、如何通过套接字发送和接…

< OS 有关 > Ubuntu 版本升级 实践 24.04 -> 24.10, 安装 .NET

原因: 想安装 .NET 9 去编译 GitHut 项目,这回用不熟悉的 Ubuntu来做,不知道怎么拐去给 Ubuntu 升级,看到现在版本是 24.10 但不是 LTS 版本,记录下升级过程。 一、实践过程: 1. 查看当前版本 命令1: l…

VsCode创建VUE项目

1. 首先安装Node.js和npm 通过网盘分享的文件:vsCode和Node(本人电脑Win11安装) 链接: https://pan.baidu.com/s/151gBWTFZh9qIDS9XWMJVUA 提取码: 1234 它们是运行和构建Vue.js应用程序所必需的。 1.1 Node安装,点击下一步即可 …

音频进阶学习十二——Z变换一(Z变换、收敛域、性质与定理)

文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1&#xff09; r 1 r1 r12&#xff09; 0 < r < 1 0<r<1 0<r<13&#xff09; r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1&#xff09;当 …

分布式微服务系统架构第91集:系统性能指标总结

加群联系作者vx&#xff1a;xiaoda0423 仓库地址&#xff1a;https://webvueblog.github.io/JavaPlusDoc/ 系统性能指标总结 系统性能指标包括哪些&#xff1f; 业务指标、资源指标、中间件指标、数据库指标、前端指标、稳定性指标、批量处理指标、可扩展性指标、可靠性指标。 …

【C语言标准库函数】指数与对数函数:exp(), log(), log10()

目录 一、头文件 二、函数简介 2.1. exp(double x) 2.2. log(double x) 2.3. log10(double x) 三、函数实现&#xff08;概念性&#xff09; 3.1. exp(double x) 的模拟实现 3.2. log(double x) 和 log10(double x) 的模拟实现 四、注意事项 4.1. exp(double x) 的注…

CSS Overflow 属性详解:控制内容溢出的利器

在前端开发中&#xff0c;处理内容溢出是一个常见的需求。CSS 提供了 overflow 属性&#xff0c;帮助我们控制当内容超出元素框时的显示方式。本文将详细介绍 overflow 属性的各种取值及其应用场景。 1. 什么是 overflow 属性&#xff1f; overflow 属性用于控制当元素的内容…

go语言中的接口

接口简介 现实生活中的接口 现实生活中手机、相机、U 盘都可以和电脑的 USB 接口建立连接。我们不需要关注 usb 卡槽大小是否一样&#xff0c;因为所有的 USB 接口都是按照统一的标准来设计的。 Golang 中的接口&#xff08;interface&#xff09; Golang 中的接口是一种抽象…

网络安全威胁框架与入侵分析模型概述

引言 “网络安全攻防的本质是人与人之间的对抗&#xff0c;每一次入侵背后都有一个实体&#xff08;个人或组织&#xff09;”。这一经典观点概括了网络攻防的深层本质。无论是APT&#xff08;高级持续性威胁&#xff09;攻击、零日漏洞利用&#xff0c;还是简单的钓鱼攻击&am…

Redis企业开发实战(三)——点评项目之优惠券秒杀

目录 一、全局唯一ID (一)概述 (二)全局ID生成器 (三)全局唯一ID生成策略 1. UUID (Universally Unique Identifier) 2. 雪花算法&#xff08;Snowflake&#xff09; 3. 数据库自增 4. Redis INCR/INCRBY 5.总结 (四)Redis实现全局唯一ID 1.工具类 2.测试类 3…

Verilog代码实例

Verilog语言学习&#xff01; 文章目录 目录 文章目录 前言 一、基本逻辑门代码设计和仿真 1.1 反相器 1.2 与非门 1.3 四位与非门 二、组合逻辑代码设计和仿真 2.1 二选一逻辑 2.2 case语句实现多路选择逻辑 2.3 补码转换 2.4 7段数码管译码器 三、时序逻辑代码设计和仿真 3.1…