听了FPGA组的分享,没有想到有接触到了我读大二在tao哥实验室做的东西,即串口通信,RS232。当年我也是那个自己焊接口,拿着示波器到处量的人,几年之后,又见到了这个曾今很熟悉的东西。重新学习一波吧,感觉分享会也没有讲的很清晰。
数字电子设备中有不同类型的数据传输,例如串行通信和并行通信。类似地,协议分为两种类型,例如串行通信协议和并行通信协议。并行通信协议的示例是ISA,ATA,SCSI,PCI和IEEE-488。类似地,有一些串行通信协议的示例,例如CAN,ETHERNET,I2C,SPI,RS232,USB,1-Wire和SATA等。
穿行通信:
并行通信
串并的区别,就在于各个位之间,是按照一个一个来,还是一起到目的地去。可以形象的理解为串形就是过一根独木桥。并行就是过八车道的大桥。
串行通讯中的传输模式
如上所述,在串行通信中,数据是以位即二进制脉冲的形式发送的,众所周知,二进制表示逻辑高电平,而零表示逻辑低电平。取决于传输模式和数据传输的类型,有几种类型的串行通信。传输模式分为单工,半双工和全双工。
单纯形法:
在单工方法中,介质(即发送方或接收方)可以同时处于活动状态。因此,如果发送方正在发送数据,则接收方只能接受,反之亦然。因此单纯形法是一种单向通信技术。单纯形法的著名示例是电视和广播。
半双工方法:
在半双工方法中,发送方和接收方都可以处于活动状态,但不能同时处于活动状态。因此,如果发送方正在发送,则接收方可以接受但不能发送,反之亦然。半双工的著名示例是Internet,用户在其中发送数据请求并从服务器获取数据。
全双工方法:
在全双工方法中,接收器和发送器都可以同时相互发送数据。众所周知的例子是手机。
除此之外,对于适当的数据传输,时钟起着重要的作用,它是主要的时钟源之一。时钟故障会导致意外的数据传输,甚至有时会导致数据丢失。因此,使用串行通信时,时钟同步变得非常重要。
时钟同步
串行设备的时钟不同,分为两种类型。同步串行接口和异步串行接口。
同步串行接口:
它是从主机到从机的点对点连接。在这种类型的接口中,所有设备都使用单个CPU总线共享数据和时钟。使用同一总线共享时钟和数据,数据传输变得更快。此接口中的波特率也没有不匹配。在发送器端,由于没有将开始,停止和奇偶校验位添加到数据,因此数据会移到串行线上,从而将时钟作为单独的信号提供。在接收器端,正在使用发送器提供的时钟提取数据,并将串行数据转换回并行形式。众所周知的示例是I2C和SPI。
异步串行接口:
在异步串行接口中,没有外部时钟信号。异步串行接口主要在长距离应用中看到,并且非常适合稳定通信。在异步串行接口中,由于没有外部时钟源,因此它依赖于多个参数,例如数据流控制,错误控制,波特率控制,传输控制和接收控制。在发送器端,并行数据使用其自己的时钟转移到串行线上。它还添加了开始,停止和奇偶校验位。在接收器端,接收器使用自己的时钟提取数据,并在剥离起始,停止和奇偶校验位后将串行数据转换回并行格式。众所周知的例子是RS-232,RS-422和RS-485。
同步异步的区别就是,传出过程中需不需要一根时钟线。同步速度快,准确高,但是距离短。异步需要多个检验,距离远。
主流地通信协议有三种:
当然,其实有很多:
本文我不想去介绍这些基本的协议,网上一查一大堆,我只想解释和记录一下,一个曾经困扰我很久的细节,那就是时钟信号,和数字信号是怎么实现合作的。这里讲解的I2C通信和SPI都是异步的,也就是两台机器的时钟频率是不一样的,但是可以实现读取,这里的核心就是波特率的设置。详解如下:
数据从TX出来,到RX去。
核心的三个参数。
假设我们要传输的数字是8bit的【1100 0110】
先说明一下,SDA是数据总线,SCL是时钟线,这是单片机的知识。简单的讲,时钟是用来统一个板子的时钟,心脏的功能。数据线是用来传输数据,血管功能。开始,数据线是高电平,就是说,我不想传数据现在。
当数据线跳变成低电平,时钟线检测到了,这就是start信号了,想传输信息了。(时钟线,可以假设是下降沿工作)
最关键的地方来了,上面这张图在很多地方都出现了,但是其实有些关键点没有讲明白,我相信大部人看的云里雾里。这里检测到start位开始之后,时钟线会根据前面设置的波特率来找下一次应该检测的地方。比如常见的波特率是9600bit/s,也就是1bit占104us.
那么start位置之后,104us,下一次读数,也就是下一位bit,就是我们要的数字了。也就是下图中②的位置。但实际上是加了52us的后一个②,这是为了等待数据线信号稳定,左边的②对应于上升沿,可能会有时间上的抖动。后面就一直加104us,就可以实现不断地采集位。直到读完设定的位数。(这里设定的是8位),后面一般是校验位和ask位,主要是用来确认数据位置没有问题。或者时间R/W,表示对前面传输的地址是读早操作还是写操作。
简单说一下,这个时钟是怎么做到的,可以设定时间。
指令周期:取出并执行一条指令的时间。
机器周期:通常用内存中读取一个指令字zhidao的最短时间来规定CPU周期。(也就是计算机完成一个基本操作所花费的时间)
时钟周期:处理操作的最基本单位。(CPU的主频)
存储周期:也就是一个访版存指令周期。
指令周期、机器周期和时钟周期之间的关系:指令周期通常用若干个机器周期表示,而机器周期时间又包含有权若干个时钟周期。
1.时钟周期抄即晶振的单位时间发出的脉袭冲数,12MHZ=12×10的6次方,即每秒发出百12000000个脉冲信号,那么发出一个脉冲的时间度就是时钟周问期,即1/12微秒答。
2.一个机器周期等于12个时钟周期,所以是1微秒。
普通的单片机,一个读取或者存储的操作就是一个时钟周期,也就是1us,这里波特率是9600,需要104微秒,只要降频一下,就可以周期固定的下降沿。
参考链接:
串行通讯协议
PROTOCOLS: UART - I2C - SPI - Serial communications #001