通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 ,对于有一些功能,STM32芯片内部无法实现,所以就需要外挂芯片完成,但是外挂芯片的数据都在外挂芯片上,需要连接一根或者多根铜芯线完成数据传送,有了这个功能,就能连接多个设备,达到扩展硬件系统的功能。

通信协议:制定通信的规则,通信双方按照协议规则进行数据收发。

image.png

 单工:只能发送或者接收

时钟特性:比如发送一个波形,高电平然后低电平,但是是不能确定是01还是0011,所以需要时钟信号告诉接收方什么时候需要采集数据,时钟特性分为同步以及异步,I2C跟SPI有单独的时钟线,所以是同步通信;接受方在时钟信号的指引之下进行采样,CAN跟USB还有USART没有时钟线,所以需要双方约定一个采样频率,这就是异步通信,还有需要加入一些帧头帧尾等,进行采样位置的对齐,

单端电平的意思是引脚的高低电平都是对GND的电压差,所以单端信号的双方必须共地,就是把GND连接在一起,也就是说前三个引脚那一栏还需要加上一个GND引脚,不然无法正常通信。差分信号是依靠两个差分引脚的电压差来传输信号,不需要GND,但是USB协议中也有一些地方需要单端信号,所以USB还是需要共地。

串口通信

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信

单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力

image.png

这个是USB转串口模块,上方的芯片型号是CH340,写个芯片可以把串口协议转换为USB协议,一端接在电脑,一端接到串口的芯片上,实现电脑以及串口的通信。

image.png

陀螺仪传感器模块,可以测量角速度加速度这些姿态参数,左右四个引脚,坐标是串口引脚,一边是I2C引脚

image.png

蓝牙串口模块,下面是串口通信的引脚,上边的芯片可以同手机互联实现手机遥控单片机的功能。

简单双向串口通信有两根通信线(发送端TX和接收端RX)

TX与RX要交叉连接

当只需单向的数据传输时,可以只接一根通信线

当电平标准不一致时,需要加电平转换芯片

image.png

 TX,RX,GND必须接(单向的话就接一根按照需求),但是VCC如果一方没有供电就需要接,要按照子模块的电压供电。

相同电平才能够相互通信,所以当电平标准不一致的时候,需要加上一个电平转换芯片,转接一下,在控制引脚出来的电平一般都是TTL电平。

电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

TTL电平:+3.3V或+5V表示1,0V表示0

RS232电平:-3~-15V表示1,+3~+15V表示0    避免静电干扰,一般用在大型机器上,静电干扰比较大

RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)  抗干扰能力非常强,距离可以达到上千米。上面就最多几十米。

串口参数及时序

波特率:串口通信的速率 ,为了避免重复接受或者无法接收,按照需求写不同的速率。本意是美妙传输码元的个数,单位是码元/s,或者直接叫波特,另外还有个名字叫比特率的,意思是每秒传输的比特数,单位是bit/s,或者叫bps。在二进制的调制之下,一个码元就是一个bit,此时波特率等于比特率。单片机串口通信,基本都是二进制调制,也就是高电平是1,低电平是0,一位就是1bit。所以波特率一般跟比特率混用,多进制就不一样。比如波特率为1000bps,也就是每秒发送一千位,也就是一位需要1ms。

起始位:标志一个数据帧的开始,固定为低电平,空闲的时候是高电平,其实胃的作用就是产生低电平,告诉接收设备发送即将开始,不然发送8个一的话,就没办法识别转运开始或者结束。

数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行

校验位:用于数据验证,根据数据位计算得来,分为三种,无校验奇校验偶校验,奇校验:如果数据位上的1是偶数,就补1让他变成奇数,如果是奇数,就补0不用变,然后在接收之后可以核对是否发生改变,偶校验也是相同原理。但是双数数字变化就寄了,所以检出率不高,更高精度可以选择CRC校验。

停止位:用于数据帧间隔,固定为高电平,为下一个起始位做准备,如果最后一为是0的时候,如果不恢复高电平,就没法产生下降沿

image.png

 RB8/TB8是奇偶校验位

image.png

USART

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器 ,UART就是异步收发器,相比之下前者多了一个时钟输出,不接受时钟输入。不支持两个USART之间通信。

USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里 (USART分为接收和发送两个部分,发送部分就是把数据寄存器中的一个字节数据自动转换为协议规定的波形,从TX引脚发送出去,接受部分就是自动接收RX引脚的波形,按照协议规定,解码为一个字节数据,存放在数据寄存器中。)

自带波特率发生器(其实就是一个分频器,系统给72MH在的时钟,然后经过分频得到只想要的通信波特率,然后就在这个分频后的时钟之下进行收发。),最高达4.5Mbits/s

可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)

可选校验位(无校验/奇校验/偶校验)

支持同步模式(多了个时钟CLK的输出)、硬件流控制(在A对B进行发送的时候,如果太快且没有硬件流控制的情况下,会把传送的数据覆盖掉,如果有,AB之间会多一根线,当B准备好时就低电平,数据才一个个发过来,否则就不会。)、DMA(大量和数据进行收发,减轻CPU负担)智能卡、IrDA、LIN

STM32F103C8T6 USART资源: USART1(APB2总线上,其余是)、 USART2、 USART31

image.png

TX与RX是接收发送引脚,下面那些是智能卡什么的,TX接在发送移位寄存器,RX接在接收移位寄存器,TDR跟RDR占用同一个地址,程序上只表现为一个寄存器数据寄存器DR,但是硬件上实则是有两个寄存器,一个只写的TDR,一个只读的RDR。

工作原理:当在TDR写入数据的时候,发射移位寄存器就会检测有没有数据正在传送,如果有,就把输入的数据待命,当发送完成的时候,在进入发射移位寄存器,这时候TXE就会置 1,数据在发送器控制的作用下一位一位的发送出去,在发送期间就可以在TDR之中写入数据待命,等TXT置0之后,马上开始传送,提高了工作效率。

数据从RX引脚通向接收移位寄存器之中,在接收器控制的驱动之下,一位一位的读取RX电平,先放在最高位,然后向右移,异动八位之后就是一个字节,,串口协议规定低位先行,所以接收寄存器是高位往低位移动的,当一个字节移位完成,一下子接转移到接收数据寄存器RDR之中,转移过程置标志位RXNE,当RXNE等于1时候,就把数据读取走,当转移成功之后,接着移位进行下一位。

在接收过程中,会有内部的硬件自动执行剔除帧头帧尾,在发送会加上,这些都是内部电路自动搞得。

流控部分,nRTS是请求发送,是输出脚,也就是告诉别人我当前能不能接收;nCTS是清除发送,是输入脚,用于别人接收nRTS的信号的,n的意思是低电平有效。使用方法:找一个支持流控的串口,TX接到RX之中,nRTS要输出一个能不能反馈的信号,截道对方的CYS之中,当我能接收的时候,RTS就置低电平,请求对方发送,CTS接收到之后,就可以一直发,处理不过来时,比如接收数据寄存器一直没好有读,又有新的数据过来了,代表没有及时处理,RTS就会置高电平,对方CTS接收到之后就会暂停的发送,直到这里接收数据寄存器被读走RTS置低电平,新的数据才会继续发送。当我们的TX给对方发送数据的时候,我们的CTS就会接到对方的RTS,用于判断对方能不能接收TX跟CTS是一对,RX跟RTS也是一对。

SCLK这部分电路用于产生同步的时钟信号,配合发送以为寄存器输出的,发送寄存器每移动一位,同步时钟电平接跳变一个周期,这个时钟只支持输出,不支持输入;有了时钟输出的串口,就可以兼容SPI,另外这个时钟也可以做自适应波特率,比如接收设备不确定发送设备给的什么波特率,就可以测量一下时钟的周期,然后计算得到波特率,不过就需要另外写程序实现功能。

唤醒单元:实现串口挂载多设备,点对点只支持两个设备相互通信,想发数据直接发就可以,多设备是一条总线上可以接多个从设备,每个设备分配一个地址,要跟某个设备通信,需要先进行寻址,然后确定通信对象,再进行数据收发,唤醒单元就是实现多设备的功能,串口可以分配一个地址(USART地址),当发送地址时,此设备唤醒开始工作,发送别的设备地址时,别的设备就唤醒开始工作,没收到地址就会保持沉默,这样就可以实现多设备的串口通信。

中断输出控制:中断申请位就是状态寄存器(SR)这里的各种标志位,标志位之中,TXE发送寄存器空,另一个是RXNE接收寄存器非空,这两个是判断发送状态和接收状态的必要标志位。中断控制输出这里,就是配置中断是不是能通向NVIC,

波特率发生器:其实就是分频器,APB时钟进行分频,就得到发送和接收移位的时钟,fPCLKx,USART1挂载在APB2之中,所以就是PCLK2的时钟,一般是72MHz,其他挂载在APB1之中,所以是PCLK1的时钟,一般是36MHz,之后除以分频系数,结果可能是小数,所以在DIV中分为小数部分以及整数部分,小数支持到小数点后4位,分频就更加准确。分频要再除以16,达到发送器时钟以及接收器时钟,通向控制部分,TE为1,就是发送器使能,发送部分的波特率就有效,RE为1,就是接收器使能,接受部分的波特率有效。

 引脚功能图上面,在功能复用那一栏,清楚地写着每个USART在哪个GPIO口上面,要提前设置好,别让引脚冲突了

image.png

image.png

image.png

 右移符号,代表这个以为寄存器是往右移动的,是低位先行。然后把数据经过复用GPIO口输出,输出到TX引脚,产生串口协议规定的波形。具体看上面。标志位同时也可以去申请中断,这样就可以在收到数据时,直接进入中断函数。然后快速的读取和保存数据,虽然图片显示的是四个寄存器,但是实际上只有一个DR寄存器供我们读写,写入DR时,数据走发送那条路,读取DR时,数据走下面这条路,进行接收。

数据帧

image.png

 对于第一个图,位8可以作为就检验为,也可以作为有效载荷,一般以一个字节为,解释八位。每个位中间都有一个时钟上升沿,时钟的频率和数据的频率也是一样的,接收端可以在时钟上升沿进行采样,这样就可以精准定位每一位数据。适中最后一位可以通过LBCL来决定要不要输出,另外时钟的极性,相位也可以通过配置寄存器配置。空闲帧从头到尾都是1,断开帧,从头到尾都是0;局域网才用的。下面那个一般位7是有效载荷,因为刚好是有效载荷。

image.png

停止位的长度

输出定时翻转TX的高低电平就行了,输入就不一样,不仅你要保证输入的采样频率与波特率一致,还要保证每次采样的都在数据的正中间,只有这样才是最可靠的,过于考前还是及考后,可能还在 翻转的过程中。另外输入最好还是跟噪声有一定的判断能力,如果是噪声,最好置标志位提醒一下。

输入电路:

image.png

当输入电路侦测到一个数据帧的起始位后,就会以波特率的频率,连续采样一帧数据,同时从起始位开始,采样位置就要对齐到位的正中间,只要第一位对齐了,以后就对齐了。输入这部分电路对采样时钟进行了细分,以波特率16倍频率进行采样,也就是在以为的时间里面可以进行十六七次采样,最开始,空闲状态高电平,那么采样一直就是1,当突然采集到的0的时候,就说明在两次采样之间出现了下降沿,如果没有任何噪声,就是起始位,在起始位会进行16此采样,没有噪声肯定都是0,但是实际存在噪声,所以会在后续的3,5,7进行一次采样,8.9.10也进行一次采样,凉皮采样必须要求没三位,至最少有两个0,就算是检测到了起始位,如果当中出现一个1,会在状态寄存器中会置一个NE,噪声标志位,提醒你有噪声,悠着点。如果仅有一个零,就不算起始位,可能之前检测到的下降沿是噪声导致的,这是电路会重新忽略前面的数据,重新开始捕捉下降沿。

如果通过了起始位的侦测,接收状态就由空闲变为接收起始位,同时第8.9.10次采样的位置正好是起始位的正中间,之后再接收数据位时,就都在第8,9,10次进行采样,这样保证采样位置在位的正中间了。

image.png

后续的就是连续进行第8.9.10位采样,没有噪音情况下全是1或者0,是0还是1按照传输信号决定,如果不是全为,就按照二比一决定,当然NE也会置1,

波特率发生器

发送器和接收器的波特率由波特率寄存器BRR里的DIV确定

计算公式:波特率 = fPCLK2/1 / (16 * DIV),因为要采样16次

image.png

 假设需要9600波特率,带入求得DIV,然后转换为二进制填入DIV,之后再不足就补0,

image.png

这是USB转串口模块,从上到下依次是GND,D+,D-,VCC,D+以及D-是通信线,使用的是USB协议,所以希望一个CH340芯片转换为串口协议,也就是输出TXD跟RXD,最后通过排针印出来,所有的店都是从VCC+5v进去的,通过稳压管进行降压,得到VCC+3.3v,然后都通过排针印出来,所以第六脚以及第4脚分别有5v跟3.3v输出,第五脚是CH340的电源输入脚,按照需求,根据跳线帽连接,右下角,如果有数据传输,响应指示灯就会亮。 

————————————————

版权声明:本文为CSDN博主「笔下觅封侯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_63148816/article/details/126206266