IIC实验(lv9-day22-24)


前言

IIC总线是Philips公司在八十年代初推出的一种串行、半双工总线
主要用于近距离、低速的芯片之间的通信;IIC总线有两根双向的信号线一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;IIC总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用。

1 IIC

1.1 IIC原理

IIC总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;IIC总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器。


1.2 IIC通信过程

1.主机发送起始信号启用总线

2.主机发送一个字节数据指明从机地址和后续字节的传送方向
(前7位是从机的地址,第8位是数据传输方向)
在这里插入图片描述

3.被寻址的从机发送应答信号回应主机

4.发送器发送一个字节数据

5.接收器发送应答信号回应发送器
… … (循环步骤4、5)

n.通信完成后主机发送停止信号释放总线


1.3 IIC总线信号的实现

1.3.1 起始信号与终止信号

在这里插入图片描述

1.3.2 字节传送与应答信号

在这里插入图片描述

1.3.3同步信号

在这里插入图片描述


1.4 经典IIC时序

在这里插入图片描述
在这里插入图片描述


2 Exnos4412下的IIC控制器/寄存器

注:IIC在芯片手册的第29章

2.1 I2CCONn

在这里插入图片描述
第7位:决定是否允许产生应答信号,无论发送还是接收前,需置1
第6位:传输时时钟线分频,一般选置1
第5位:决定是否开启发送或接收结束时发通知,无论发送还是接收前,需置1
第4位:接收或发送是否完毕可以通过检查此位是否为1,接收或发送完毕后需置0

2.2 I2CSTATn

在这里插入图片描述
第6、7位:每次传输前需选择传输模式
第5位:置0产生将产生终止信号,传输前置1产生起始信号
第4位:使能数据输出,传输前需置1
I2CDS寄存器:数据寄存器,发送前被发送的数据存放处,接收后结果也从此处读取

2.3 I2CADDn

地址寄存器
在这里插入图片描述

2.4 I2CDSn

数据收发储存寄存器
在这里插入图片描述


3 MPU6050

3.1 MPU6050简介

MPU6050是一个运动处理传感器,其内部集成了3轴加速度传感器和3轴陀螺仪(角速度传感器),以及一个可扩展数字运动处理器.
MPU6050可以使用IIC总线和其他器件进行数据交互,我们可以使用IIC总线向MPU6050中的控制寄存器写入数据来设置MPU6050的工作参数也可以使用IIC总线从MPU6050中的数据寄存器读取数据来获取加速度、角速度等信息

3.2 MPU6050主要参数

在这里插入图片描述

3.3 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轴加速度高八位
#define ACCEL_XOUT_L 0x3C //x轴加速度低八位
#define ACCEL_YOUT_H 0x3D //y轴加速度高八位
#define ACCEL_YOUT_L 0x3E //y轴加速度低八位
#define ACCEL_ZOUT_H 0x3F //z轴加速度高八位
#define ACCEL_ZOUT_L 0x40 //z轴加速度低八位
#define TEMP_OUT_H 0x41 //温度高八位
#define TEMP_OUT_L 0x42 //温度低八位
#define GYRO_XOUT_H 0x43 //x轴角加速度高八位
#define GYRO_XOUT_L 0x44 //x轴角加速度低八位
#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地址

3.4 MPU6050 ICC地址

在这里插入图片描述 由上表可知MPU6050 ICC地址取决于AD0的电平 当AD0=0时 地址为1101000(0x68)
AD0=1时地址为1101001(0x69)
在这里插入图片描述
查4412的原理图,由原理图可知4412的MPU6050的AD0=0 所以地址为0x68。

3.5 MPU6050 寄存器读写时序

在这里插入图片描述
请添加图片描述

在这里插入图片描述请添加图片描述


4 实验代码


#include "exynos_4412.h"

/****************MPU6050内部寄存器地址****************/

#define	SMPLRT_DIV		0x19	//陀螺仪采样率,典型值:0x07(125Hz)
#define	CONFIG			0x1A	//低通滤波频率,典型值:0x06(5Hz)
#define	GYRO_CONFIG		0x1B	//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define	ACCEL_CONFIG	0x1C	//加速计自检、测量范围及高通滤波频率,典型值:0x18(不自检,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	WHO_AM_I		0x75	//IIC地址寄存器(默认数值0x68,只读)
#define	SlaveAddress	0x68	//MPU6050-I2C地址

/************************延时函数************************/

void mydelay_ms(int time)
{
   
	int i,j
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值