通讯协议(串口通信,SPI通信,I2C通信,CAN通信)
一 串口通信
1、双工
串口通信是全双工通信,只能进行点对点的通信。
RS232和RS485同串口通信一样都是异步通信。
2、帧格式
串口通信的帧格式:起始位(低电平)+ 数据位 + 停止位(高电平)。
数据位一般是8位,但也存在其他可能。
RS232标准和RS484标准的帧格式和串口通信的帧格式相同。
3、波特率
波特率(Baud rate)表示单位时间内传输的符号(信号元素)的数量,其单位是“波特”,英文表示为“Baud”,简写为“Bd”。
1波特即指每秒传输1个符号。例如,波特率为 9600 Bd,意味着每秒钟可以传输9600个符号。符号可以是二进制的 0 和 1,也可以是多进制的状态。在二进制系统中,一个符号代表1位信息,此时波特率和比特率数值相等;而在多进制系统中,一个符号可以代表多个比特信息,比特率就会大于波特率。
比特率:指单位时间内传输的二进制位数,单位是比特每秒(bit/s,bps)。
二者关系:比特率 = 波特率×单个调制状态对应的二进制位数。例如,在四进制(每个符号有 4 种不同状态,可表示 2 个比特信息)系统中,若波特率是 1200 Bd,那么比特率就是 1200×2 = 2400 bit/s。
4、串口通信的高低电平
高电平范围:2.4V~5V
低电平范围:0V~0.4V
这样的电平范围就代表了这种传输方式抗干扰能力比较差,并且传输距离很短(1m左右)
二、RS232标准
1、产生原因
由于串口通信的传输距离比较短且抗干扰能力比较差,所以美国电子工业联盟制定了RS232标准。
2、连接方式和双工
RS232通信标准是全双工通信,只能进行点对点的通信
3、RS23标准的高低电平
RS232标准在MAX232电平转换芯片的作用下,会将高电平变得更高低电平变得更低,使得高低电平的范围变得更大,进而提高数据传输的距离和抗干扰性能。
MAX232电平转换芯片反过来压缩电平范围,使得高低电平范围变小。下图展示TTL电平到232电平转换的过程,反过来就是232电平到TTL电平的转换过程。
三、RS485标准
1、双工
RS485标准是半双工通信,可以进行一对多的通信
2、RS485的传输电平
RS485传输采用差分形式传输,通过485电平转换芯片可将TTL电平转换为差分电平,也可将485电平信号转换为TTL电平。
TTL电平高电平代表逻辑1,低电平代表逻辑0;差分信号传输过程中逻辑1和逻辑0分别如图所示。根据不同的芯片手册,以下面的芯片为例,当A的电平高于B的电平时代表逻辑0,反之代表逻辑1。
差分信号传输过程中,因为是双绞线的形式,所以信号在传输过程中的抗干扰性能更强,且传输距离更远。
总之不论是RS232标准还是RS485标准,他们都是在串口通信的基础上对电器层面进行了改进,只定义了物理层,对编程几乎没有影响,因此在了解串口通讯的代码逻辑后,便可以直接将串口代码使用在RS323或者RS485标准中。
四、SPI通信
1、连接方式
SPI通信是芯片与芯片之间的通信,采用一主多从、全双工、同步通信方式。
SPI通讯使用四根信号线:
SS:片选信号线,一般主机向对应从机的SSX发送低电平就代表与该从机建立通信。具体是高电平代表片选还是低电平代表片选可以查阅从机对应的芯片手册。
MOSI:主设备发送从设备接收信号线,主设备从这跟线向从机发送信息,从设备从这根线接收主设备发送过来的信息。
MISO:从设备发送主设备接收信号线,从设备从这根线向主设备发送信息,主设备从这跟线接收从机发送过来的信息。
SCK:时钟信号线,由主设备产生,建立主从设备之间的通信时钟。波形图如下:
2、读写数据方式
一下以主设备和93C46(EPROM)通信为例,讲述SPI的通信过程:
建立通信:
首先从存储器93C40的数据手册上查到当SS1(片选信号)发送高电平时代表主设备片选到了存储器93C46。当主机通过SS1端口向存储器93C46发送高电平时,单片机和存储器93C46就建立了通讯。
写数据的过程如下:
比如当我们要给存储器93C46的0X01地址写入数据0000 1111时,通过查看存储93C46的使用手册,发现他写读写数据的帧格式为下图所示,所以单片机通过MOSI端口向存储器的MOSI端口发送(101000000100001111)的一帧数据。
数据解释:起始位1,操作码01,地址00000 01,数据00001111
明白发送数据帧格式后搭配片选信号、时钟信号就可以建立起从单片机向存储器93C46的写数据操作。
从存储器93C46的使用手册上发现,该芯片的待机电平为低电平,当片选信号为高电平,时钟信号处于上升沿时,数据信号才会被采集。
类似的数据采集方式一共有四种:
待机电平为低电平,时钟上升沿数据信号被采集
待机电平为低电平,时钟下降沿数据信号被采集
待机电平为高电平,时钟上升沿数据信号被采集
待机电平为高电平,时钟下降沿数据信号被采集
读数据的过程如下:
比如当我们要从存储器93C46的0X01地址读数据时,通过查看存储93C46的使用手册,发现他写读写数据的帧格式为下图所示,所以单片机想要读取存储器93C40位于0X01地址位的数据时得先从自己的MOSI端口给存储器的MOSI端口发送(1100000001XXXXXXXX)一帧数据,这里单片机只是向存储器发送读数据的指令,没有发送数据,所以数据没乱填就行,然后存储器就会从自己的MISO端口向单片机的MISO端口发送位于存储器93C40的0X01地址位的数据(00001111)。这样就完成了单片机从存储器OX01地址位读数据的操作。
数据解释:
1100000001XXXXXXXX:1起始位,10操作码,00000 01地址,XXXXXXXX随便写
00001111:位于存储器0X01地址处的数据
上边例子中写入的数据是00001111,8位数据,读到的也是8位数据,这里不能单纯的认为SPI通信传输的数据数据位数是8位,实际中具体多少位要看从机的用户手册,只要符合SPI的这四种采样模式和电气属性,它就属于SPI通讯
SPI通信(全双工)模式一共有四种:(结合PPT和软件SPI代码一同消化,前面的介绍不太准确)
模式0: 待机电平为低电平,时钟上升沿移入数据,下降沿移出数据(主从机)
模式1: 待机电平为低电平,时钟上升沿移出数据,下降沿移入数据
模式2: 待机电平为高电平,时钟上升沿移入数据,下降沿移出数据
模式3: 待机电平为高电平,时钟上升沿移出数据,下降沿移入数据
五、I2C通信
1、连接方式
I2C通信是总线通信,半双工、同步通信。
两根信号线,时钟线和数据线。
通信时时两根信号线共同作用,时钟由主设备控制,数据线主从共用。
2、通信数据帧格式
设备地址:从设备的地址,例如24C02设备的地址是1010 000
寄存器地址:从设备中寄存器的地址
写数据帧格式(指定地址写数据)
以下假定是主机给从机写数据:
S:起始位,SCL处于高电平期间,SDA由高电平转换为低电平
Send Byte 0X00:从机地址,在SCL高电平期间读取到的SDA电平1101 0000
RA:从机给主机的应答信号,此时RA=0是主机和从机综合作用的结果,因为此时主机释放SDA线,SDA即将处于高电平,然后主机再把SDA线的控制权给了从机,从机回复0,SDA线又即将处于低电平,两者线与作用下使得SDA在该时刻处于低电平,RA=0,所以可以看出此时的时钟比较长。
Send Byte 0X19:从机寄存器地址
RA:从机给主机的应答信号
Send Byte 0XAA:主机给0X00(从机)的0X19(寄存器)写入0XAA(数据)
RA:从机给主机的应答信号
P:停止位,SCL高电平期间SDA由低电平转为高电平
读数据帧格式(两种读的格式:当前地址读数据、指定地址读数据)
一、当前地址读
当前地址指针:指针上电默认一般是指向0地址,每次写入和读出一个字节后指针就会自加一,在调用当前地址读的时序时由于主机没有指定读那个寄存器的地址,那么从机就会返回当前指针指向的寄存器的值
eg:刚在0x19的位置写入0xAA,此时使用当前地址读,读取到的数据就是0x1A寄存器里的值
S:起始位
Send Byte 0xD1:从机地址
RA:从机应答
Receive Byte 0X0F:主机接收到从机发送过来的数据。此时从机得到了主机的允许可以在SCL处于低电平期间写入SDA,然后主机在SCL高电平期间读取SDA。这也就是这段时期内时钟比较长得到原因。
SA:主机给从机发送的应答信号,SA=1代表非应答SA=0代表应答
SA=1代表读取到这个字节的数据就结束了
SA=0代表后续还会继续读取一个字节
P:停止位
二、指定地址读
指定地址写数据+当前地址读数据的叠加
前两段用于找到指定的从机的寄存器地址,后两段用于在该地址下读数据
六、CAN通信
1、CAN通信简介
CAN通讯是半双工、异步、多设备通信,通信时要设置合适的波特率。
2、设备连接方式
3、电平标准
4、通讯数据帧格式
起始位:固定为0。
识别码:通信范围内的机器编号,参与CAN通信的每个机器都有独属于自己的识别码。
RTR位:用来区分数据帧(0)或远程请求帧(1)。
控制码:控制数据长度。
IDE位:区分标准格式和拓展格式,IDE是0代表识别位有11位,IDE为1代表识别位有 29位。
空闲位:始终置0。
DLC位:由4个二进制数表示,0001代表传输的数据是8位,0101代表传输的数据是40 位
数据位:蕴含发送的数据信息
CRC位:接收设备会根据接收到的数据计算出他的CRC位,如果与接收到的CRC位不一致,说明 接收到的数据存在问题,发送端就会重新发送一遍数据帧。
CRC界定符:始终为1,目的是为了把前后两段数据隔开。
ACK码:
ACK确认槽:(做应答),发送方发送完一帧数据后,在应答这一位,发送方释放总线,总线回归默认状态(隐性1),如果接收方收到数据,在ACK槽这一位,把总线拉开,使总线呈现显性0的状态,发送方释放总线后,在ACK槽会读取总线状态,如果发送方读取为显性0,说明有接收方正确接收数据,若为隐性1 ,说明发送失败,发送方可以配置自动重发,也可以什么都不做,总之发送方知道发送状态就行。(总之,这一位由接收方控制,接收方接收到数据时,这一位被接收方置0,代表接收到数据;当接收方没有接收到数据时,这一位被接受方置1,代表没有接收到数据)
ACK界定位:一定是逻辑1,作用是把后边的数据隔开。
结束位:7位数据位都是1,代表这一帧数据传输结束
注意当两个设备同时发送信息时,那个优先?
答:这时候看识别码,识别码不仅是身份的象征还代表了优先级
当这两个信号同时产生时,从左向右找不同(假设信号是从左端发送),发现不同后,看谁是0,谁就有限发送。
