【裸机开发】I2C 通信接口(二)—— I2C 寄存器解析

news2024/12/25 9:43:47

目录

一、硬件原理图分析

二、IO 复用寄存器解析

三、I2C 寄存器解析

3.1 时钟配置

3.2  I2C1_IADR(设置从机地址)

3.3  I2C1_IFDR(设置分频值)

3.4  I2C1_I2CR(I2C使能、中断控制)

3.5  I2C1_I2SR(保存通信状态)

3.6  I2C1_I2DR(数据发送 / 接收)

四、 AP3216C 解析

1、功能选择(0x00 — bit2:0)

2、IR + PS

3、ALS


一、硬件原理图分析

I2C 主要涉及到两个引脚,分别是 SCL 和 SDA,既然是涉及 IO,那就需要知道哪两个引脚可以被复用为 SCL 和 SDA。

首先看底板上的 I2C 模块。我们发现,IMX.6ULL 有两个 I2C 控制器,分别是 I2C1 和 I2C2。假设我们要使用 I2C1 。

然后再看底板上的 I2C 模块连接到了核心板上的哪些引脚。

最后就是找到和 UART4_TXD、UART4_RXD 相关的复用寄存器。

① TXD 相关(复用为SCL)

  • IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA
  • IOMUXC_SW_PAD_CTL_PAD_UART4_TX_DATA

② RXD 相关(复用为 SDA)

  • IOMUXC_SW_MUX_CTL_PAD_UART4_RX_DATA
  • IOMUXC_SW_PAD_CTL_PAD_UART4_RX_DATA

二、IO 复用寄存器解析

IO 初始化就涉及到两方面,一个是指定复用为哪个功能,一个是配置复用引脚的电气属性,电气属性的初值和之前一样,设为 0x10B0。

  • IO 复用
    • IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA复用为 SCL
    • IOMUXC_SW_MUX_CTL_PAD_UART4_RX_DATA(复用为 SDA)

  • 配置电气属性
    • IOMUXC_SW_PAD_CTL_PAD_UART4_TX_DATA(初值为 0x10B0)
    • IOMUXC_SW_PAD_CTL_PAD_UART4_RX_DATA(初值为 0x10B0)
/*************** SCL复用初始化 ******************/
寄存器(基地址): IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA (0x20E00B4)
寄存器(基地址): IOMUXC_SW_PAD_CTL_PAD_UART4_TX_DATA (0x20E0340)
初始化操作:
    IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA &=~ (0xF);    // 低4位清零
    IOMUXC_SW_MUX_CTL_PAD_UART4_TX_DATA |= 2;         // 复用为I2C1_SCL

    IOMUXC_SW_PAD_CTL_PAD_UART4_TX_DATA = 0x10B0;

/*************** SDA复用初始化 ******************/
寄存器(基地址): IOMUXC_SW_MUX_CTL_PAD_UART4_RX_DATA (0x20E00B8)
寄存器(基地址): IOMUXC_SW_PAD_CTL_PAD_UART4_RX_DATA (0x20E0344)
初始化操作:
    IOMUXC_SW_MUX_CTL_PAD_UART4_RX_DATA &=~ (0xF);    // 低4位清零
    IOMUXC_SW_MUX_CTL_PAD_UART4_RX_DATA |= 2;         // 复用为I2C1_SDA

    IOMUXC_SW_PAD_CTL_PAD_UART4_RX_DATA = 0x10B0;

三、I2C 寄存器解析

3.1 时钟配置

早在学习 CCM 配置时钟主频的时候,就已经配置过该寄存器了。 CSCMR1[PERCLK_PODF] 配置为 1 分频时,IPG_CLK_ROOT = PERCLK_CLK_ROOT = 66 MHz。

配置方式参考:IPG_CLK 配置

3.2  I2C1_IADR(设置从机地址)

bit 7- 1 保存了主机要通信的从机地址。 

寄存器: I2C1_IADR
基地址: 0x21A0000
地址设置: 
    I2C1_IADR = 0;           // 地址清零
    I2C1_IADR |= address;    // address 表示从机地址

3.3  I2C1_IFDR(设置分频值)

在 I2C 控制器内部还可以再次分频,时钟源就是 PERCLK_CLK_ROOT = IPG_CLK_ROOT = 66 MHz。标准模式下, I2C 传输速度最高可达 100 kbit/s,那么分频数 = 66000000 / 100000 = 660

我们要在下面这个表中找到分频数最接近 660 的,我们发现最接近的就是 640,因此寄存器要设置的值可以是 0x15、0x38

寄存器: I2C1_IFDR
基地址: 0x21A0004
地址设置: 
    I2C1_IFDR = 0x15;    // 分频值为 640    

3.4  I2C1_I2CR(I2C使能、中断控制)

bit 2: 产生一次重复启动。(0: 不重复启动        1: 产生一次重复启动)

bit 3: 发送应答。(0: 发送一次应答,相当于ACK=0        1: 不发送应答,相当于ACK=1)

bit 4: 设置通信方向。(0: 接收        1: 发送) 

bit 5: 当前设备是主机还是从机。如果有多主机参与总线占用,会发生冲裁,当前设备如果仲裁失败,当前位会被清零(0: 从机        1: 主机)

bit 6: I2C 中断使能(0: 禁用        1: 使能)

bit 7: I2C 使能(0: 禁用        1: 使能)

// 一开始不会初始化所有的位,一些位只有在实际使用才会被设置
寄存器: I2C1_I2CR
基地址: 0x21A0008 

3.5  I2C1_I2SR(保存通信状态)

bit 0: 收到了ACK/NACK(0: 收到的是ACK        1: 收到的是NACK)

bit 1: 是否有I2C中断挂起(0: 无中断挂起        1: 有中断挂起)

bit 2: 当前通信方向(0: 从机接收,主机发送        1: 从机发送,主机接收)

bit 4: 冲裁是否失败。以下三种情况会被判为仲裁失败,该位的状态由硬件控制,软件不可设置(0: 冲裁没有失败        1: 仲裁失败,丢失主线控制权)

  • 总线被占用时,发送开始信号
  • 当前设备为从机,请求重复启动
  • 主机没有发送停止信号,但是却检测到了停止信号

bit 5: I2C 总线是否空闲(0: 总线空闲        1: 总线被占用)

bit 6: 当前设备是否为从机。如果当前设备是从机,需要根据 I2SR 的 bit 2 获取当前的通信方向,并设置 I2CR 寄存器的对应位,即bit 4(0: 当前设备没有被定位        1: 当前设备被指定为从机)

bit 7: 当前数据传输状态。(0: 数据传输中        1: 传输完成,当时钟的第9个周期的下降沿出现时,才会被置 1)

寄存器: I2C1_I2SR
基地址: 0x21A000C 

3.6  I2C1_I2DR(数据发送 / 接收)

如果当前设备是接收方,该寄存器保存的是接收到的数据;如果当前设备是发送方,该寄存器保存的是要被发送的数据。

寄存器: I2C1_I2DR
基地址: 0x21A0010

四、 AP3216C 解析

AP3216C 是一个三合一的集成模块,集成了 ALS(光传感器)、PS(接近传感器)、IR(红外LED),兼容I2C 接口。

AP3216C 参考手册给出了系统寄存器以及ALS、PS、IR各个模块的详细寄存器配置,系统配置主要是要启用哪些模块,以及不同模块获取到的数据;如果要对某个模块的细微调整,那就要查看各个模块的详细寄存器配置了。

1、功能选择(0x00 — bit2:0)

2、IR + PS

IR一般和PS搭配使用,IR 数据占 10 bit,PS 数据也是占 10 bit。

① IR Data:保存的是当前环境下的红外光强度

 ② PS Data:保存物体当前的位置

 

3、ALS

ALS 数据占 16 bit,保存的是环境光强度

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

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

相关文章

不知道校园跑腿项目如何运营?那就先看看这份运营指导方案!

当大学生在校创业,其实并不与课业学习矛盾。相反,大学生可以抓住校园市场,利用校园这一具有自然地理优势的封闭市场,深入培育师生客户的需求,进入校园市场的蓝海,在不耽误学习的情况下有一个良好的收入来源…

AIGC-midjourney系列1-制作自己的证件照,卡通照

1 账号 淘宝购买共享账户 2 新建服务器 3 添加midjourney机器人 4 添加insightface机器人 在服务器聊天框输入并发送 https://discord.com/oauth2/authorize?client_id1090660574196674713&permissions274877945856&scopebot点击链接 5 insightface使用 使用…

cf 比赛 03

2021.04.28 训练地址 B. Bananas in a Microwave 题意:一开始的时候手里的数是0 这个题一开始想复杂了. 其实很简单. 我们想一个性质,我们用背包dp做这个题,从大到小枚举体积 j. 然后状态转移是从前往后推(不是之前的那个找前驱…

记录 windows11 qemu安装 麒麟操作系统的经历

因为本人供职的公司,要求国产化环境很多的软件,同时为了方便docker部署, 所以开启了 qemu虚拟aarch64环境的经历,用的软件如下: 有需要的私信,存在了,阿里云盘,百度云盘没有会员就是…

大厂面试测试岗,你一个很小的错误就能让你被淘汰

背景介绍 前后参加过几家互联网公司的测试开发岗位面试,其中两次百度的面试,一次止步三面,另一次止步于四面。这里就主要总结一下百度的面试经历和心得体会。总体感觉百度的面试官比较注重基础,问题不难但是覆盖范围比较全面。相…

栈,栈帧Stack Frames和函数调用过程Control Flow

栈其实就是计算机系统内存中的一小块。栈是一块特殊的内存区域,栈在内存中的增长方向是向低地址扩展,%rsp寄存器存储栈的最低地址,即栈顶元素的地址。这种栈结构在程序中的应用有助于实现函数调用、局部变量的管理以及递归等功能。 Push和Pop…

Blazor 自定义可重用基础组件之 CheckBox

Blazor 原生提供的基础组件实在是一言难尽&#xff0c;这给许多Blazor UI公司很多机会。可是试用了不少如AntDisgen、BootstrapBlazor等&#xff0c;总会有一些难尽如意的地方。还是自己做丰衣足食吧。 首先是带Label的CheckBox&#xff0c;代码如下&#xff1a; <p><…

HTML5开发工程师岗位的职责说明文(合集)

HTML5开发工程师岗位的职责说明文1 职责&#xff1a; 1、根据产品设计文档和视觉文件&#xff0c;利用HTML5&#xff0c;Javascript相关技术实现web端的界面效果、交互和功能; 2、基于HTML5.0的标准进行页面制作&#xff0c;编写可复用的用户界面组件; 3、负责分析和解决前端…

30多个小程序一键发布——miniprogram-ci

概述 miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。 开发者可不打开小程序开发者工具&#xff0c;独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。 miniprogram-ci 从 1.0.28 开始支持第三方平台开发的上传和预览&#xff0…

[DBT-05509] Failed to connect to the specified database (orcl).

同事在arm上测试19c部署时&#xff0c;发截图给我说dbca建库有告警&#xff0c;无法进行&#xff0c; Cause- OS Authentication might be disabled for this database (orcl). Action Specify a valid sysdba user name and password to connect to the database. 查找到的…

Windows安装ciphey编码工具,编码工具战神,cry简单题绝对克星!

TA是什么 一款智能化的编码分析解码工具&#xff0c;对于CTF中复杂性编码类题目可以快速攻破。 编码自动分析解码的神器。 如何安装 Windows环境 Python 3.8 64位&#xff08;最新的版本不兼容&#xff0c;32位的也不行&#xff09; 方便起见&#xff0c;我直接给一个3.8.…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册2

目录 1、秋千 2、跷跷板 3、搅拌器 4、奇怪的钟 5、起重机 6、烤肉架 7、手摇风扇 8、履带车 9、直升机 10、后轮驱动车 游乐场里的跷跷板 跷跷板&#xff08;又作翘翘板&#xff09;&#xff0c;又称为摇摇板&#xff0c;是指以某些东西作为支点&#xff0c;支撑著很长但十分…

MongoDB 获取数组中匹配到的第一个元素对象

例如当前test库中的grade集合中有两条文档数据,如下图所示: 相关的两个实体映射类如下: import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb…

Python中Self的详解及使用

大家学Python面向对象的时候&#xff0c;总会遇到一个让人难以理解的存在&#xff1a;self 这个self到底是谁啊&#xff0c;为什么每个类实例方法都有一个参数self&#xff0c;它到底有什么作用呢&#xff1f; 「先下结论&#xff1a;类实例化后&#xff0c;self即代表着实例&…

[SSM]在WEB中应用MyBtis

目录 MyBatis基础 5.1需求描述 5.2数据库表的设计和准备数据 5.3实现步骤 第一步&#xff1a;引入相关依赖 第二步&#xff1a;引入相关配置文件&#xff0c;放到resources目录下&#xff08;全部放到类的根路径下&#xff09; 第三步&#xff1a;前端页面index.html 第…

Istio 深入理解数据平面组件 Envoy

ingress control承载了控制面和数据面的一个职责&#xff0c;在control里面有一个process&#xff0c;这个进程就承担了反向代理的能力&#xff0c;当有任何请求发过来的时候&#xff0c;会被nginx接收到这个请求并且被转发&#xff0c;基于的规则由ingress control动态配置的&…

2023年7月1日【青书学堂】考试 计算机应用基础(高起专)

2023年7月1日【青书学堂】考试 计算机应用基础(高起专) 注意:答案仅供参考 成绩:88.8 分 第1题 单选题 在Word的编辑状态,按先后顺序依次打开了d1.doC、d2.doC、d3.doC、d4.doc 4个文档,当前的活动窗口的文档名为____。 A:d1.doc B:d2.doc C:d4.doc D:d3.doc 答案:C 第…

php代码还原工具,解决goto语句混淆,php goto解密还原

在编写php代码时&#xff0c;使用goto语句是一种常见的加密技巧。为了解决goto解码无法阅读这个问题&#xff0c;今天我要向大家介绍一款强大的php goto解密工具。 这款工具的主要功能之一就是php代码的还原。通过对代码进行解析和分析&#xff0c;它能够轻松还原被混淆的goto…

vim多文件切换快捷键设置

1、基本切换指令 vim中在打开多个文件时&#xff0c;会有多个文件进行切换的需求。按:bn切换到下一个文件&#xff0c;按:bp切换到上一个文件。 2、快捷键设置 为了便捷操作&#xff0c;将切换命令设置成快捷键。 进入/home/yys个人目录下&#xff0c;vim .vimrc进入vimrc文…

Spring Boot 中的 @EnableDiscoveryClient 注解

Spring Boot 中的 EnableDiscoveryClient 注解 Spring Boot 是一个快速开发 Spring 应用程序的框架&#xff0c;它提供了一些基础设施&#xff0c;使得我们可以快速地开发出高效、可靠的应用程序。其中&#xff0c;EnableDiscoveryClient 注解是 Spring Boot 中一个非常重要的…