当前位置: 首页 > 编程日记 > 正文

iic通信原理_电子知识之IIC通信原理和协议分享

IIC 的一些特征:

两条总线:串行数据总线(SDA)和串行时钟总线(SCL)
真正的多主机总线
连接到相同总线的ic数量只受到总线的最大电容400pF限制。
串行8位双向数据在标准模式下可达100K bit/s
快速模式400K bit/s,高速模式下3.4Mbit/s.数据有效性规定:
IIC总线在进行数据传输时,SCL在高电平区间,SDA上的电平必须保持稳定
SDA的数据的高或者低电平状态只有在SCL线的时钟信号是低电平时才能改变。起始和停止条件:
起始:SCL高电平时,SDA由高电平向低电平切换。
停止:SCL高电平时,SDA由低电平向高电平切换。模拟时序如下:
起始与终止:

ebdae46a0b689b58ed4329fc769441b8.png


应答与非应答:

b8b50fb35c82c5ffbdb568ff291f17df.png


总线上进行一次数据传输的通信格式:

3060d0bf5c7ecc68bf0b4689dae30ca2.png


相关模拟时序的驱动函数:包括(start,stop,respons,write_byte,read_byte)
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//SCL高电平区间,SDA一个下降沿启动信号
void Start()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//SCL在高电平区间,SDA一个上升沿停止信号
void Stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//SCL在高电平区间,SDA被从设备拉低表示应答,
//(SDA==1)&&(i<255)表示如果一段时间未收到从期间
//的应答则默认从期间已经收到而不再等待应答信号
void Respons()
{
uchari=0;
SCL=1;
delay();
while((SDA==1)&&(i<255))
i++;
SCL=0;
delay();
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//CY 为PSW寄存器中的CY位
//先移位,然互使用SCL控制发出去
void Write_Byte(uchar date)
{
uchari,temp;
temp=tada;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//定义临时变量K,K左移一位后与SDA进行或运算,
//依次把8个独立地位放入一个字节中来接受完成
void Read_Byte()
{
uchari,k;
SCL=0;
delay();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay();
k=(k<<1)|SDA;
SCL=0;
delay();
}
delay();
returnk;
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
底层驱动完成以后,我们需要对实际的芯片使用通讯协议来进行操作。
目前大多的情况下一般比较受欢迎的是AT24cxx 系列。
AT24Cxx系列主要有: 以下系列:

15f81a7008cb3dac46fc32b095e4e99c.png

以下仅以AT24C02为例来进行说明:
AT24C02芯片地址为:1010,其控制字格式如下:

8ea0fb3a1e5d00a8d7f9ac249bcd1f09.png


其中A2,A1,A0为可编程选择地址,此处A2,A1,A0均接地,即000,
因此发送写信号的寻址字节为:10100000,即0XA0,
因此发送读信号的寻址字节为:10100001,即0XA1,


下图为写一个字节的数据格式,有图可知道:向AT24C02中写入一个字节的时候,需要:
先发一个起始信号,再发一个字节的控制字,
在发送一个字节的控制字地址,都得到应答信号后,
再发送要存入的数据,最后发一个停止信号!
So,一个字节的数据已经写入AT24C02中,OK!下面是数据格式,如图:

5505b2d8860cf9c9ff4a57c7115ccf6a.png


程序如下:
-----------------------------------------------------------------------------------------------------------------------
//任意地址,写入数据
void Write_Add(uchar address,uchar date)
{
Start();
Write_Byte(0xA0);
Respons();
Write_Byte(address);
Respons();
Write_Byte(date);
Respons();
Stop
}
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
下图为读一个字节的数据格式,其读取一个字节的数据和写入时候差不多,此处不再累赘,读一字节数据格式如图:

32cbd2f098b1da14ac3659fe029eebfb.png

程序如下:
-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------
//任意地址,读出数据
void Read_Add(uchar address)
{
uchardate;
Start();
Write_Byte(0XA0);
Respons();
Write_Byte(address);
Respons();
Start();
Write_Byte(0XA1);
Respons();
date=Read_Byte();
Stop();
returnbyte;
}

相关文章:

以太坊核心概念

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊虚拟机&#xff08;EVM&#xff09; 以太坊虚拟机&#xff08;EVM&#xff09;是以太坊中智能合约的运行环境。它不仅被沙箱封装起来&#…

使用rest_framework写api接口的一些注意事项(axios发送ajax请求)

1. 类继承GenericAPIView&#xff0c;定义queryset 印象深刻的事&#xff1a;由于原来对于继承关系不太清楚&#xff0c;写接口 APIView/泛指GenericAPIView不太关注queryset没有设置渲染器&#xff1a;默认 [JSONRenderer,BrowsableAPIRenderer]BrowsableAPIRenderer&#xff…

iir数字滤波器_手把手教系列之一阶数字滤波器设计实现(附代码)

[导读] 前面分享了 IIR/FIR/mean/梳状数字滤波器的具体设计实现&#xff0c;这几种使用起来或许觉得计算量大&#xff0c;相对复杂。实际工程应用中通常有必要过滤来自传感器或音频流的数据&#xff0c;以抑制不必要的噪声。有的应用场景&#xff0c;可能只需要一个最简单的一阶…

正则表达式中$1,$2 ===算是什么意思

$1,$2...是表示的小括号里的内容 $1是第一个小括号里的 ,$2是第2个小括号里的 比如 /gai([\w]?)over([\d])/ 匹配 gainover123 $1 括号里的 n $2 第2个括号里的 123转载于:https://www.cnblogs.com/vertko/p/5888902.html

为什么以太坊能成为区块链2.0的代表之作?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链的学习进入到第四天&#xff0c;前三天学习比特币&#xff0c;分别从比特币的前世、货币属性和背后的区块链技术学习。 比特币是区块链的1…

(转)搭建企业内部yum仓库(centos6+centos7+epel源)

搭建企业内部yum仓库(centos6centos7epel源) 原文&#xff1a;https://www.cnblogs.com/nulige/p/6081192.html https://www.linuxidc.com/Linux/2017-11/148723.htm---------部署yum仓库与定制rpm包 1. 创建yum仓库目录mkdir -p /data/yum_data/cd /data/yum_data/#可以上传rp…

vs按f5没反应_《死神vs火影》中最受欢迎的游戏角色,仙鸣当之无愧上榜

hello&#xff01;大家好&#xff0c;又到了一日一度的杨某讲游戏环节啦&#xff0c;赶紧系好安全带&#xff0c;准备上车吧。《死神vs火影》作为一款深受广大群众欢迎的街机游戏&#xff0c;自然而然地涌现出了一系列知名游戏角色。那么&#xff0c;大多数人心目中最喜欢&…

IEC61850笔记--IEC61850应用入门(二)

IEC61850标准学习和调试&#xff0c;测试的记录文档&#xff0c;主要参考了IEC61850标准文档&#xff0c;《IEC61850应用入门(第二版)》&#xff0c;开源代码libIEC61850及libIEC61850说明文档。 IEC61850标准内容参考IEC61850标准文档&#xff0c;以及IEC61850标准介绍文档《I…

区块链赚钱的9种方式

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 物联网火了一段时间&#xff0c;人工智能火了一段时间&#xff0c;无人驾驶火了一段时间。现在&#xff0c;通通被区块链的风头盖住了&#xff0c;都…

7、在对象内部尽量直接访问实例变量

本文概要&#xff1a; 1、首先给出结论是&#xff1a;除了几种特殊情况外&#xff0c;在读取实例变量的时候采用直接访问的形式&#xff0c;而在设置实例变量的时候通过属性来做。 2、讲解了使用getter、setter的好处。 3、列举了几种上面提到的特殊情况&#xff1a;有时不能使…

linux python2和python3共存_linux-Centos7安装python3并与python2共存

1.查看是否已经安装PythonCentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5。使用 python -V 命令查看一下是否安装Python然后使用命令 which python 查看一下Python可执行文件的位置可见执行文件在/usr/bin/ 目录下&#xff0c;切换到该目录…

9月20号作业

转载于:https://www.cnblogs.com/kangy123/p/5890515.html

区块链以太坊五大开发工具,你喜欢哪个?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 以太坊&#xff08;Ethereum&#xff09;是运行智能合约的最受欢迎的分布式平台之一。因为虚拟货币近年来的发展&#xff0c;以太坊以区块链为基础引…

sublime text 3 中改变.vue文件的颜色

1、按 CtrlShiftP 2、输入install&#xff0c;选择install Package 3、输入vue&#xff0c;选择 vue syntax hightlight 如果上述方法不起作用&#xff0c;可以选择在下面连接中下载文件&#xff0c;手动安装 如何让你的.vue在sublime text 3 中变成彩色? 转载于:https://www…

nodejs端口被占用。

I had the same issue. I ran: $ ps aux | grep node to get the process id, then: $ sudo kill -9 followed by the process id to kill the process.转载于:https://www.cnblogs.com/facial/p/5893138.html

戴尔电脑管家_2020年笔记本电脑推荐指南:笔记本电脑应该怎么选?什么牌子的笔记本电脑更值得入手?...

笔记本电脑已经成为家家户户必不可少的移动装置了&#xff0c;作为一名互联网行业从业者&#xff0c;无论是居家还是工作也得有一台性价比较高的笔记本&#xff0c;才能满足工作需要了。接下来&#xff0c;跟大家唠一唠笔记本电脑的那些事儿~我将从以下几个方面进行介绍&#x…

行走在区块链上的智能合约

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 我和你打一个赌&#xff0c;我赌明天是雨天&#xff0c;你赌是晴天&#xff0c;赌注100大洋。假设明天是晴天&#xff0c;然后你跑过来管我要100大洋…

安装 telnet

yum install telnet-server yum install telnet service xinetd restart 查询是否正常启动telnet netstat -tnl |grep 23 telnet服务默认使用的23端口 转载于:https://www.cnblogs.com/gaobo543013306/p/8922021.html

python中json dumps_python中json.loads,dumps,jsonify使用

search_info {id:132,user_role:3}print type(search_info) #输出 #转为string用dumpsprint type(json.dumps(search_info)) #输出 #string转 dict用 loads()print type(json.loads(json.dumps(search_info))) #输出 如果前后台通过接口交互时&#xff0c;返回给前台json格式数…

区块链中的智能合约是什么?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 “智能合约是一套以数字形式定义的承诺&#xff0c;承诺控制着数字资产并包含了合约参与者约定的权利和义务&#xff0c;由计算机系统自动执行。”…

Python学习【第七篇】基本数据类型

基本数据类型 bytes数据类型 Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode&#xff0c;由str类型表示&#xff0c;二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes&#xff0c;正是这使得两者的区分特别…

web项目答辩总结_web实战项目遇到问题总结探索

最近在写一个django的web项目&#xff0c;后端代码基本都已经写好了&#xff0c;主要是前端&#xff0c;以前学过一段前端&#xff0c;只是对一些基本的方法知道&#xff0c;但还有很多东西不熟练&#xff0c;问题是在遇到表单数据时候&#xff0c;如何对参数整体打包发送后端接…

iOS----------计算一段代码执行时间

CFAbsoluteTime start CFAbsoluteTimeGetCurrent(); //在这写入要计算时间的代码 // do something CFAbsoluteTime end CFAbsoluteTimeGetCurrent(); NSLog("%f", end - start);转载于:https://www.cnblogs.com/KiVen2015/p/8926265.html

区块链热度不减 应用风险不容忽视

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 今年来&#xff0c;除了区块链本身之外&#xff0c;越来越多的业内人士也更加关注区块链在金融等方面的应用。 4月2日&#xff0c;由京东金融研究院…

POJ 3258:River Hopscotch (最大化最小值)

【题意】 牛要到河对岸&#xff0c;在与河岸垂直的一条线上&#xff0c;河中有N块石头&#xff0c;给定河岸宽度L&#xff0c;以及每一块石头离牛所在河岸的距离&#xff0c; 现在去掉M块石头&#xff0c;要求去掉M块石头后&#xff0c;剩下的石头之间以及石头与河岸的最小距离…

python获取文本光标_使用python readline时如何获取(并设置)当前bash光标位置?

我可以建议Python curses吗&#xff1f;The curses module provides an interface to the curses library, the de-facto standard for portable advanced terminal handling.While curses is most widely used in the Unix environment, versions are available for DOS, OS/2…

Gridview改变单元格颜色

if (e.Row.RowType DataControlRowType.DataRow) { e.Row.Cells[1].BackColor System.Drawing.Color.Red;//第二列的颜色 }转载于:https://www.cnblogs.com/objectxhy/p/5896970.html

区块链为什么这么热?有这么大热度的原因是什么

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链的热度是超乎想象的。 在上地和西二旗密集的写字楼办公空间里&#xff0c;年轻人三五成群聚在一起&#xff0c;在午饭后或散步或聚在茶水间…

使用nmonchart把.nmon文件转换成html

转载&#xff1a;https://blog.csdn.net/zd470015321/article/details/68923280 我的环境 :centos6.6 下载地址 nmon: http://nmon.sourceforge.net/pmwiki.php?nSite.Download nmon analyzer: https://www.ibm.com/developerworks/community/wikis/home?langen#!/wiki/Power…

java web中文乱码处理笔记

一、发生中文乱码的情况有以下三种&#xff1a; 1.表单form的两种提交出现中文乱码 ① get提交 ② post提交 2.超链接&#xff08;本质是get提交&#xff09;出现中文乱码 3、sendRedirect(发生乱码) 二、乱码产生的原因&#xff1a; 浏览器编码 utf-8 发送请求给服务器是会产…