D23. IIC控制器和MPU6050-ARM体系结构与接口技术-嵌入式学习LV9

DAY23. IIC控制器和MPU6050

1. 4412下的IIC控制器

相关寄存器

要控制多主I2C总线操作,必须将值写入这些寄存器:

  1. 多主控I2C总线控制寄存器-I2CCON:控制IIC
  2. 多主控器I2C总线控制/状态寄存器-I2CSTAT:IIC状态
  3. 多主I2C总线Tx/Rx数据移位寄存器-I2CDS:发送和接收数据
  4. 多主I2C总线地址寄存器-I2CADD:设置IIC设备的地址

工作逻辑

image-20230905104959799

控制流程

主机发送模式

image-20230905110311398

image-20230905110350304

主机接收模式

image-20230905161539893

从机发送模式

image-20230905161717342

从机接收模式

image-20230905161748660

一般来说很少使用主机变从机使用

相关寄存器

image-20230905162352138

2. IIC寄存器详解

I2CCONn寄存器(n = 0 to 7)

控制IIC

image-20230905164456932

I2CSTATn寄存器(n = 0 to 7)

控制IIC功能和显示IIC状态

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

I2CADDn寄存器(n = 0 to 7)

设置IIC设备地址

一般当4412当成从机的时候才会用到

image-20230905165143911

I2CDSn寄存器(n = 0 to 7)

发送和接受移位寄存器

image-20230905165218562

I2CLCn寄存器(n = 0 to 7)

滤波相关的寄存器,这里用不到

image-20230905165238319

3. MPU6050原理

MPU6050是一个运动处理传感器,其内部集成了3轴加速度传感器 和3轴陀螺仪(角速度传感器),以及一个可扩展数字运动处理器

image-20230906154552156

MPU6050主要参数

  • 可测量X、Y、Z轴三个方向的角速度

  • 可编程设置角速度测量范围为±250、±500、±1000、±2000°/sec

  • 可测量X、Y、Z轴三个方向的加速度

  • 可编程设置加速度测量范围为±2g、±4g、±8g、±16g

  • 可编程设置低功耗模式

  • 可编程设置采样频率

  • … …

image-20230906154748824

MPU6050通信接口

MPU6050可以使用IIC总线和其他器件进行数据交互,我们可以使用

IIC总线向MPU6050中的控制寄存器写入数据来设置MPU6050的工作参数

也可以使用IIC总线从MPU6050中的数据寄存器读取数据来获取加速度、角速度等信息

image-20230906155136601

测量结果会放在相关的寄存器

通过修改寄存器来控制量程和各种参数

常用寄存器

/****************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    //存放X轴的加速度,16位数据,需要两个寄存器存放
#define	ACCEL_XOUT_L	0x3C

#define	ACCEL_YOUT_H	0x3D	//存放Y轴的加速度,16位数据,需要两个寄存器存放
#define	ACCEL_YOUT_L	0x3E

#define	ACCEL_ZOUT_H	0x3F	//存放Z轴的加速度,16位数据,需要两个寄存器存放
#define	ACCEL_ZOUT_L	0x40

#define	TEMP_OUT_H		0x41	//存放温度
#define	TEMP_OUT_L		0x42

#define	GYRO_XOUT_H		0x43	//存放X轴的角速度,16位数据,需要两个寄存器存放
#define	GYRO_XOUT_L		0x44

#define	GYRO_YOUT_H		0x45	//存放Y轴的角速度,16位数据,需要两个寄存器存放
#define	GYRO_YOUT_L		0x46

#define	GYRO_ZOUT_H		0x47	//存放Z轴的角速度,16位数据,需要两个寄存器存放
#define	GYRO_ZOUT_L		0x48

#define	PWR_MGMT_1		0x6B	//电源管理,典型值:0x00(正常启用)
#define	SlaveAddress	0x68	//MPU6050-I2C地址

4. MPU6050寄存器读写时序

向MPU6050的一个寄存器写一个字节的数据

image-20230906163116985

  1. 主机(Exynos4412)发送起始信号

  2. 主机发送从机地址(MPU6050的地址)及读写方向(写)

  3. 从机(MPU6050)发送应答信号

  4. 主机发送一个字节数据(要写的寄存器的地址)

  5. 从机发送应答信号

  6. 主机发送一个字节数据(要写到寄存器的数据)

  7. 从机发送应答信号

  8. 主机发送停止信号

从MPU6050的一个寄存器读一个字节的数据

image-20230906163232344

  1. 主机(Exynos4412)发送起始信号

  2. 主机发送从机地址(MPU6050的地址)及读写方向(写)

  3. 从机(MPU6050)发送应答信号

  4. 主机发送一个字节数据(要写的寄存器的地址)

  5. 从机发送应答信号

  6. 主机(Exynos4412)发送起始信号

  7. 主机发送从机地址(MPU6050的地址)及读写方向(读)

  8. 从机(MPU6050)发送应答信号

  9. 从机发送一个字节数据(要读的寄存器中的数据)

  10. 主机发送非应答信号(不再接收更多的数据)

  11. 主机发送停止信号

5. 作业

1.简述通过主机从MPU6050中的一个寄存器中读一个字节的数据的过程

1 主机(Exynos4412)发送起始信号
2 主机发送从机地址(MPU6050的地址)及读写方向(写)
3 从机(MPU6050)发送应答信号
4 主机发送一个字节数据(要写的寄存器的地址)
5 从机发送应答信号
6 主机(Exynos4412)发送起始信号
7 主机发送从机地址(MPU6050的地址)及读写方向(读)
8 从机(MPU6050)发送应答信号
9 从机发送一个字节数据(要读的寄存器中的数据)
10 主机发送非应答信号(不再接收更多的数据)
11 主机发送停止信号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉丸子QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值