ARM裸机-20(I2C通信)

1、什么是I2C通信

1.1、物理接口:SCL + SDA

        (1)、SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。

        (2)、SDA(serial data):数据线,通信数据都通过SDA线传输。

1.2、通信特征:串行、同步、非差分、低速率

        (1)、I2C属于串行通信,所有的数据以位为单位在SDA线上串行传输。

        (2)、同步通信就是通信双方工作在同一个时钟下,一般是通信的A方通过一根CLK信号线传输A自己的时钟给B,B工作在A传输的时钟下。所以同步通信的显著特征就是:通信线中有CLK。

        (3)、非差分。因为I2C通信速率不高,而且通信双方距离很近,所以使用电平信号通信。

        (4)、低速率。I2C一般是用在同一个板子上的2个IC之间的通信,而且用来传输的数据量不大,所以本身通信速率很低(一般几百KHz,不同的I2C芯片的通信速率可能不同,具体在编程的时候要看自己所使用的设备允许的I2C通信最高速率,不能超过这个速率)。

1.3、突出特征1:主设备+从设备

        (1)、I2C通信的时候,通信双方地位是不对等的,而是分主设备和从设备。通信由主设备发起,由主设备主导,从设备只是按照I2C协议被动的接受主设备的通信,并及时响应。

        (2)、谁是主设备、谁是从设备是由通信双方来定的 (I2C协议并无规定),一般来说一个芯片可以只能做主设备、也可以只能做从设备、也可以既能当主设备又能当从设备(软件配置)。

1.4、突出特征2:可以多个设备挂在一条总线上(从设备地址)

        (1)、I2C通信可以一对一(1个主设备对1个从设备),也可以一对多(1个主设备对多个从设备)

        (2)、主设备来负责调度总线,决定某一时间和哪个从设备通信。注意:同一时间内,I2C的总线上只能传输一对设备的通信信息,所以同一时间只能有一个从设备和主设备通信,其他从设备处于"冬眠"状态,不能出来捣乱,否则通信就乱套了。

        (3)、每一个I2C从设备在通信中都有一个I2C从设备地址,这个设备地址是从设备本身固有的属性,然后通信时主设备需要知道自己将要通信的那个从设备的地址,然后在通信中通过地址来甄别是不是自己要找的那个从设备。(这个地址是一个电路板上唯一的,不是全球唯一的)。

1.5、主要用途:SoC和周边外设之间的通信(典型的如EEPROM、电容触摸IC、各种sensor等)

        

2、由I2C学通信时序

2.1、什么是时序

        (1)、时序:字面意思,时序就是时间顺序,实际上在通信中时序就是通信线上按照时间顺序发生的电平变化以及这些变化对通信的意义就叫时序。

2.2、I2C的总线空闲状态、起始位、结束位

        (1)、I2C总线上有1个主设备,n(n>=1)个从设备。I2C总线上有2种状态:空闲态(所有从设备都未和主设备通信,此时总线空闲)和忙态(其中一个从设备在和主设备通信,此时总线被这一对占用,其他从设备必须歇着)。

        (2)、整个通信分为一个周期一个周期的,两个相邻的通信周期是空闲态。每一个通信周期由一个起始位开一个结束位结束,中间是本周期的通信数据。

        (3)、起始位并不是一个时间点,起始位是一个时间段,在这段时间内总线状态变化情况是: SCL线维持高电平,同时SDA线发生一个从高到低的下降沿。

        (4)、与起始位相似,结束位也是一个时间段。在这段时间内总线状态变化情况是:SCL线维持高电平,同时SDA线发生一个从低到高的上升沿。

2.3、I2C数据传输格式(数据位&ACK)

        (1)、每一个通信周期的发起和结束都是由主设备来做的,从设备只有被动的响应主设备,没法自己自发的去做任何事情。

        (2)、主设备在每个通信周期会先发8位的从设备地址(其实8位中只有7位是从设备地址,还有1位表示主设备下面要写入还是读出)到总线(主设备是以广播的形式发送的,只要是总线上的所有从设备其实都能收到这个信息)。然后总线上的每个从设备都能收到这个地址,并且收到地址后和自己的设备地址比较看是否相等。如果相等说明主设备本次通信就是给我说话,如果不想等说明这次通信与我无关,不用听了不管了。

        (3)、发送方发送一段数据后,接收方需要回应一个ACK。这个响应本身只有1个bit位,不能携带有效信息,只能表示2个意思(要么表示收到数据,即有效响应,要么表示未收到数据,无效响应)。

        (4)、在某一个通信时刻,主设备和从设备只能有一个在发 (占用总线,也就是向总线写),另一个在收(从总线读)。如果在某个时间主设备和从设备都试图向总线写那就完蛋了,通信就乱套了。

2.4、数据在总线上的传输协议

        (1)、I2C通信时的基本数据单位也是以字节为单位的,每次传输的有效数据都是1个字节(8位)。

        (2)、起始位及其后的8个clk中都是主设备在发送 (这设备掌控总线),此时从设备只能读取总线,通过读总线来得知主设备发给从设备的信息;然后到了第9周期,按照协议规定从设备需要发送ACK给主设备,所以此时主设备必须释放总线 (主设备把总线置为高电平然后不要动,其实就类似于总线空闲状态),同时从设备试图拉低总线发出ACK。如果从设备拉低总线失败,或者从设备根本就没有拉低总线,则主设备看到的现象就是总线在第9周期仍然一直保持高,这对主设备来说,意味着我没收到ACK,主设备就认为刚才给从设备发送的8字节不对(接收失败) 。

3、S5PV210的I2C控制器

        通信双方本质上是通过时序在工作,但是时序会比较复杂不利于SoC软件完成,于是乎解决方案是SoC内部内置了硬件的控制器来产生通信时序。这样我们写软件时只需要向控制器的寄存器中写入配置值即可,控制器会产生适当的时序在通信线上和对方通信。

3.1、结构框图

        (1)、时钟部分,时钟来源是PCLK_PSYS,经过内部分频最终得到I2C控制器的CLK,通信中这个CLK会通过SCL线传给从设备。

        (2)、I2C总线控制逻辑(前台代表是I2CCON、I2CSTAT这两个寄存器),主要负责产生I2C通信时序。实际编程中要发送起始位、停止位、接收ACK等都是通过这两个寄存器(背后所代表的电路模块) 实现的。

        (3)、移位寄存器(shift  register),将代码中要发送的字节数据,通过移位寄存器变成1个位一个位的丢给SDA线上去发送/接收。学过数字电路的同学应该对移位寄存器不陌生。

        (4)、地址寄存器+比较器。本I2C控制器做从设备的时候用。(我没用过,理论分析)

3.2、系统分析I2C的时钟

        (1)、I2C时钟源头来源于PCLK (PCLK_PSYS,等于65MHz),经过了2级分频后得到的。

        (2)、第一级分频是I2CCON的bit6,可以得到一个中间时钟I2CCLK (等于PCLK/16或者PCLK/512)。

        (3)、第二级分频是得到最终I2C控制器工作的时钟,以I2CCLK这个中间时钟为来源,分频系数为[1,16]。

        (4)、最终要得到时钟是2级分频后的时钟,譬如一个可用的设置是:65000KHz/512/4=31KHz

3.3、主要寄存器I2CCON、T2CSTAT、I2CADD、I2CDS

        I2CCON + I2CSTAT:主要用来产生通信时序和I2C接口配置。

        I2CADD:用来写自己的slave address。

        I2CDS:发送/接收的数据都放在这里。

4、X210板载gsensor介绍

4.1、原理图查阅

        (1)、gsensor的供电由PWMTOUT3引脚控制。当PWMTOUT3输出低电平时gsensor无电不工作;当输出高电平时gsensor才会工作。

        (2)、gsensor的SDA和SCL接的是S5PV210的I2C端口0。

        (3)、将来编程时在gsensor_init函数中要去初始化相关的GPIO。要把相应的GPIO设置为正确的模式和输入输出值。

4.2、重力加速度传感器简介

        (1)、用在手机、平板、智能手表等设备上,用来感受人的手的移动,获取一些运动的方向性信息用来给系统作为输入参量。

        (2)、可以用来设计智能手表的计步器功能。

        (3)、重力加速度传感器、地磁传感器、陀螺仪等三个传感器结合起来,都是用来感受运动的速度、方位等信息的,所以现在最新的有9轴传感器,就是把三者结合起来,并且用一定的算法进行综合得出结论,目的是更加准确。

        (4)、一般传感器的接口有2种:模拟接口和数字接口。模拟接口是用接口电平变化来作为输出的(譬如模拟接口的压力传感器,在压力不同时输出电平在0~3.3V范围内变化,每一个电压对应一个压力)。SoC需要用AD接口来对接这种传感器对它输出的数据进行AD转换,转换得到数字电压值,再用数字电压值之校准得到压力值;数字接口是后来发展出来的,数字接口的sensor是在模拟接口的sensor基础上,内部集成了AD,直接(通过一定的总线接口协议,一般是i2C)输出一个数字值的参数,这样SoC直接通过总线接口初始化、读取传感器输出的参数即可 (譬如gsensor、电容触摸屏IC)。

4.3、I2C从设备的设备地址

        (1)、KXTE9的I2C地址固定为0b0001111 (0x0f)。

        (2)、I2C从设备地址本身是7位的,但是在I2C通信中发送I2C从设备地址时实际发送的是8位,这8位中高7位(bit7-bit1)对应I2C从设备的7位地址,最低一位(LSB) 存放的是R/W信息(就是说下一个数据是设备写从设备读(对应0),还是主设备读从设备写(对应1))。

        (3)、基于上面讲的,对于KXTE9来说,主设备 (SoC)发给gsensor信息时,SAD应该是:0b00011110(0x1E),如果是主设备读取gsensor信息时,SAD应该是:0b00011111 (0x1F)

4.4、I2C从设备的通信速率

        (1)、I2C协议本身属于低速协议,通信速率不能太高。

        (2)、实际上通信的主设备和从设备本身都有最高的通信速率限制 (属于各个芯片本身的参数),实际编程时怎么确定最终的通信速率? 只要小于两个即可。

        (3)、一般来说只能做从设备的sensor芯片本身i2c通信速率偏低,像KXTE9最高支持400KHz的频率。

5、I2C总线的通信流程

5.1、S5PV210的主发送流程图

5.2、S5PV210的主接收流程图

5.3、gsensor的写寄存器流程图

5.4、gsensor的读寄存器流程图

6、I2C通信代码分析1

6.1、I2C控制器初始化:s3c24xx_i2c_init

        (1)、初始化做的事情:初始化GPIO,设置IRQEN和ACKEN,初始化I2C时钟。

6.2、I2C控制器主模式开始一次读写:s3c24xx_i2c_message_start

6.3、I2C控制器主模式结束一次读写:s3c24xx_i2c_stop

7、I2C通信代码分析2

        框架分析:我们最终目的是通过读写gsensor芯片的内部寄存器来得到一些信息。为了完成这个目的,我们需要能够读写gsensor的寄存器,根据gsensor的规定我们需要按照一定的操作流程来读写gsensor的内部寄存器,这是一个层次(姑且叫做传输层、协议层、应用层);我们要按照操作流程去读写寄存器,就需要考虑I2C接口协议(这就是所谓的物理层,本质就是那些时序)。此时主机SoC有或者没有控制器,有控制器时考虑控制器的寄存器,没控制器时要自己软件模拟时序。协议层的代码主要取决于gsensor芯片:物理层代码主要取决于主机SoC。

7.1、gsensor写寄存器:gsensor_i2c_write_reg

7.2、gsensor读寄存器:gsensor_i2c_read_reg

7.3、gsensor编程:gsensor_initial等

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

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

相关文章

数据库范式1NF-4NF

码和属性 字段是对内而言的,private的 属性是对外而言的,public的 用Java中的类比喻就是一个对像里面定义了很多字段,一般情况下每个字段都有一组对应的getter&setter方法,注意到了吗,字段一般用private修饰&#…

HarmonyOs 4 (一) 认识HarmonyOs

目录 一 HarmonyOs 背景1.1 发展时间线1.2 背景分析1.2.1 新场景1.2.2 新挑战1.2.3 鸿蒙生态迎接挑战 二 HarmonyOS简介2.1 OpenHarmony2.2 HarmonyOS Connect2.3 HarmonyOS Next**2.4 ArkTS (重点掌握)****2.5 ArkUI** 三 鸿蒙生态应用核心技术理念**3.…

探索APP自动化测试工具的重要作用是什么?

随着移动应用市场的蓬勃发展,保障应用程序的质量和性能成为开发团队至关重要的任务。在这个背景下,APP自动化测试工具崭露头角,成为提高开发效率、减少错误率的关键工具。本文将探讨APP自动化测试工具的用途,以及它们在移动应用开…

mongoDB非关系型数据库学习记录

一、简介 1.1Mongodb是什么 MongoDB是一个基于分布式文件存储的数据库,官方地址https://www.mongodb.com/ 1.2数据库是什么 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序 1.3数据库的作用 数据库的主要作用就是管理数据,对数据进行增©、删(d)、…

大语言模型(LLMs)在 Amazon SageMaker 上的动手实践(一)

本期文章,我们将通过三个动手实验从浅到深地解读和演示大语言模型(LLMs),如何结合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等。 实验一:使用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器…

C语言错误处理之 “strerror和perror函数以及断言处理方式”

目录 前言 perror函数 strerror函数 断言处理方式 前言 在错误处理一中,我们解释了C语言三种处理方式中的错误号处理方式,这一篇我们在基于上一篇的基础上加入了strerror函数与perror函数,以及断言处理方式的内容...... perror函数 包…

VSCode下载安装教程+安装插件

一、vscode下载安装 1.打开 官网:https://code.visualstudio.com/Download 2.选择跟你电脑相对应的版本下载,我是win10,所以选择如下: 3.下载到你想要保存的目录下 4.下载完成后打开目录,双击安装包 5. 同意&#xff…

使用YOLOv8训练自己的数据集

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 拉取项目 git clone https://github.com/ultralytics/ultralytics安装依赖 cd ultralytics pip install -r requirement.txt pip instal…

【android开发-10】android中四种布局详细介绍

在Android开发中,常见的四种布局分别是:线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)和绝对布局(AbsoluteLayout)。 注意&#…

Springboot_Tomcat数据库连接池配置

Springboot_Tomcat数据库连接池配置 一、环境二、连接池使用的配置类三、Tomcat JDBC 连接池属性及默认值四、ymal配置tomcat数据库连接池示例五、验证配置的参数是否生效六、返回的验证结果 总结 一、环境 jdk 1.8springboot 1.56 二、连接池使用的配置类 包名:…

代码随想录算法训练营第五十一天 | 309.最佳买卖股票时机含冷冻期,714.买卖股票的最佳时机含手续费,股票总结

目录 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 股票问题总结 309.最佳买卖股票时机含冷冻期 题目链接:309. 买卖股票的最佳时机含冷冻期 分为四种状态: 0. 持有股票 1. 不持有股票——卖出状态 2. 不持有股票——今天卖出 3. 今天为…

第16届中国R会议暨2023X-AGI大会开幕,和鲸科技分享ModelOps在数据科学平台中的实践与应用

11月25日,第 16 届中国 R 会议暨 2023 X-AGI 大会在在中国人民大学逸夫会堂拉开帷幕,本次会议由中国人民大学统计学院、中国人民大学应用统计科学研究中心、统计之都、原灵科技和中国商业统计学会人工智能分会(筹)主办&#xff0c…

React项目使用NProgress作为加载进度条

React项目使用NProgress作为加载进度条 0、效果1、react安装依赖2、使用3.进度条颜色设置 文档参考:https://zhuanlan.zhihu.com/p/616245086?utm_id0 0、效果 如下,可全局在页面顶部有一条进度条 1、react安装依赖 yarn add nprogress通过以上安装…

pytest自动化框架之allure测试报告的用例描述设置

allure测试报告的用例描述相关方法;如下图 allure标记用例级别severity 在做自动化测试的过程中,测试用例越来越多的时候,如果执行一轮测试发现了几个测试不通过,我们也希望能快速统计出缺陷的等级。 pytest结合allure框架可以对…

YOLOv5项目实战(5)— 算法模型优化和服务器部署

前言:Hello大家好,我是小哥谈。近期,作者所负责项目中的算法模型检测存在很多误报情况,为了减少这种误报情况,作者一直在不断优化算法模型。鉴于此,本节课就给大家详细介绍一下实际工作场景中如何去优化算法模型和进行部署,另外为了方便大家进行模型训练,作者在文章中提…

oracle FUNCTION(任意两个时间 之间的工作小时)

写函数计算 任意两个时间 之间的工作小时 每天工作时间(8:00 - 20:00 共12小时),没有休息日 CREATE OR REPLACE FUNCTION SC_YD_DESI.CALCULATE_WORK_HOURS_FUNC (p_current_time IN DATE,p_order_time IN DATE ) RETURN NUMBER ASp_work_hou…

AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 1 “建立开发环境”

这个系列的文章将叙述如何借由 NXP 的“evkmimxrt1060_aws_remote_control_wifi_nxp”这支 Sample Code,达到 NXP RT1060EVK 经由 U-Blox EVK-JODY-W263 将资讯传到 AWS 上,并可借由手机对 RT1060 EVK 的 LED 进行远端控制。 整体架构如下图所示&#x…

道可云会展元宇宙平台全新升级,打造3D沉浸式展会新模式

随着VR虚拟现实、人工智能、虚拟数字人等元宇宙技术的快速发展,各个行业正试图通过元宇宙技术寻求新的发展突破口,会展行业也不例外。会展作为经贸领域的重要产业形态,越来越多的企业和组织开始寻求通过元宇宙技术为展会赋能,以满…

【EI会议征稿】第七届大数据与应用统计国际学术研讨会(ISBDAS 2024)

第七届大数据与应用统计国际学术研讨会(ISBDAS 2024) 2024 7th International Symposium on Big Data and Applied Statistics 第七届大数据与应用统计国际学术研讨会(ISBDAS 2024)定于2024年3月8-10日在中国上海举行。会议旨在…

最小化安装 Neokylin7.0 用于搭建 Hadoop 集群

文章目录 环境搭建背景虚拟机创建和环境配置安装过程注意事项虚拟机设置软件选择KOUMP系统分区网络和主机名打开以太网,并记录信息配置 IPv4修改主机名 创建用户 hadoop完全分布式搭建-CSDN博客 环境搭建背景 为什么不从hadoop100或者hadoop101开始,而是…