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

news2025/2/8 10:16:15

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读取或在传输模式下写入该寄存器来清除

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用PyCharm进行Django项目开发环境搭建

如果在PyCharm中创建Django项目 1. 打开PyCharm,选择新建项目 2.左侧选择Django,并设置项目名称 3.查看项目解释器初始配置 4.新建应用程序 执行以下操作之一: 转到工具| 运行manage.py任务或按CtrlAltR 在打开的manage.pystartapp控制台…

移动机器人规划控制入门与实践:基于navigation2 学习笔记(一)

课程实践: (1)手写A*代码并且调试,总结优缺点 (2)基于Gazebo仿真,完成给定机器人在给定地图中的导航调试 (3)使用Groot设计自己的导航行为树 掌握一门技术 规划控制概述 常见移动机器人

TCP服务器与客户端搭建

一、思维导图 二、给代码添加链表 【server.c】 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.…

【大数据技术】本机DataGrip远程连接虚拟机MySQL/Hive

本机DataGrip远程连接虚拟机MySQL/Hive datagrip-2024.3.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本机的DataGrip连接虚拟机的MySQL数据库和Hive数据库,提高编程效率。 安装DataGrip 请按照以下步骤安装DataGrip软…

【C++篇】C++11新特性总结1

目录 1&#xff0c;C11的发展历史 2&#xff0c;列表初始化 2.1C98传统的{} 2.2&#xff0c;C11中的{} 2.3&#xff0c;C11中的std::initializer_list 3&#xff0c;右值引用和移动语义 3.1&#xff0c;左值和右值 3.2&#xff0c;左值引用和右值引用 3.3&#xff0c;…

redis之RDB持久化过程

redis的rdb持久化过程 流程图就想表达两点&#xff1a; 1.主进程会fork一个子进程&#xff0c;子进程共享主进程内存数据(fork其实是复制页表)&#xff0c;子进程读取数据并写到新的rdb文件&#xff0c;最后替换旧的rdb文件。 2.在持久化过程中主进程接收到用户写操作&#x…

操作系统—进程与线程

补充知识 PSW程序状态字寄存器PC程序计数器&#xff1a;存放下一条指令的地址IR指令寄存器&#xff1a;存放当前正在执行的指令通用寄存器&#xff1a;存放其他一些必要信息 进程 进程&#xff1a;进程是进程实体的运行过程&#xff0c;是系统进行资源分配和调度的一个独立单位…

CV(11)-图像分割

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 图像分割 语义分割不需要区分具体的个体&#xff0c;实例分割需要 反卷积/转置卷积&#xff1a; 它并不是正向卷积的完全逆过程。反卷积是一种特殊的正向卷积&#xff0c;先按照一定的比例通过补0 来扩大输入图像的尺寸&…

【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)

ps.源码放在最后面 设计IIR数字滤波器可以看这里&#xff1a;利用MATLAB配合ARM-DSP库设计IIR数字滤波器&#xff08;保姆级教程&#xff09; 前言 本篇文章将介绍如何利用MATLAB与STM32的ARM-DSP库相结合&#xff0c;简明易懂地实现FIR低通滤波器的设计与应用。文章重点不在…

STM32上部署AI的两个实用软件——Nanoedge AI Studio和STM32Cube AI

1 引言 STM32 微控制器在嵌入式领域应用广泛&#xff0c;因为它性能不错、功耗低&#xff0c;还有丰富的外设&#xff0c;像工业控制、智能家居、物联网这些场景都能看到它的身影。与此同时&#xff0c;人工智能技术发展迅速&#xff0c;也逐渐融入各个行业。 把 AI 部署到 STM…

qt+gstreamer快速创建一个流媒体播放器

目录 1 前言 2 playbin3 3 videooverlay 4 关键代码 5 运行示例 1 前言 最近因为工作需求&#xff0c;要实现一个桌面流媒体播放器来支持常见的流媒体协议&#xff0c;经过调研发现使用gstreamer配合一些桌面级的gui应用开发工具如qt可以进行快速实现&#xff0c;在此进…

DeepSeek V2报告阅读

概况 MoE架构&#xff0c;236B参数&#xff0c;每个token激活参数21B&#xff0c;支持128K上下文。采用了包括多头潜在注意力&#xff08;MLA&#xff09;和DeepSeekMoE在内的创新架构。MLA通过将KV缓存显著压缩成潜在向量来保证高效的推理&#xff0c;而DeepSeekMoE通过稀疏计…

零基础Vue入门6——Vue router

本节重点&#xff1a; 路由定义路由跳转 前面几节学习的都是单页面的功能&#xff08;都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html&#xff09;&#xff0c;涉及到项目研发都是有很多页面的&#xff0c;这里就需要用到路由&#xff08;vue route…

关于JS继承的七种方式和理解

1.原型链继承 function Fun1() {this.name parentthis.play [1, 2, 3] } function Fun2() {this.type child }Fun2.prototype new Fun1()let s1 new Fun2() let s2 new Fun2() s1.play.push(4) console.log(s1.play, s2.play) // [1, 2, 3, 4] [1, 2, 3, 4]可以看到两个…

【Vue】在Vue3中使用Echarts的示例 两种方法

文章目录 方法一template渲染部分js部分方法一实现效果 方法二template部分js or ts部分方法二实现效果 贴个地址~ Apache ECharts官网地址 Apache ECharts示例地址 官网有的时候示例显示不出来&#xff0c;属于正常现象&#xff0c;多进几次就行 开始使用前&#xff0c;记得先…

每日Attention学习18——Grouped Attention Gate

模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Grouped Attention Gate (GAG) 模块作用 轻量特征融合 模块结构 模块特点 特征融合前使用Group…

124,【8】buuctf web [极客大挑战 2019] Http

进入靶场 查看源码 点击 与url有关&#xff0c;抓包 over

源路由 | 源路由网桥 / 生成树网桥

注&#xff1a;本文为 “源路由” 相关文章合辑。 未整理去重。 什么是源路由&#xff08;source routing&#xff09;&#xff1f; yzx99 于 2021-02-23 09:45:51 发布 考虑到一个网络节点 A 从路由器 R1 出发&#xff0c;可以经过两台路由器 R2、R3&#xff0c;到达相同的…

FPGA的IP核接口引脚含义-快解

疑问 手册繁琐&#xff0c;怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌&#xff0c;手册确实比较详细但繁琐&#xff0c;如何快速知晓该部分信息&#xff0c;涛tao道长给你们说&#xff0c;简单得很&#xff0c;一般新入门的道友有所不知&#xff0c;往往后面…

Qwen2-VL-2B-Instruct 模型 RK3576 板端部署过程

需要先在电脑上运行 RKLLM-Toolkit 工具&#xff0c;将训练好的模型转换为 RKLLM 格式的模型&#xff0c;然后使用 RKLLM C API 在开发板上进行推理。 在安装前先查看板端的内存容量&#xff0c;和自己模型占用大小比较一下&#xff0c;别安装编译好了不能用。 这里我就是先尝试…