以对读取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通信以及源码解析(如何使用)相关推荐

  1. 0. DRF之软件开发模式CBV源码解析

    文章目录 1. Web应用模式 1.1 动/静态页面 1.2 前后端不分离 1. 3前后端分离 1.4 JSON/XML数据格式 1. json格式 2. xml格式 1.5 服务器页面后缀 2. A ...

  2. python函数主要通过接口与外界通信_PySpark源码解析,用Python调用高效Scala接口,搞定大规模数据分析...

    机器之心专栏 作者:汇量科技-陈绪 相较于Scala语言而言,Python具有其独有的优势及广泛应用性,因此Spark也推出了PySpark,在框架上提供了利用Python语言的接口,为数据科学家使用 ...

  3. 跳一跳python辅助软件思路及源码解析

    跳一跳python辅助软件思路及图像识别源码解析 本文将梳理github上最火的wechat_jump_game的实现思路,并解析其图像处理部分源码 首先废话少说先看效果 核心思想 获取棋子到下一个方 ...

  4. [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算

    [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 文章目录 [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 0x1. ...

  5. [源码解析] TensorFlow 分布式之 ClusterCoordinator

    [源码解析] TensorFlow 分布式之 ClusterCoordinator 文章目录 [源码解析] TensorFlow 分布式之 ClusterCoordinator 1. 思路 1.1 使 ...

  6. 软件工程通信录管理系统c语言,软件工程设计管理系统附源码.doc

    软件工程设计管理系统附源码 学 年 设 计 课程名称: 软件工程学年设计 实验项目: 通讯录管理系统 姓 名: XXX 专 业: 计算机科学与技术 班 级: XXX班 学 号: XXX 指导教师 XX ...

  7. Android之EasyPermissions源码解析

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! 前言 我们知道在Android中想要申请权限就需要在AndroidManifest ...

  8. Tomcat8源码解析

    Tomcat8源码解析 Tomcat总体架构 Connector:开启Socket并监听客户端请求,返回响应数据: Container:负责具体的请求处理: 一个Service负责维护多个Connec ...

  9. 《OV4689摄像头模组驱动源码解析》

    <OV4689摄像头模组驱动源码解析> OV4689是一款广泛应用于工业.安防等领域的高清图像传感器.在这篇文章中,我们将介绍如何在单片机上使用OV4689模组,并提供相应的驱动源码. O ...

最新文章

  1. 一笔画 (25 分)
  2. java实现生产者消费者问题(转)
  3. (0092)iOS开发AVAudioRecorder录制音频
  4. html jquery ajax乱码问题,jquery使用ajax提交中文乱码问题的解决
  5. amazon linux 安装nginx,linux – NGINX不显示Amazon EC2实例上的默认页...
  6. 正则只能出现特定字符_python正则表达式的简单使用总结
  7. 通过示例学 Golang 2020 中文版【翻译完成】
  8. 更小的刘海和更宽的5G天线,下一代iPhone你期待吗?
  9. mysql孤立锁_SQL Server解决孤立用户浅析
  10. mysql crc16_MySQL 5.6 中TIMESTAMP with implicit DEFAULT value is deprecated错误
  11. oracle找出大于1g的表,表占用太大空间问题!
  12. CRNN+CTC (基于CTPN 的end-to-end OCR)
  13. 老板凭啥提拔你:如何得到老板赏识
  14. php商品详情显示页面代码,ecshop源码程序在购物车页面显示出商品的描述
  15. PHP服装网店管理系统
  16. “迷你版迪士尼乐园”是怎样炼成的?
  17. 服务器CRT显示不全,CRT显示器显示画面不正常常见原因揭密
  18. digispark使用
  19. Sonarqube基础篇:property设定
  20. 机器学习实例-决策树和随机森林预测员工离职率

热门文章

  1. Advanced Exploit Techique之--frame faking技术http://ntbgyz.com/articles/200602/851.html
  2. acme.sh 生成免费证书,维护证书
  3. MK-TD环保型铝合金脱模剂
  4. Android感应检测Sensor(简单介绍),Android系统面试题
  5. 考计算机软考还需要评定职称吗,软考评职称还需要年限吗
  6. 第一天-电商行业的背景,淘淘商城的介绍,搭建项目工程,svn的使用
  7. 100的阶乘末尾有多少个零
  8. Java毕设项目星光在线光影系统计算机(附源码+系统+数据库+LW)
  9. 记录一次linux内网完整渗透测试
  10. python丨输入出生日期计算自己年龄