51单片机——I2C总线

单片机——I2C


宗旨:技术的学习是有限的,分享的精神是无限的。


        UART 属于异步通信,比如电脑发送给单片机,电脑只负责把数据通过TXD 发送出来即可,接收数据是单片机自己的事情。而 I2C 属于同步通信, SCL 时钟线负责收发双方的时钟节拍, SDA 数据线负责传输数据。 I2C 的发送方和接收方都以 SCL 这个时钟节拍为基准进行数据的发送和接收。

        I2C总线包括SCL,SDA 两根信号线,其中SCL是时钟线,SDA是数据线。


1、起始信号

        UART 通信是从一直持续的高电平出现一个低电平标志起始位;而 I2C 通信的起始信号的定义是 SCL 为高电平期间, SDA 由高电平向低电平变化产生一个下降沿,表示起始信号。

 

2、数据传输

       UART 是低位在前,高位在后;而 I2C 通信是高位在前,低位在后。UART 通信数据位是固定长度,波特率分之一,一位一位固定时间发送完毕就可以了。而 I2C 没有固定波特率,但是有时序的要求,要求当 SCL 在低电平的时候, SDA 允许变化。

 

3、停止信号

        UART 通信的停止位是一位固定的高电平信号; 而 I2C 通信停止信号的定义是 SCL 为高电平期间, SDA 由低电平向高电平变化产生一个上升沿,表示结束信号。

 

4、写完从器件之后等待从器件的应答

         在主器件完成对从器件的写操作时候(每次会有一个字节的数据),主器件会等待从器件发送指示信号,这个指示信号是说从器件已经接受到了主器件的数据,这是由从器件的硬件来完成的,不需要主器件来软件操作,只需要等待;

 

5、主器件读完数据后向从器件发送应答信号

         这其实包括两种情况,一种是主器件读完后还要继续读就要发送一个继续读的信号(其实就是发送0),另一种就是不再继续读了,就要发送停止读信号(其实就是发送1)。

 

6I2C寻址模式

        I2C 通信的起始信号(Start)后,首先要发送一个从机的地址,这个地址一共有 7位,紧跟着的第 8 位是数据方向位(R/W),“ 0”表示接下来要发送数据(写),‘“ 1”表示接下来是请求数据(读)。第九位 ACK应答。 

#include<reg52.h>
#include<intrins.h>#define I2CDelay()  {_nop_();_nop_();_nop_();_nop_();}
sbit I2C_SCL = P3 ^ 7;
sbit I2C_SDA = P3 ^ 6;/* 产生总线起始信号 */
void I2CStart()
{I2C_SDA = 1; //首先确保SDA、SCL都是高电平I2C_SCL = 1;I2CDelay();I2C_SDA = 0; //先拉低SDAI2CDelay();I2C_SCL = 0; //再拉低SCL
}
/* 产生总线停止信号 */
void I2CStop()
{I2C_SCL = 0; //首先确保SDA、SCL都是低电平I2C_SDA = 0;I2CDelay();I2C_SCL = 1; //先拉高SCLI2CDelay();I2C_SDA = 1; //再拉高SDAI2CDelay();
}
/* I2C总线写操作,dat-待写入字节,返回值-从机应答位的值 */
bit I2CWrite(unsigned char dat)
{bit ack; //用于暂存应答位的值unsigned char mask;  //用于探测字节内某一位值的掩码变量for (mask = 0x80; mask != 0; mask >>= 1) //从高位到低位依次进行{if ((mask & dat) == 0) //该位的值输出到SDA上{I2C_SDA = 0;}else{I2C_SDA = 1;}I2CDelay();I2C_SCL = 1;          //拉高SCLI2CDelay();I2C_SCL = 0;          //再拉低SCL,完成一个位周期}I2C_SDA = 1;   //8位数据发送完后,主机释放SDA,以检测从机应答I2CDelay();I2C_SCL = 1;   //拉高SCLack = I2C_SDA; //读取此时的SDA值,即为从机的应答值I2CDelay();I2C_SCL = 0;   //再拉低SCL完成应答位,并保持住总线return (~ack); //应答值取反以符合通常的逻辑://0=不存在或忙或写入失败,1=存在且空闲或写入成功
}
/* I2C总线读操作,并发送非应答信号,返回值-读到的字节 */
unsigned char I2CReadNAK()
{unsigned char mask;unsigned char dat;I2C_SDA = 1;  //首先确保主机释放SDAfor (mask = 0x80; mask != 0; mask >>= 1) //从高位到低位依次进行{I2CDelay();I2C_SCL = 1;      //拉高SCLif(I2C_SDA == 0)  //读取SDA的值{dat &= ~mask;  //为0时,dat中对应位清零}else{dat |= mask;  //为1时,dat中对应位置1}I2CDelay();I2C_SCL = 0;      //再拉低SCL,以使从机发送出下一位}I2C_SDA = 1;   //8位数据发送完后,拉高SDA,发送非应答信号I2CDelay();I2C_SCL = 1;   //拉高SCLI2CDelay();I2C_SCL = 0;   //再拉低SCL完成非应答位,并保持住总线return dat;
}
/* I2C总线读操作,并发送应答信号,返回值-读到的字节 */
unsigned char I2CReadACK()
{unsigned char mask;unsigned char dat;I2C_SDA = 1;  //首先确保主机释放SDAfor (mask = 0x80; mask != 0; mask >>= 1) //从高位到低位依次进行{I2CDelay();I2C_SCL = 1;      //拉高SCLif(I2C_SDA == 0)  //读取SDA的值{dat &= ~mask;  //为0时,dat中对应位清零}else{dat |= mask;  //为1时,dat中对应位置1}I2CDelay();I2C_SCL = 0;      //再拉低SCL,以使从机发送出下一位}I2C_SDA = 0;   //8位数据发送完后,拉低SDA,发送应答信号I2CDelay();I2C_SCL = 1;   //拉高SCLI2CDelay();I2C_SCL = 0;   //再拉低SCL完成应答位,并保持住总线return dat;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

物联网开发者被疯抢,华为做了什么?

5G时代到来&#xff0c;物联网技术的应用也离我们越来越近。智慧交通、智能家庭、智慧园区&#xff0c;越来越多的融入到我们的生活当中。所以&#xff0c;对于开发者而言&#xff0c;物联网将是未来发展的一大蓝海领域。但国内物联网人才短缺&#xff0c;每年人才缺口达百万之…

VMware 安装kali——linux

学习信息安全需要安装kali-linux,会遇到许多问题&#xff0c;如下&#xff1a; 1、版本问题 需要注意自己多用软件和电脑操作系统是否是一致版本&#xff0c;有些是可以安装但是不能运行。 2、安装过程选择错误的选项 我们创建新的虚拟机&#xff0c;这时&#xff0c;选择自定…

FreeRTOS及其应用,万字长文,基础入门

嵌入式系统不只是ARMLinux&#xff0c;不是只有安卓&#xff0c;凡是电子产品都可称为嵌入式系统。物联网行业的兴起&#xff0c;也提升了FreeRTOS市场占有率。本文就是介绍FreeRTOS基础及其应用&#xff0c;只是个人整理&#xff0c;可能存在问题&#xff0c;其目的只是简要介…

从中工毕业到年薪30万,我用了2年9个月

1夜色如潮水一般淹没了这座城市。我蹲在阳台&#xff0c;问我的死党&#xff0c;你说我的第一篇文章&#xff0c;起个什么样的标题才足够吸引人&#xff0c;让人想点开看看呢&#xff1f;死党从床上的帘子里探出头来说&#xff0c;UC震惊部啊&#xff0c;屡试不爽&#xff0c;况…

51单片机——LCD1602

单片机——1602液晶 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、1602液晶读写时序 &#xff08;1&#xff09;、读状态 RSL&#xff0c;R/WH&#xff0c;EH。(判断忙完毕后释放总线) &#xff08;2&#xff09;、读数据 RSH&#xff0c;R/WH&a…

recovery模式下支持ADB连接和串口操作

前言Android平台下我们有时候会进入recovery下做一些操作&#xff0c;不管是通过ADB连接还是通过串口操作&#xff0c;都需要你的平台支持&#xff0c;不支持的话可以按照我们这篇文章进行修改。正文ADB连接进入recovery后&#xff0c;我通过ADB连接会有如下报错exec "/sy…

Get busy living or get busy dying

好久不看大片了&#xff0c;今天花了一些时间仔细看了一遍《肖申克的救赎》&#xff0c;应该是很仔细的看了一遍&#xff0c;这个影片真的震撼心灵&#xff0c;“Get busy living or get busy dying.”&#xff08;忙着活&#xff0c;还是忙着死&#xff09;是安迪最重要的一句…

买房这件小事

终于有时间再来讨论这个问题&#xff0c;可能因为在深圳&#xff0c;每次说这个问题时都挺热闹的。— — 为什么想买房&#xff1f;人很奇怪&#xff0c;也很自知&#xff0c;我在上学的时候从来没有过这样大胆的想法。后来突然想买房&#xff0c;一个原因是自己有钱了&#xf…

51单片机——DS18B20

单片机——DS18B20 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 DS18B20——温度传感器&#xff0c;单片机可以通过 1-Wire 和 DS18B20 进行通 信&#xff0c;最终将温度读出。1-Wire 总线的硬件接口很简单&#xff0c;只需要把 18B20 的数据引脚和单…

房价是不是泡沫?

日本买房这件小事记&#xff0c;我在深圳买房继上一篇文章之后&#xff0c;有人说我没有了解中国房地产的历史&#xff0c;就公然写房产的文章。确实&#xff0c;我没有去搜刮很多历史的数据和文章来佐证&#xff0c;也没有引用什么大家之谈&#xff0c;很多都是自己经历的一些…

用Metasploit破解ftp用户名和密码

Metasploit是渗透测试人员在世界各地的资源和工具&#xff0c;比较常用的命令&#xff1a; msfconsole——直接进入 show options——查看 set RHOSTS ip地址/段 use 路径 需要在虚拟机的2003版本下创建FTP服务 将字典密码文件加入到虚拟机的系统里边 命令 ——rz 查看ftp是…

PWM实现语音播放原理

采用PWM进行播放语音原理1.概述2.声音原理3.DAC产生声音的原理是什么4.PWM又是如何实现的DAC的5.PWM的频率与底噪的关系6.PWM音乐曲目解析7.后续1.概述大多数微控制器上播放音频都是采用DAC进行输出&#xff0c;因为微控制器上都不会去带CODEC编解码芯片&#xff0c;但是DAC不是…

CTF 这个看起来有点简单

这个看起来有点简单分值&#xff1a;10 来源&#xff1a; 西普学院难度&#xff1a;易 很明显。过年过节不送礼&#xff0c;送礼就送这个 格式&#xff1a; 解题链接&#xff1a; http://ctf5.shiyanbar.com/8/index.php?id1 解法&#xff1a; 1.手工注入 id1 id1 and 11 id…

操作系统,你搞定了没?

#书籍赠送操作系统一直是比较难学的知识&#xff0c;要学好操作系统的相关内容&#xff0c;需要对硬件、软件、宏观、微观、有非常深刻的理解&#xff0c;而能找到一本讲解比较好的书籍也是非常难得的&#xff0c;恰好&#xff0c;最近有出版社的朋友推荐了这样的一本书籍&…

webcast(利用sharepoint Designer 定制 Office SharePoint Server 2007)学习笔记

讲 师:侯钟雷 微软特约讲师 北京易学育通科技发展有限公司时 间:90 分钟 下载地址:下载地址(需先注册,不过很快)讲座内容&#xff1a;SharePoint Designer是原Frontpage网页工具的演进版本&#xff0c;除了保持了原有强大的功能外&#xff0c;更增加了对SharePoint技术的…

C++ 的几个for 循环,范围for语句

我认为做嵌入式开发也需要学习C开发&#xff0c;可能我们学习的不只是一种编程语言&#xff0c;而是一种编程思想&#xff0c;C相对于C语言来说&#xff0c;会需要更多的想象力&#xff0c;原因就是C的特点太多了。不过&#xff0c;我们可以通过学习C的知识&#xff0c;来掌握面…

​我敢说,这是最全的常用设计模式汇总

今天&#xff0c;想跟大家聊聊代码能力的提升。想起我刚入行那会&#xff0c;怀抱满腔激情&#xff0c;到处学热门框架&#xff0c;但实际上受限于公司体量和业务逻辑&#xff0c;其实往往用不上&#xff0c;时间久了&#xff0c;不用就忘记了&#xff0c;于是在日复一日的工作…

Meterpreter Guide

转载&#xff1a;http://wooyun.jozxing.cc/static/drops/tips-10146.html 0x01 入门篇(生成与接收) 功能介绍 msfpayload和msfencode已经被时代淘汰了现在都转为msfvenom了 msfvenom命令行选项如下&#xff1a;Options:-p, --payload payload> 指定需要使用的…

跟老肖聊天

今天跟一个创业的朋友老肖聊天&#xff0c;聊完之后有点沉重老肖是我的朋友&#xff0c;我讲的都是基于真实的内容&#xff0c;如果觉得我是吹牛或者过分如何&#xff0c;可以绕道&#xff0c;也请嘴下留情。老肖因为公司不景气&#xff0c;这两天出去面试&#xff0c;面试了三…

SSM中(Spring-SpringMVC-Mybatis)(一:概念)

一&#xff1a;Spring&#xff1a; 参照我的另一篇博客&#xff1a; http://www.cnblogs.com/GH0522/p/8127530.html 二:SpringMVC: 流程图&#xff1a; SpringMVC接口解释 DispatcherServlet&#xff1a; Spring提供的前端控制器&#xff0c;所有的请求都有经过它来统一分…