浅谈总线通信机制(串口、I2C、SPI、USB。。。)(通信基础+串口部分)

本文未完待续。。。。本人才疏学浅,若有理解出错的地方,欢迎各位大佬批评指教。

参考:

书籍:<<计算机组成原理 >> 唐朔飞

chinaunix博客:https://www.cnblogs.com/chengqi521/p/7238269.html

C语言中文网:http://c.biancheng.net/cpp/html/1919.html

百度文库:https://wenku.baidu.com/view/58480d1efad6195f312ba6c4.html

总线的应用非常广泛,在计算机领域来说。

(1)按系统总线传输信息的方式可以分为以下三种:

1、数据总线

2、地址总线

3、控制总线

(2)按照总线的使用范围又可以分为很多很多种:

比如串口通信,计算机外设通信,网络通信等等。

(3)按数据传送方式的方式可以分为以下两种:

1、串行传输总线

2、并行传输总线

     当然还有其它的分类,非常非常的多,所以在学习的过程中,把握主体,其它的都是从一个概念中衍生出来的。

那什么是总线呢?总线就是连接多个部件的信息传输线,是各个器件共享的传输介质。

     其实不管是什么通信,本质上其实只有串行和并行。

 

 

   当有很多个器件和连接到总线上时候,如果出现两个或者两个以上器件同时对总线发送信息的时候,这就势必会导致竞争关系,也就是到底谁先谁后的问题,这样会导致通信过程中信号与信号之间产生冲突,就比如说,追求一个女孩(总线),我(器件)也喜欢她,你(器件)也喜欢她,但按照常理,她只能选一个她喜欢的,信得过得男孩,谈到合适的时候就结婚对吧?这个时候假设她已经有喜欢的男孩了,那么她就有这个男孩相关的信息,这点类比成一个ID好吧,每个追求者都是一个ID,由总线去匹配这个ID,最后才能连接。所以正是考虑到这样的原因,就有这么一个规定,在某一个时刻,只允许有一个器件向总线发送信息,而多个器件可以同时从总线上接收相同的信息,这就更好解释了,就拿刚刚说的男女关系,我(器件)和你(器件)都追求这个女孩(总线),而现在这个女孩(总线)选择了我(器件),那么我(器件)和女孩(总线)之间就是恋爱关系(连接)了,当你或者更多的男孩(一个器件或者多个器件)要去追求女孩(总线)的时候,她(总线)会毫不犹豫的告诉你(器件):我有男朋友了,请你们离我远点!!!(总线发广播,告诉所有的器件,所有的器件就可以同时从总线上接收信息)。当然,他们也可以分手啊,这就不用我说了吧,自己联想,道理也是一样的。纯属个人的理解,我觉得这样适合我理解哈,如有说得不对的地方,请多多指教。

 

   总线实际上是由许多传输线或者通路组成的,每条线可以一位一位的传输,这些位可以在规定的时间里传输完成,也可以在一定的时间内,多位同时传输;这就是串行通信和并行通信。什么是串行?简单的理解吧,串行就是一条路,一次过一辆车或者过一个人。那什么又是并行?并行就是多条路,多辆车或者多个人同时过多条路,从效率上看,并行的效率肯定比串行高,这是肯定的,毫无疑问,有点常识的人都应该知道;打个比方,你去坐地铁,没有位置的时候,你是喜欢跟别人一起挤着还是喜欢站得宽敞点舒服点?正常人肯定希望宽敞点舒服点啦,就这么个道理。那么,从成本上来讲,比如设计同样长度的传输线,这个时候,并行传输肯定比串行传输的成本要高得多了,比如修一条1000米的路成本贵一点还是修多条1000米的路成本贵一点?并行传输在这时候耗费的资源远远比串行传输要多得多了,为什么?串行传输一条线(MCU用一个IO)就可以完成多个位的传输,只是耗费的时间长而已,这是劣势。并行传输需要使用多条线(MCU使用多个IO)发送多个位,但节省了相应的时间。所以一般情况下,并行通信适合近距离传输,通常小于30m,而串行通信比并行通信更适合远距离传输,可以从几米到上千公里。

       串行和并行通信的数据传送速率都与距离成反比。在短距离内,并行通信传输效率比串行通信传送的速率高很多,但随着大规模和超大规模集成电路发展,数字电路组成的逻辑驱动器件的价格相对来说价格便宜,但通信线路的费用越来越高,因此对远距离通信而言,采用串行通信的费用远远要比采用并行通信的费用要低得多。

       从数据的传输方式角度来说就是串行和并行这两种,相信大家也理解了。那么从数据的通信方向来说,就会分单工,半双工,全双工。从概念上来说:

       1、单工:在任何时刻都只能进行一个方向的通讯,即一个固定为发送设备,另一个固定为接收设备。

    2、半双工: 两个设备之间可以收发数据,但不能在同一时刻进行。

    3、全双工:在同一时刻,两个设备之间可以同时收发数据。

       概念一看对于不理解的人来说就难以理解,只是了解,但实际是怎么样的他可能不知道。那么举个简单的例子得了,这样大家很快就懂了。

    就拿道路与交通来做个类比吧。

    单工是什么?单工就类似一个只允许单方向运行的车道,在任何时刻,只允许一辆车向同一个方向走,不允许逆行。

 

 

        半双工是什么?半双工就类似一条道路,在有人过来的时候,你过不去,当这个人过来了,你可以过去。

 

 

 

        全双工是什么?全双工就类比成两条车道,同一时间,两方的车都可以走,互不干扰,互不影响。

             这样的例子够形象吧,相信一看就懂了,不用解释哈哈。

    传输过程中,根据数据传输的方式不同,可以分为同步和异步两种。

        (1)同步,从字面上来理解,就是同一个时间内双方都在同时做一件事情,比如去公园跳广场舞吧,肯定有个领头的对吧?然后就是跟着领头一起跳舞的一群人了,他们跳舞是根据一个音乐来跳的,把握好音乐的节奏,比划不同的动作出来,这样远远一看过去,很壮观对吧,这就需要音乐和人比划的动作进行相互协调,这样才能同步。这在通信中,通常就相当于时钟线和数据线;也就是说,在时钟线启动到结束,数据线都要跟着时钟的频率进行传输。

        (2)异步,相对于同步来说了,异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位,在开始位和停止位之间就是数据了。

     所以,从结果来看,同步传输的信息基本都是直接同步过来数据,而异步因为包含各种各样的开始位,停止位,甚至还有数据校验位等等,所以同步传输的明显效率要比异步要高得多得多。

     在嵌入式领域中,使用串行异步通信的协议还是挺多的。比如我们接下来要说到的串口,串口协议就是异步通信的协议。

     那么,什么又是协议?把话挑明白点说,就是双方约定好一定的规则来做,不然我们去办理一些业务的时候,一般业务员都要你签一个协议,那个协议就是约束你和业务本身的一个规则。当然,在计算机通信中,也不例外的。

那串口通信又是怎么约定的呢?首先肯定得有电路连接图对吧:

     MCU要和PC机相连,中间多了一个MAX232芯片,它是用来干嘛的呢?其实就是用于电平转换用的,就是以下电平做转换,才能相互进行通信。

 

 

   通常,串口通信由一个起始位,多个数据位,一般是8位,或者8位以下,从一个字节的低位开始传输,传输完毕后传输停止位,这就是一个基本的串口协议,当然这个协议中也可以安插一些空闲位,还有奇偶校验位。我们可以很形象的用一幅图来表示:

         那串口也不能随便发,假设我是主机,我发得很快,从机却接收得很慢,那会造成什么样的影响?每秒传输多少数据?那么这里就出现了波特率这个概念。波特率是什么东西?简单的说,波特率就是每秒传输的位数,单位是fps/s

     常用的波特率有115200、9600、4800等等。

     比如,现在我使用波特率为115200,请问1s钟传输多少KB的数据?

     答:115200 / 8bit / 1024 = 14KB 

     所以波特率为115200串口传输的速度其实是很慢很慢的,一秒钟才14KB,真的很慢了,就算是波特率再大的,也很慢

     光说不练假把戏,没有经过验证的东西不能就说它一定是对的,即使是书本的知识。

     

/**
  * @brief  Ö÷º¯Êý
  * @param  ÎÞ
  * @retval ÎÞ
  */
int main(void)
{	
  int i ;
  unsigned char ch = 'a' ;
  USART_Config();  //配置串口 波特率:115200   8bit数据  0个校验位  1个停止位
  while(1)
	{	
		//发送一个字节	
		  Usart_SendByte(DEBUG_USARTx,ch);
		  for(i = 0 ; i < 50000 ; i++) ;
	}	
}

 

 

 

     下面我使用Saleae Logic 1,1,15来分析一帧串口协议,使用STM32开发板作为实验,向PC发送一个字节的数据,然后用逻辑分析仪连上Rx口,即可得到以下数据:

我们只是截取了其中一帧数据进行分析,由于这个程序是无线循环,所以实际上从逻辑分析仪得到的结果是这样的:

 

 

 

 

 

 

 

 

 

 

  • 42
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Engineer-Bruce_Yang

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值