初稿地址:https://learn-linux.readthedocs.io

QQ交换群:Linux互联网编制程序,群号:183196643

迎接关切我们的万众号:小菜学编制程序 (coding-fan)

一.硬件介绍

前一节谈论了三个幻想模型——两服务器通信。
以往,我们把难题进一步展开一下:多台机器怎么着促成两两简报?

一 、基本概念

  主机            初阶化发送,爆发时钟信号和平息发送的组件

      从机             被主机寻址的零件

  发送器          发送数据到总线的机件

      接收器         从总线接收数据的组件

      多主机         同时有多于3个主机尝试控制总线 但不损坏报文

      仲裁           是贰个在有四个主机同时尝试控制总线,但只同意其中贰个决定总线并使报文不被磨损的历程

      同步           八个或三个零件同步时钟信号的历程

笔者们以三个相当不难的事例起首:

CR-VH是相持湿度,是用零点温度来定义的,一般,冠道H在1/2~65%中间最为妥帖。

原版的书文地址:https://learn-linux.readthedocs.io
QQ调换群:Linux互联网编制程序,群号:183196643
欢迎关心大家的民众号:小菜学编制程序互连网七层协商之数据链路层,I2C通讯协议。 (coding-fan)

二 、硬件结构

每三个I2C总线器件内部的SDA、SCL引脚电路结构都以相同的,引脚的输出驱动与输入缓冲连在一起。在那之中出口为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。那种电路具有三个性状:

澳门金沙国际 1

(1)由于 SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑; 
(2)引脚在出口信号的还要还将引脚上的电平进行检测,检测是还是不是与刚刚出口一致。为
“时钟同步”和“总线仲裁”提供硬件基础。

两服务器通信难点

澳门金沙国际 2

如上海体育场合,有两台服务器,分别是 Server 1 和 Server 2 。
大家先做三个假使:总括机网络现在还不曾被发明出来,
作为计算机地经济学家的您,想在那两台服务器间传递数据,怎么做?

那时,你或许会想到,用一根电线把两台服务器连接起来:

澳门金沙国际 3

物理课大家都学过,电线能够分为 低电平 和 高电平 。
电平能够高低变化,那样不就可以传递音讯了么: Server 1 控制电缆电平的高低, Server 2 检查和测试电平的高低,那样就落到实处了 Server 1 往 Server 2 发送数据啦!

更进一步,能够将音量电平抽象成数学语言:大家用低电平表示 0 ,高电平表示 1 ,那样就获得2个做梦的信道:

澳门金沙国际 4

由此信道,双方能够传递一些 01 比特流。
例子中,我们传输的比特流是 1111010101... (从右往左看)。
比特流能够编码任意消息:
比如,大家用 1111 表示报告对方本地开机了,用 0000 告诉对方本地准备关机了。

到近年来结束,我们是否万事具备了啊?
一个比特流信道成为实际?——理论上是那样子的。
不过,现实世界往往要比理想化的模子复杂一些。

澳门金沙国际 5

多服务器通信难点

注解

为了简化接下去的研商,我们站在物理层的根基上,全部数据发送省略控制比特
10100101

上面,以三台服务器为例:

澳门金沙国际 6

图中,有 3 台服务器,名字分别是: antbee 以及 cicada
为了通信,大家考虑三者均一而再至一根共用导线,每台服务器都足以转移导线电平,也能够检查和测试导线电平。
进一步如若,在硬件层面,多机器争持仲裁机制已经落到实处并且可用。
那样,是还是不是消除了多服务器通信难题?

叁 、时钟同步

万一从机希望主机下降传送速度能够透过将SCL主动拉低延长其低电平日间的措施来打招呼主机,当主机在准备下贰次传送发现SCL的电平被拉低时就进展等待,直至从机达成操作并释放SCL线的决定控制权。那样的话,主机实际上受到从机的时钟同步控制。可知SCL线上的低电平是由时钟低电平最长的零件决定;高电平的时日由高电平常间最短的组件决定。那正是时钟同步,它化解了I2C总线的快慢同步难题。

出殡控制

澳门金沙国际 7

第二,如上海教室,信道是无穷无尽的。
因为,信道状态要么为 0 ,要么为 1 ,没有一种表示没事的非正规情状。

澳门金沙国际 8

举个例子,如上海教室, Server 1 向 Server 2 发送比特体系 101101001101 (从右往左读)。
最终多个比特是 1 ,对应的电平是高电平。
发送实现后,由于并未没有别的地方转移电缆的电平,所以依然维持高电平状态。
也便是说,信道看起来还是遵守既定节拍,趋之若鹜地发送 1 (绿蓝部分), Server 2 怎么检查和测试结尾在哪儿?

大家能够定义一些异样的比特类别,用于定义伊始结尾: 101010 表示早先, 010101 表示最终。

澳门金沙国际 9

这时, Server 1 先发送 101010 (红色),告诉 Server 2 作者要从头发多少了;
然后, Server 1 伊始发送数据 1101011 (莲红部分);
最后, Server 1 发送 010101 (绿色),告诉 Server 2 数据发送完成。
注意到,平日信道为 1 (银白),也正是表示空闲状态。

注:NTC为热敏电阻,输出为:单总线数字信号,单线双向串行通信。

寻址

假设, antbee 发送(粗体)二个数据 11110000
由于导线是共享的,全数机器都得以检查和测试到电平信号。 换句话讲, bee
cicada 都会收取这几个数据 11110000 ,而 cicada
本不应有接收这么些数量! 另一方面, bee
收到数量后,也不知情数码到底是哪个人发送给它的。

澳门金沙国际 10

就此,大家供给引入一些比特,用来标识数据的来自以及目标地。
大家的事例唯有3台服务器,七个比特就能够唯一分明一台机械:

机器 比特
ant 00
bee 01
cicada 10

那便是说,发送数据时,额外添加三个比特用于表示来源机器,其余三个比特表示目的机器,难点不就一举成功了呢?

澳门金沙国际 11

bee 收到数量后,检查前多个比特(水泥灰),值为 00 ,便知道是 ant
发出来的; 检查紧接着的七个比特(海洋蓝),值为 01
,与投机合作上,便称心快意地收下了。 相反, cicada 收到数量后,发现 01
和自己 10 匹配不上,便丢掉那么些数据。

新引入比特所起的功能,在微型计算机互连网中称之为 寻址 。 那多少个比特也就称为
地址 ,个中,深浅黄为源地址,银灰为指标地址。
通过引入寻址,大家健全地消除了数额从哪来,到哪去的难点。

四 、主机发送数据流程

(1)主机在检查和测试到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时,发送三个开发银行信号“S”,初阶贰回通讯的先导

(2)主机接着发送1个下令字节。该字节由
7 位的外界器件地址(设备地址)和 1 位读写控制位 CRUISER/W组成(此时 奥迪Q7/W=0)

普普通通低于壹人便是Lacrosse/W位,,“0”表示写,“1”表示读(日常读写信号中写下面有一横线,表示低电平)

(3)绝对应的从机械收割到命令字节后向长机回馈应答信号
ACK(ACK=0)

(4)主机械收割到从机的回复信号后开端发送第三个字节的数码

(5)从机械收割到数额后归来贰个应答信号 ACK

(6)主机械收割到回复信号后再发送下贰个多少字节

(7)当主机发送最终叁个数码字节并接受从机的
ACK 后,通过向从机发送3个截止信号P结束本次通讯并释放总线。从机械收割到P信号后也退出与主机之间的通讯。

澳门金沙国际 12

在意:主机所接收数据的数量是由主机本人决定,当发送“非应答信号/A”时从机便截止传送并释放总线(非应答信号的三个成效:前二个数码接收成功,停止从机的再次发送)。

I2C位传输
   数据传输:SCL为高电常常,SDA线若保保持平衡稳,那么SDA上是在传输数据bit;
   若SDA发生跳变,则用来代表二个对话的起来或甘休(后边讲)
   数据变动:SCL为低电经常,SDA线才能改变传输的bit

 

澳门金沙国际 13

 

I2C开始和停止信号
   起首信号:SCL为高电平日,SDA由高电平向低电平跳变,开端传送数据。
   结束信号:SCL为高电常常,SDA由低电平向高电平跳变,甘休传送数据。

澳门金沙国际 14

 此外I2C的通讯速率为100Kb,火速为400Kb

 

争持仲裁

比方两台服务器同时往信道里发送数据,会发生什么业务呢?

澳门金沙国际 15

必然争辨了呗!一台发 0 ,一台发 1 ,那您说信道到底是 0 还是 1 ?
那么,争论要怎么消除吗?

赶尽杀绝办法也简单,只需在硬件层面实现一种体制:在检查和测试到两台服务器同时发送数据时,及时喊停,并协商到底由哪一方首发。

澳门金沙国际 16

复用/分用

信道唯有三个,可是报导必要是无穷的——传输商讨数值、文件打字与印刷、即时通信,不一而足。
怎么着消除这些争论呢?套路依然一样的——引入新的比特。

假诺,总的通信须求就地点这个,那么,1个附加的比特便化解了难点。

类型 比特
研究数据 00
文件打印 01
即时通讯 10

这时,假设 antbee 上报斟酌数据并打字与印刷二个文书:

澳门金沙国际 17

这么,通过新引入的墨绿比特,我们实现了在同个信道上举办不一致的通信! bee
接收到数量后,依据深灰蓝比特,决定数据如何处理。

接下去,从理论的看法来审视那些场馆:

澳门金沙国际 18

信道唯有三个,须求承载差别的报道供给。
在发送端,通过插足绿蓝比特,将区别的多寡经过三个共用信道发送出去,这么些进程叫做
复用 ( Multiplexing );
在接收端,从共用信道上接收数据,然后检查浅湖蓝比特决定数据怎么样处理,那一个进度叫做
分用 ( Demultiplexing )。 在接下去的章节,大家将看到 复用
分用 那些概念贯彻总结机互联网的一味。

澳门金沙国际 19

到近期结束,大家引入了 3 种差别的比特,分别是 源地址
指标地址 以及 数据类型
对于那个比特的位数以及含义的预定,便成为 互联网协议

总结

本节斟酌了三个最简便易行的模型,化解两台服务器之间的广播发表难题。
通过电缆,在两台机器间建立了3个上佳的比特流传输信道。
那实在就是网络分层结构中最底部——物理层的法力:

  • 传输比特流
  • 凭借物理(电气)特性

这一层对开发人员来说,基本上是透明的,咱们只需将其驾驭成贰个比特流传输信道即可。
至于细节难点,高低电平啦,信号啦,各个物理特点啦,通通留给电子工程师去关心好啊!

澳门金沙国际 20

总结

本节,大家缓解了多台共用信道服务器间的通讯难题,这一定于互联网分层结构中的
数据链路层 。 数据链路层的严重性功用包蕴:

  • 寻址
  • 复用/分用

进度

澳门金沙国际 21

澳门金沙国际 22

进度

澳门金沙国际 23

下一步

下一节,大家将因而 多服务器通信难点 进入 多少链路层 的学习。

订阅更新,获取越来越多读书材质,请关心我们的 微信公众号 :

澳门金沙国际 24

澳门金沙国际 25

注:上拉电阻状态下,配置为开漏输出,能够追加使得能力,减小CPU功耗。

下一步

下一节,我们起初攻读3个忠实的数码链路层协议——
以太网球协会议
。 届时,大家将看到
以太网球组织议
与本节虚构的磋商别无二致。

订阅更新,获取更多读书资料,请关心我们的
微信公众号

澳门金沙国际 26

澳门金沙国际 27

澳门金沙国际 28

澳门金沙国际 29

澳门金沙国际 30

澳门金沙国际 31

澳门金沙国际 32

澳门金沙国际 33澳门金沙国际 34

二.主次关键点:1)引脚输入与输出的精确切换,2)输出电平的确切延迟,3)输入电平的等候与延迟读取以及等待的岁月限定。

1.MCU什么设置先河信号?

/*
由MCU向DHT11发送3次先河信号,总线空闲状态为高电平,MCU把总线拉低至少18ms,
保证DHT11能检查和测试到起来信号,主机发送早先都音信技术有限义务公司号后,能够切换到输入方式,只怕切换成
高电平均可,切换成高电平常间一般为20~40us,然后起始读取响应信号.
*/
void DHT11_Rst(void)   
{                 
DHT11_IO_OUT();  //配置引脚为通用推挽输出格局
DAOBB = 0;  //拉低DQ
    SysTickDelay(20000);//至少18ms
DAOBB = 1; 
SysTickDelay(30);//主机拉高20~40us
}

2.MCU如何接受响应信号?

/*
等待DHT11的回应
回去1:未检查和测试到DHT11的存在
重返0:存在DHT11接受到主机的启幕信号后,等待主机的初叶信号甘休,
接下来发送80us的低电平响应信号,发送响应信号后,在把总线拉高80us,准备发送数据*/
u8 DHT11_Check(void)   
{   
u8 retry=0;
DHT11_IO_IN();//将A11口设为输入
  /*&&与<的先期级是<高于&&*/
    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
{
retry++;
SysTickDelay(1);//那里系统滴答函数要陈设为1US的中断

if(retry>=100)return 1;
else retry=0;
    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再一次拉高40~80us
{
retry++;
SysTickDelay(1);
}
if(retry>=100)return 1;   
return 0;
}

3.怎么读取二个位的轻重电平?前提是早就有响应信号,那样去读取数据才有趣。
2个位的高低电平是依照总线上的高电平的时光长度来判断的,说白了,正是低电平一旦截止,再过28us,总线上的电平为高,那些位的电平便是高电平,总线上的电平为低,这么些位的电平正是低电平。所以我们假使等待总线上的低电平结束,过了28us现在再70us之前去读总线上的电平,就能领悟具体的一位的电平是有点了。但我们无法无界定的等待低电平截至,假设器件故障或其余原因,总线上始终低电平,那样程序就会在伺机中死去,所以大家亟须加三个等待时间的界定,超越等待时间,大家就放弃这一次等待。为了使读取后总线上的音量电平不影响下贰次的读取数据,大家还加了二个高电平的限时等待。

/*从DHT11读取一个位,重回值:1/0。
每一bit数额都以50us的低电平常序早先,高电平的大幅度决定了bit数据位的0或1,
高电平状态在26~28us时,表示数据位为0,高电平状态在70us时,表示数据位为1.
DHT11_DQ_IN是读取对应端口引脚的输入电平,在读在此以前,该引脚要铺排为上拉下拉输入模式
*/
u8 DHT11_Read_Bit(void)  
{
  u8 retry=0;
while(DHT11_DQ_IN&&retry<100)//读取高电平中,等待变为低电平,/*&&与<的先期级是<高于&&*/
{
retry++;
SysTickDelay(1);
}
retry=0;
while(!DHT11_DQ_IN&&retry<100)//读取低电平中,等待变高电平
{
retry++;
SysTickDelay(1);
}
SysTickDelay(40);//等待40us
澳门金沙国际 ,if(DHT11_DQ_IN)return 1;
else return 0;  
}

//从DHT11读取二个字节
//重返值:读到的数目
u8 DHT11_Read_Byte(void)    
{        
    u8 i,dat;
    dat=0;
for (i=0;i<8;i++) 
{
    dat<<=1; 
   dat|=DHT11_Read_Bit();
    }    
    return dat;
}

//从DHT11读取二回数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//再次来到值:0,平常;1,读取退步
u8 DHT11_Read_Data(u8 *temp,u8 *humi)    
{        
  u8 buf[5];
u8 i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//读取40位数据
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0];
*temp=buf[2];
}
}else return 1;
return 0;     
}

相关文章