LV.12 D23 IIC控制器与MPU6050 学习笔记

一、Exynos_4412下的IIC控制器

4412有四个IIC,如果要使用需要配置四个寄存器

I2CCON:配置一些功能

I2CSTAT:控制一些功能、显示一些状态

I2CDS:发送和接收数据

I2CADD:当4412作为从机时需要一个地址,这个寄存器用于设置地址

支持7位的地址模式,极少数IIC的地址是10位的。标准模式下最快速度是100K,快速模式下可以达到400k。支持主机发送,主机接收,从机发送,从机接收的工作模式。支持中断和轮询。

上图是主机发送模式下4412的工作流程

上图是主机接收模式下4412的工作流程

由于4412一般作为主控制器,很少作为从机,所以另外两个模式暂时不看了。

二、IIC寄存器详解

7\] 接收到一个字节数据后是否产生应答信号 1产生 0不产生 \[6\] 分频,影响IIC的通信速度。 0是16倍分频,1是512倍分频 \[5\] 中断的开关,IIC在接收和发送一个信号后都会产生一个中断信号通知你。 0关闭,1开启 \[4\] 中断挂起标志位,当\[5\]把中断功能打开时,\[4\]这一位才有效。当中断产生这位自动置1,在处理完中断信号后要写成0 \[3:0\] 影响IIC的通信速度,改变时钟频率。(不用设置) ![](https://file.jishuzhan.net/article/1732620609394839554/ac30430a54bffb1581e69a52bee436c8.webp)​ \[7:6\] 模式选择 \[5\] 发送起始和停止信号,0是停止,1是起始 \[4\] 总线收发数据的开关 \[3:0\] 只读,表示IIC的状态 ![](https://file.jishuzhan.net/article/1732620609394839554/b50997b4914cc7a36dec66932e02005e.webp) I2CADD:4412的地址。作为从机时,才需要设置。 ![](https://file.jishuzhan.net/article/1732620609394839554/829b5c8cb9ce1bfe07c82b50759c21b8.webp) I2CDS:数据移位寄存器。 ![](https://file.jishuzhan.net/article/1732620609394839554/dd41747a84c958c04637b7c46adb4f55.webp) I2CLC:用于设置滤波器和延迟,暂时用不上就不设置了。 ## 三、MPU6050原理 ### 3.1 MPU6050 MPU6050是一个运动处理传感器,其内部集成了3轴加速度传感器和3轴陀螺仪(角速度传感器),以及一个可扩展数字运动处理器。 ![](https://file.jishuzhan.net/article/1732620609394839554/c02e0f5243af6899c94be7deb43c2f22.webp) ### 3.2 MPU6050主要参数 可测量X、Y、Z轴三个方向的角速度 可编程设置角速度测量范围为±250、±500、±1000、±2000°/sec 可测量X、Y、Z轴三个方向的加速度 可编程设置加速度测量范围为±2g、±4g、±8g、±16g 可编程设置低功耗模式 可编程设置采样频率 ........ ### 3.3 MPU6050通信接口 MPU6050可以使用IIC总线和其他器件进行数据交互,我们可以使用IIC总线向MPU6050中的控制寄存器写入数据来设置MPU6050的工作参数 也可以使用IIC总线从MPU6050中的数据寄存器读取数据来获取加速度、角速度等信息 ![](https://file.jishuzhan.net/article/1732620609394839554/a6bb4caaf82f7c83d38b45638481bc13.webp) ### 3.4 MPU6050官方芯片手册 MPU6050的引脚: ![](https://file.jishuzhan.net/article/1732620609394839554/740fce5473936f8eac0780d3f5fbe30c.webp) 引脚的分布说明: ![](https://file.jishuzhan.net/article/1732620609394839554/f794ea6c7cba8845c4db8dbfb5c48eb0.webp) 典型电路: ![](https://file.jishuzhan.net/article/1732620609394839554/2bfea50a83a6a2948a2a542bf57d1fd6.webp) 每个电容的作用: ![](https://file.jishuzhan.net/article/1732620609394839554/f80569bf8ff5bd76a636a9a6074ef574.webp) ### 3.5 MPU6050寄存器 所有的寄存器: ![](https://file.jishuzhan.net/article/1732620609394839554/f9ac0db52301b2e79702f31986278faf.webp) ![](https://file.jishuzhan.net/article/1732620609394839554/1fdfebb63cc69f14352abc81f8e715ec.webp) ![](https://file.jishuzhan.net/article/1732620609394839554/35828d939f40f5d2d6cfbccc5e42a241.webp) **MPU6050常用寄存器:** ```bash /****************MPU6050内部常用寄存器地址****************/ #define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz) #define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz) #define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000°/s) #define ACCEL_CONFIG 0x1C //加速计自检及测量范围及高通滤波频率,典型值:0x0(不自检,2G,5Hz) #define ACCEL_XOUT_H 0x3B #define ACCEL_XOUT_L 0x3C #define ACCEL_YOUT_H 0x3D #define ACCEL_YOUT_L 0x3E #define ACCEL_ZOUT_H 0x3F #define ACCEL_ZOUT_L 0x40 #define TEMP_OUT_H 0x41 #define TEMP_OUT_L 0x42 #define GYRO_XOUT_H 0x43 #define GYRO_XOUT_L 0x44 #define GYRO_YOUT_H 0x45 #define GYRO_YOUT_L 0x46 #define GYRO_ZOUT_H 0x47 #define GYRO_ZOUT_L 0x48 #define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用) #define SlaveAddress 0x68 //MPU6050-I2C地址 ``` **例:GYRO_CONFIG寄存器** ![](https://file.jishuzhan.net/article/1732620609394839554/cddb9229bf0484bdb28e718ac038e5d7.webp) ![](https://file.jishuzhan.net/article/1732620609394839554/4ed6b6762df03678f115056813b339b6.webp) 如果把\[4:3\]设置成0,就是±250。以此类推。 典型值为0x18,转换为二进制是00011000,\[4:3\]是11,转换十进制是3,即角速度传感器是2000 ![](https://file.jishuzhan.net/article/1732620609394839554/3ffcc79f48100221035af59776ca35c6.webp) 上方选中的寄存器是用来存放加速度和角速度传感器的测量结果的。 3B和3C是存放X轴加速度的结果的,MPU6050测量的加速度的值是16位的,高位存放在ACCEL_XOUT_H,低位存放在ACCEL_XOUT_L。后面依次类推。 41和42是存放温度的结果的,MPU6050测量的加速度的值是16位的,高位存放在ACCEL_XOUT_H,低位存放在ACCEL_XOUT_L。 43和44是存放X轴角速度的结果的,MPU6050测量的加速度的值是16位的,高位存放在GYRO_XOUT_H,低位存放在GYRO_XOUT_L。后面以此类推。 ![](https://file.jishuzhan.net/article/1732620609394839554/ec5d7b4857bb3ea549653047350df1fb.webp) ![](https://file.jishuzhan.net/article/1732620609394839554/84e34e5f35abb1c444381d5283f32a94.webp) MPU6050的IIC地址有两个,一个0x68一个0x69,他的地址由ADO决定,ADO的引脚接到低电平就是0,接到高电平就是1。(为了避免和其他芯片的地址冲突,所以设计成两个地址可选) ![](https://file.jishuzhan.net/article/1732620609394839554/f619061817a5b2423427489319c7566b.webp) ## 四、MPU6050寄存器读写时序 ### 4.1 向MPU6050的一个寄存器写一个字节的数据 MPU6050只能作为从机。 ![](https://file.jishuzhan.net/article/1732620609394839554/cc00c7d5c926a620712fa4f22cab4124.webp) 1.主机(Exynos4412)发送起始信号 2.主机发送从机地址(MPU6050的地址)及读写方向(写) 3.从机(MPU6050)发送应答信号 4.主机发送一个字节数据**(要写的寄存器的地址)** 5.从机发送应答信号 6.主机发送一个字节数据(要写到寄存器的**数据**) 7.从机发送应答信号 8.主机发送停止信号 ### 4.2 从MPU6050的一个寄存器读一个字节的数据 ![](https://file.jishuzhan.net/article/1732620609394839554/e663b70cbc1047ac20ca4694d34a9e71.webp) 1.主机(Exynos4412)发送起始信号 2.主机发送从机地址(MPU6050的地址)及读写方向**(写)** 3.从机(MPU6050)发送应答信号 4.主机发送一个字节数据**(要写的寄存器的地址)** 5.从机发送应答信号 6.主机(Exynos4412)发送起始信号 7.主机发送从机地址(MPU6050的地址)及读写方向(读) 8.从机(MPU6050)发送应答信号 9.从机发送一个字节数据(要读的寄存器中的数据) 10.主机发送**非应答**信号(不再接收更多的数据) 11.主机发送停止信号

相关推荐
海水变蓝、1 小时前
巧用sort
经验分享·笔记·java-ee·课程设计
风123456789~1 小时前
【项目管理】第6章 信息管理概论 --知识点整理
笔记·项目管理·软考·高项
丶Darling.1 小时前
深度学习与神经网络 | 邱锡鹏 | 第二章学习笔记
深度学习·神经网络·学习
无涯学徒19982 小时前
G1学习打卡
学习
要天天开心啊2 小时前
mybatis的第五天学习笔记
笔记·学习·mybatis
阿超爱嵌入式2 小时前
STM32学习之ARM内核自带的中断
arm开发·stm32·学习
切图只会helloworld2 小时前
SpringBoot基本教程
笔记
受之以蒙2 小时前
Rust 宏全解析:从基础到实战,掌握代码生成魔法
前端·笔记·rust
互联网上的猪2 小时前
excel常见错误包括(#N/A、#VALUE!、#REF!、#DIV/0!、#NUM!、#NAME?、#NULL! )
笔记·学习·excel