软件IIC通信以及源码解析(如何使用)
以对读取MPU6050为例,解析如何采用IIC通信源码。
IIC的的通信,通常三种用途读写。分为:
1:
2:
3:
注:其中最常用的就是1和3了。
对1进行讲解:
指定地址写,通常用作对状态机模块的控制寄存器写入二进制数,操作控制寄存器,进而让模块进行我们需要的功能。
分为三个步骤:
1:发送 从机地址+读写位(因为是写,所以是从机地址+写(写=0))
2:发送(要写)要操作的寄存器地址。
3:写入你想发送的八位数据(该八位数据用来控制寄存器功能)。
时序图如下:
源码如下(以读取MPU6050为例,如果读取其它从机,只要把从机地址改了即可。):
软件IIC.C文件
#define MPU6050_ADDRESS 0xD0 //1101 0000= AD0(1101000)+ 0 :融入了写数据位: 0//写数据给从机的指定寄存器 参数1:要写入的地址 参数2:要写入的八位数据
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{MyI2C_Start(); //起始条件MyI2C_SendByte(MPU6050_ADDRESS); //写入从机地址MyI2C_ReceiveAck(); //从机应答MyI2C_SendByte(RegAddress); //发送写入的寄存器地址MyI2C_ReceiveAck(); // 从机应答MyI2C_SendByte(Data); //发送一个字节数据MyI2C_ReceiveAck(); //从机应答//可加For循环多读MyI2C_Stop(); //停止条件
}
对3进行讲解:
指定地址读,通常用做读取状态寄存器标志位的值。或者读取数据寄存器的值。
步骤如下:
1:发送 从机地址+读写位(因为读之前必须先写入从机地址,所以是从机地址+写(写=0))
2:发送(要读)要操作的寄存器地址。
3:重复1的步骤,不过这次是从机地址+读。
4:接受从机的寄存器发送来的数据。
时序图如下:
IIC.h文件如下:(注释均已做详细说明)
//从从机指定寄存器中读数据 参数:要读的数据地址
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{uint8_t Data;MyI2C_Start(); //起始条件MyI2C_SendByte(MPU6050_ADDRESS); //写入从机地址包含写操作MyI2C_ReceiveAck(); //从机应答0 有该地址MyI2C_SendByte(RegAddress); //发送(写)需要读的寄存器地址MyI2C_ReceiveAck(); // 从机应答0有该地址MyI2C_Start(); //重新起始条件MyI2C_SendByte(MPU6050_ADDRESS | 0x01); //发送需要读的寄存器地址包含读操作MyI2C_ReceiveAck(); //从机应答0 Data = MyI2C_ReceiveByte(); //开始接受(读指定地址)从机数据MyI2C_SendAck(1); 主机应答1MyI2C_Stop(); //停止条件return Data;
}
两部分的IIC.H文件函数原型如下:
#ifndef __MPU6050_H
#define __MPU6050_Hvoid MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data);
uint8_t MPU6050_ReadReg(uint8_t RegAddress);#endif
读取mpu6050六轴数据为例。实例如下(读取其它传感器框架流程基本一样):
首先我们读取从机地址。用来测试IIC通信是否可行。
uint8_t MPU6050_GetID(void)
{return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}
其次需要对mpu6050模块的功能寄存器进行写,这样就配置好传感器的功能了,也就是传感器供能初始化。
代码如下:
void MPU6050_Init(void)
{MyI2C_Init();MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01); //配置电源管理寄存器1 :解除睡眠状态MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00); //配置电源管理寄存器2MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09); //配置采样率分频:ADC转换数据的快慢MPU6050_WriteReg(MPU6050_CONFIG, 0x06); //配置寄存器MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18); //陀螺仪配置寄存器 :量程选择最大16gMPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);//加速度计配置寄存器 :量程选择最大
}
最后我们就可以读取数据寄存器的数据了(因为配置好功能寄存器了,所以数据寄存器开始产生数据)。
代码如下(采用指针传参,可以节省内存):
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{uint8_t DataH, DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H); //读取加速度寄存器的高8位DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L); //读取加速度寄存器的低8位*AccX = (DataH << 8) | DataL; // *AccX = (DataH << 8) | DataL; :将数据传给该地址下的变量中 :重点DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);*AccY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);*AccZ = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);*GyroX = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);*GyroY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);*GyroZ = (DataH << 8) | DataL;
}
完整的main.c如下:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "MPU6050.h"uint8_t ID;
int16_t AX, AY, AZ, GX, GY, GZ;int main(void)
{OLED_Init();MPU6050_Init();OLED_ShowString(1, 1, "ID:");ID = MPU6050_GetID();OLED_ShowHexNum(1, 4, ID, 2);while (1){MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);OLED_ShowSignedNum(2, 1, AX, 5);OLED_ShowSignedNum(3, 1, AY, 5);OLED_ShowSignedNum(4, 1, AZ, 5);OLED_ShowSignedNum(2, 8, GX, 5);OLED_ShowSignedNum(3, 8, GY, 5);OLED_ShowSignedNum(4, 8, GZ, 5);}
}
软件IIC通信以及源码解析(如何使用)相关推荐
- 0. DRF之软件开发模式CBV源码解析
文章目录 1. Web应用模式 1.1 动/静态页面 1.2 前后端不分离 1. 3前后端分离 1.4 JSON/XML数据格式 1. json格式 2. xml格式 1.5 服务器页面后缀 2. A ...
- python函数主要通过接口与外界通信_PySpark源码解析,用Python调用高效Scala接口,搞定大规模数据分析...
机器之心专栏 作者:汇量科技-陈绪 相较于Scala语言而言,Python具有其独有的优势及广泛应用性,因此Spark也推出了PySpark,在框架上提供了利用Python语言的接口,为数据科学家使用 ...
- 跳一跳python辅助软件思路及源码解析
跳一跳python辅助软件思路及图像识别源码解析 本文将梳理github上最火的wechat_jump_game的实现思路,并解析其图像处理部分源码 首先废话少说先看效果 核心思想 获取棋子到下一个方 ...
- [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算
[源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 文章目录 [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 0x1. ...
- [源码解析] TensorFlow 分布式之 ClusterCoordinator
[源码解析] TensorFlow 分布式之 ClusterCoordinator 文章目录 [源码解析] TensorFlow 分布式之 ClusterCoordinator 1. 思路 1.1 使 ...
- 软件工程通信录管理系统c语言,软件工程设计管理系统附源码.doc
软件工程设计管理系统附源码 学 年 设 计 课程名称: 软件工程学年设计 实验项目: 通讯录管理系统 姓 名: XXX 专 业: 计算机科学与技术 班 级: XXX班 学 号: XXX 指导教师 XX ...
- Android之EasyPermissions源码解析
转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 我们知道在Android中想要申请权限就需要在AndroidManifest ...
- Tomcat8源码解析
Tomcat8源码解析 Tomcat总体架构 Connector:开启Socket并监听客户端请求,返回响应数据: Container:负责具体的请求处理: 一个Service负责维护多个Connec ...
- 《OV4689摄像头模组驱动源码解析》
<OV4689摄像头模组驱动源码解析> OV4689是一款广泛应用于工业.安防等领域的高清图像传感器.在这篇文章中,我们将介绍如何在单片机上使用OV4689模组,并提供相应的驱动源码. O ...
最新文章
- 一笔画 (25 分)
- java实现生产者消费者问题(转)
- (0092)iOS开发AVAudioRecorder录制音频
- html jquery ajax乱码问题,jquery使用ajax提交中文乱码问题的解决
- amazon linux 安装nginx,linux – NGINX不显示Amazon EC2实例上的默认页...
- 正则只能出现特定字符_python正则表达式的简单使用总结
- 通过示例学 Golang 2020 中文版【翻译完成】
- 更小的刘海和更宽的5G天线,下一代iPhone你期待吗?
- mysql孤立锁_SQL Server解决孤立用户浅析
- mysql crc16_MySQL 5.6 中TIMESTAMP with implicit DEFAULT value is deprecated错误
- oracle找出大于1g的表,表占用太大空间问题!
- CRNN+CTC (基于CTPN 的end-to-end OCR)
- 老板凭啥提拔你:如何得到老板赏识
- php商品详情显示页面代码,ecshop源码程序在购物车页面显示出商品的描述
- PHP服装网店管理系统
- “迷你版迪士尼乐园”是怎样炼成的?
- 服务器CRT显示不全,CRT显示器显示画面不正常常见原因揭密
- digispark使用
- Sonarqube基础篇:property设定
- 机器学习实例-决策树和随机森林预测员工离职率
热门文章
- Advanced Exploit Techique之--frame faking技术http://ntbgyz.com/articles/200602/851.html
- acme.sh 生成免费证书,维护证书
- MK-TD环保型铝合金脱模剂
- Android感应检测Sensor(简单介绍),Android系统面试题
- 考计算机软考还需要评定职称吗,软考评职称还需要年限吗
- 第一天-电商行业的背景,淘淘商城的介绍,搭建项目工程,svn的使用
- 100的阶乘末尾有多少个零
- Java毕设项目星光在线光影系统计算机(附源码+系统+数据库+LW)
- 记录一次linux内网完整渗透测试
- python丨输入出生日期计算自己年龄