由于用mpu6050模块,所以要用上i2c通信原理。
i2c通信原理
i2c总线只有两根双向信号线,一根是数据线SDA,一根是时钟线SCL。
每个接到i2c总线上的器件都有唯一的地址,主机与其他器件之间的数据传送可以是由主机发送给其他器件。主机为发送器,从机为接收器。在80c51单片机系统中,通常80C51单片机为主机,
1:数据位的有效规定:
1.1:总线在进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,时钟线为低电平期间时,数据线上的高电平和低电平才能允许变化。
1.2:起始信号和终止信号都是由主机发出的,起始信号产生后,总线就处于占用状态;终止信号产生后,总线就处于空闲状态
1.3:连接到i2c总线上的上的器件,若具有i2c总线的硬件接口,则很容易检测到起始和终止信号。接收器件在接收到一个完整的数据字节后,有可能需要完成一些其他的工作,如处理内部中断函数等,不能立即接收下一个字节数据,这时,接收器件可以将SCL时钟线拉成低电平,从而使主机处于等待状态,等到接收器准备好接收下一个字节后,再释放SCL时钟线,使之为高电平,从而数据传送继续进行。
2:数据传送格式:
2.1:字节传送与应答
每一个字节必须保证是8位长度,数据传送时,先传送最高位,每一个被传送字节后面都必须跟随一个应答位(即一个数据帧有9位),由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据,它必须将数据线SDA置于高电平,主机产生一个终止信号以结束总线的数据传送。如果从机对主机进行了应答,但在接收数据一段时间后无法接收更多的数据,从机可通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号,这个信号是对从机的非应答来实现的,然后从机释放数据线SDA,以允许主机产生终止信号。
2.2:数据帧格式
i2c总线上的数据信号是广义的。既包括地址信号,又包括真正的数据信号。在起始信号产生后,必须传送一个从机的地址(7位),第8位是数据传送的方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R),每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
2.3:数据传送过程中几种组合方式
A表示应答,A非表示非应答(高电平),S表示起始信号,P表示终止信号
a:主机向从机发送数据,数据传送方向在整个传送过程中不变
主机S -> 从机地址 -> 0 -> 从机A -> 主机发数据 -> 从机A -> 主机发数据 -> 从机A非 -> 主机P
b:主机在第一个字节后,立即从从机读数据
主机S -> 从机地址 -> 1 -> 从机A -> 从机发数据 ->主机A -> 从机发数据 ->主机A非 -> 主机P
c:在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好相反
主机S -> 从机地址 -> 0 -> 从机A -> 主机发数据 ->从机A或A非 -> 主机S->从机地址 -> 1 -> 从机A ->从机发数据 -> 主机A非-> 主机 P
3:总线的寻址
3.1:主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同则认为自己正被主机寻址,根据R/T位将自己确定为发送器或接收器。从机的地址由固定部分和可编程部分组成,在一个系统种可能希望接入多个相同的主机,从机地址中可编程部分决定了可接入总线该类器件的最大数目
3.2:典型信号模拟:
(1)数据线状态函数:
u8 funcGetI2CStatus(void)
{
return I2C_sda;
}
(2)起始信号模拟函数:
u8 I_start(void )//起始信号模拟
{
SDAHigh(HIGH); /* SDA 为 高电平*/
I2C_delay(); /* SDA 稳定 */
SCLHigh(HIGH); /* SCL 为高电平*/
I2C_delay();
if(!funcGetI2CStatus())
{
return I2C_BUS_BUSY;
}
SDAHigh(LOW); /* SDA 产生下降沿*/
I2C_delay();
SCLHigh(LOW);
I2C_delay();
if(funcGetI2CStatus())
{
return I2C_BUS_ERROR;
}
else
return I2C_BUS_READY;
}
(3)终止信号模拟函数
void I_stop(void)//终止信号模拟
{
SDAHigh(LOW);
I2C_delay();
SCLHigh(HIGH); /*SCL1 为高电平期间,SDA1产生一个上升沿*/
I2C_delay();
SDAHigh(HIGH);
}
(4)应答信号模拟函数
void I_ACK(void) //应答信号模拟
{
SDAHigh(LOW);
I2C_delay();
SCLHigh(HIGH);
I2C_delay();
SDAHigh(HIGH);
I2C_delay();
}
4.串行E2PROM的扩展:
4.1:写入过程:
单片机进行写操作时,首先发送该器件的7位地址码和和写方向位“0”,发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器件在确认是自己的地址后,在SDA线上产生一个应答信号作为相应,单片机收到应答后就可以传送数据了.传送数据时,单片机首先发送一个字节的被写入器件的存储区的首地址,收到存储器件的应答后,单片机就逐个发送各数据字节,但每发送一个字节后都要等待应答。
AT24C系列器件片内地址在接收到每一个数据字节地址后自动加1,在芯片的“一次装载字节数”(不同芯片字节数不同)限度内,只需输入首地址。装载字节数超过芯片的“一次装载数”时,数据地址将“上卷”,前面的数据将被覆盖。
当要写入的数据传送完后,单片机应发出终止信号以结束写入操作。写入n个字节的数据格式:
S ->主机发送器件地址+0->从机A->主机写入首地址-> 从机A -> 主机发送数据1-> 从机A ->...->主机发送数据n ->从机A ->主机发送P.
4.2:读出过程
单片机先发送该器件的7位地址码和写方向位“0”,发送完后释放SDA数据线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为回应。然后再发一个字节的要读出器件的存储区的首地址,收到应答后,单片机要重复一次起始信号并发出器件地址和读方向位(“1),收到器件应答后就可以读出数据字节,每读出一个字节,单片机都要回复应答信号。当最后一个字节数据读完后,单片机应返回以"非应答"(高电平),并发出终止信号以结束读操作。
S ->主机发送器件地址+0 ->从机A ->主机读出首地址 ->从机A -> 主机发送器件地址+1 -> 从机A ->从机发送数据 -> 主机A ->... ->从机发送数据n ->主机非应答 ->主机p.
4.3:移位操作
左移时最低位补0,最高位移入PSW的CY位。
右移时最高位保持原数,最低位移除。
由于用mpu6050模块,所以要用上i2c通信原理。的更多相关文章
- python之模块ftplib(实现ftp上传下载代码)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) f ...
- 海思NB-IOT模块HI2115芯片I2C通信
1. 首先确定硬件上I2C的引脚,手册上并没有,海思技术支持说是14和15脚,我们用的是12和13脚,问题在于,如果是硬件I2C应该不能随便换个引脚吧,难道是模拟的时序? 2. 下一个奇怪的地方,这个 ...
- TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)
作者:彭东林 邮箱:pengdonglin137@163.com 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M Na ...
- Java文件上传下载原理
文件上传下载原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp运行机制所决定的 文件上传原 ...
- u-boot-2018.09 DTS上 I2C节点的解析 (转)
这篇理下uboot上I2C总线挂载设备的整个流程. 其他总线(如SPI等)应是类同的思路. uboot 中,以max8997挂载到s3c24xx i2c总线为例, dts里面的写法如下 aliases ...
- 基于Nginx dyups模块的站点动态上下线并实现简单服务治理
简介 今天主要讨论一下,对于分布式服务,站点如何平滑的上下线问题. 分布式服务 在分布式服务下,我们会用nginx做负载均衡, 业务站点访问某服务站点的时候, 统一走nginx, 然后nginx根据一 ...
- 如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上)
当前进展: 一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计 ...
- opencv6.2-imgproc图像处理模块之图像尺寸上的操作及阈值
接opencv6.1-imgproc图像处理模块之平滑和形态学操作,顺带说一句在opencv中的in-place操作就是比如函数的输入图像和输出图像两个指针是相同的,那么就是in-place操作了.比 ...
- 跟我一起读postgresql源码(九)——Executor(查询执行模块之——Scan节点(上))
从前面介绍的可优化语句处理相关的背景知识.实现思想和执行流程,不难发现可优化语句执行的核心内容是对于各种计划节点的处理,由于使用了节点表示.递归调用.统一接口等设计,计划节点的功能相对独立.代码总体流 ...
随机推荐
- javaCV开发详解之技术杂烩:javaCV能帮我们做什么?能实现什么功能?ffmpeg和openCV能实现功能,javaCV如何做到更快、更简单的实现相应的功能?等等一堆实用话题
前言: 该篇文章旨在帮助刚接触javaCV的盆友系统的认识音视频.javaCV.图像处理相关的体系知识和一些实用的知识. 序: javaCV早期因为内置了openCV库,所以常用来做图像识别应用,现在 ...
- Nmap在实战中的高级用法
Nmap提供了四项基本功能(主机发现.端口扫描.服务与版本侦测.OS侦测)及丰富的脚本库.Nmap既能应用于简单的网络信息扫描,也能用在高级.复杂.特定的环境中:例如扫描互联网上大量的主机:绕开防火墙 ...
- iOS自定义弹出视图
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #78492a } p.p2 { margin: 0.0px 0. ...
- maven插件打包可执行jar
pom文件加 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</grou ...
- JS+PHP实现用户输入数字后取得最大的值并显示为第几个
目的:分清JS PHP的区别,拓宽思维 分析 1.利用JS的prompt输入用户想要输入的值. 2.利用HTML表单的text标签将输入的值传递给PHP处理文件 3.PHP进行数值判定,选出最大值和位 ...
- python 标准库 -- unittest
一. unittest 单元测试 编写单元测试 示例代码 : import unittest from flask import current_app from app import create_ ...
- PC版模块滚动不显示滚动条效果
以前对某个模块增加无滚动条的滚动效果,还需要找个插件才能实现,现在发现个简单方法,用普通的CSS就可以实现. 此方法只适用于不显示滚动条的滚动效果,如果需要自定义滚动条样式,还是需要插件来实现. HT ...
- 玩转spring boot——websocket
前言 QQ这类即时通讯工具多数是以桌面应用的方式存在.在没有websocket出现之前,如果开发一个网页版的即时通讯应用,则需要定时刷新页面或定时调用ajax请求,这无疑会加大服务器的负载和增加了客户 ...
- PS-前端切图教程(切jpg图和切png图)
微微一运功,把家底都抖出来了. 不过,作为一个设计出身的前端来说,摸ps就和摸键盘一样了 所以可能教程中还是有没用过ps的人看不懂的地方, 欢迎加群讨论:613512106... ---------- ...
- 保存Druid的监控记录
继上篇帖子之后 , 公司又要求将Druid Monitor的监控信息保存起来 , 因为Druid的监控记录在是缓存的,重启之后无法找回,所以需要做持久化,定期把监控记录转存到日志文件中 研究了半天 , ...