通信模型以及数据帧
通信模型
通信分单工,半双工,全双工
单工:通信双发角色固定,一方始终是发送方,一方始终是接收方
半双工:通信双方角色不固定,但同一时间固定,比如现在A是发送方,B是接收方,过一段时间A可以作为接收方,B作为发送方,通信双方有一个管道,双方各执一个水龙头,管道空时,可以让A用这个管道向B送水,也可以让B用这个管道给A送水,但不能同时送水
全双工,通信双方可以同时作为发送者和接收者,通信双方有两个管道,1号管道A给B送,2号管道B给A送,
USART的TX端是发送引脚,RX端是接收引脚
数据帧
通信过程中以数据帧为单位进行收发
分为起始位,数据位,停止位,数据位中可以选择最后一位数据作为校验位(属于数据位)
起始位:发送方将线路拉低表示一帧到来(低电平),长度为1
数据位:低电平0,高电平1,总长度是8位或9位
校验位:奇偶校验,可以没有,也可以是数据位最后一位
停止位:发送方将线路拉高表示一帧结束(高电平),长度可以是0.5,1,2
空闲状态:高电平
奇偶校验规则:
之前又有个疑问:数据发过去后,接收方接到的是一堆二进制数,怎么还原为数据帧?高电平是1还是停止位还是空闲状态?低电平是0还是起始位?思考后认为:空闲状态为高电平,因为数据帧之前必有起始位(地点)电平,所以遇到低电平之前的高电平统统不是数据,而是空闲状态
接下来的是我的胡思乱想,本科阶段没有通信原理这种课程,单片机在这里只是提了一下格式,说停止位是为了区分数据帧的,但我想不明白为什么,只好设想一个原因:遇到低电平后表明一个数据帧到来,假如数据位为8位,那么低电平后连续数8个位,数据位就齐了,停止位则是防止数据位最后一位为0,恢复空闲状态需要一定时间,害怕下一次采样时这个低电平还没来得及恢复成高电平而被误认为是新的一帧到来,所以需要拉高,消除这个隐患。问文心一言,说不是这样,但问真实原因,也给不出,又没人可问,暂时记录下疑惑与假象,以后工作了看看能不能有师傅教。
同步通信与异步通信
同步通信:通信双方共用一个时钟,发送方发送一个数据,同步接收(接收方在共用时钟的情况下知道发送方发来数据了)。
异步通信:通信双方不共用一个时钟,发送方发送数据的时间不确定,接收方不知道数据会何时到来。
波特率
波特率:单位时间内发送的码元个数,这里一个码元就是1位,所以看成比特率应该也没问题
波特率9600:一秒发送9600个码元,也就是一秒发送9600个比特,每个比特的发送需要消耗0.104ms
硬件流控
发送方发送数据后,并不知道接收方是否已经接收并保存数据了,如果还没有接收并保存,发送方发送数据过快(比如发送方发送了10个帧,接收方只来得及保存了1个),可能会使旧数据因新数据覆盖而丢失数据,可以让接收方收到数据后返回一个应答表示数据已收到了,发送到收到答复才继续发。
带硬件流控的连线图:
这个是stm32的硬件流控说明和时序图
我对框图的理解:接收方接收数据寄存器为空时,rts为低电平,发送方cts收到低电平,us发送方把数据发给接收方,接收方完全接收这一帧后,把rts置高电平表示暂时无法接收数据,发送方cts收到高电平,于是暂停发送数据,等到接收方将输入数据寄存器的值读走后,接收方rts为低电平,发送方cts收到低电平,便可以进行下一个数据帧的发送
这是我自己的学习笔记,但如果有读者看到我又不对的地方请告诉我,以免更多读者被我误导,谢谢。
USART
框图(铁头山羊版)
铁头山羊的USART框图比参考手册里的要简单很多,参考手册的太复杂了,暂时先用铁头山羊的理解
CR配置寄存器
设置帧格式用的,UE:USART这个外设的总开关,TXE:TX开关,为1则使用,为0则不使用;r=RXE一样;M,STOP,PE,PS是设置数据帧格式的,如图
SR状态寄存器
TXE:发送数据寄存器空则置1
RXNE:接收数据寄存器非空(个人认为是满)则置1
TC:发送完成(发送数据寄存器已空切发送移位寄存器也已空)则置1
后面的是接收数据错误时置1,如图
IER中断使能寄存器
USART产生的所有中断共用一个中断通道
产生中断,有两种可能,一种是状态位置1则产生,一种是状态位和使能位与一下,若都为1才产生,后者多了一个中断屏蔽的作用,USART是后者,TXEIE与TXE与一下,若TXEIE为1(TXE中断使能或者说是"不屏蔽")且TXE为1(发送数据寄存器空)则与门输出为1,和其他线或之后为1,产生中断请求,后面的也类似,分别是接收数据寄存器非空的中断使能位,发送完成的中断使能,奇偶校验中断使能位,最后是出现错误产生中断的使能位,FE,NE,ORE是否产生中断是一体的,EIE为1则都能产生中断,为0则都不能产生中断
因为USART产生的所有中断都是同一个中断源,会进入同一个中断服务函数,所以中断服务函数需要有多个if判断一下中断是由谁产生的,不是if,else而是多个if,因为接收数据时可能会出现多个错误
BRR波特率寄存器
框图里看出:时钟先除以分频器再除以16=波特率,所以波特率寄存器值=时钟除以波特率再除以16即可,得到的值转化为二进制放入BRR,BRR低四位是小数部分,高12位是整数部分
不同USART时钟可能不同