1,常用的通信方式
通信方式 时钟 | 引脚 | 工作方式 | 电平 |
SPI 同步步 | MISO,SDA,SCK,MOSI | 全双工 | 单端 |
串口 异步 | RXD,TXD | 全双工 | 单端 |
I2C 同步 | SCL,SDA | 半双工 | 单端 |
1,1 单端电平:对应本设备的GND端口的电平来进行电平高低确认,区别与差分法(根据双端的两个电压差)。
1,2 时钟:在发送端的电平之下,无法确定具体的采样时间,因此就需要一个时钟来进行数据采样,例如一个标准的,高低电平时间相等的下降沿产生一秒的波形,根据不同的采样频率4bite/s与2bit/s可将采集到的电平区分为(1,1,0,0)与(1,0)。
同步时钟:由于硬件带有SCK\SCLK引脚可以两个设备之间约定相同的操作来进行相互传输。
异步时钟:由于双方不具备约定好的内,外部晶振时钟,因此需要约定波特率,并相互进行在数据帧格式的头尾来进行相对的格式以保证传输。
其中串口可分为UART与USART,前者为异步时钟后者为同步时钟。而串口多数是以异步形式使用。
2,串口通信方式
2,1串口通信有两根通信线一根为TXD(发送端口)RXD(接收端口),其中发送设备的发送端要连接接收设备的接收端口,另一设备同理。
2,2 stm32的ttl电平:对应本设备的GND的端口电平(如0v)置为低电平,若该设备(如3.3v)则置为高电平。
2,3 串口的发送时序,串口为异步通信,根据波特率(每秒传输的码元个数)来进行传输,在二进制的条件下一个码元为1bit,因此此时的波特率就对应每秒传输多少个bit位;
2,4发送协议 根据串口的协议
首先需要在发送一个数据帧时使其置为高电平,并置低(为起始位),依次为八个数据位,其次为(停止位)位置低后拉高并未下一次的起始位做准备;在每一字节数据发送完毕时可选择校验,其中校验方式分为,不校验,奇数校验,偶数校验三种方式,夹在最后一位数据与停止位之间的1bit,且串口通信为低位先行,例如0x0F 转换为二进制为00001111,则在传输中为11110000。
2,5 USART的收发功能:
串口的收发功能通过两个数据寄存器来进行配置,其中发送数据寄存器(TDR)使只写的,接受数据寄存器(RDR)是只读的,两个寄存器的地址相同。
(1),发送功能详情:通过配置TDR使其存入数据,其中标志位TXE(TDR空,在TDR中数据未发送完毕时为0,TDR是一次性的将数据发送到移位寄存器中,因此在移位寄存器右移时,如果数据未传输完毕,TDR需要进行等待下一组数据的移入)在TDR向发送移位寄存器发送完毕置1并代表TDR可接受下一帧数据,但移位寄存器的数据仍未发送到TX上,需要在发送器控制下,将数据右移到TX上。“可以将此功能比作长尾漏斗,头口大尾口小,一次进八个(并行),一次出一个。当八个全部进入漏斗尾巴时再次加入八个”。
(2),接收功能详情: 通过接收器控制与接受移位寄存器,将数据右移,移位寄存器每次只工作一位,当RDR读取,其中RXNE(接收数据寄存器非空标志位)置1时,可以将RDR读取。并且可以进入中断。
2,6 波特率发生器:配置寄存器将时钟总线进行分频得到波特率,最高位4.5Mbit/s。
其中,stm32f103c8t6的内部USART资源为:USART1(APB2),USART2(APB1),USART3(APB1).
2,7硬件控制:
流控:可以避免发送太快接收设备来不及出来造成的数据覆盖。nRTS(输出脚Request请求发送)低电平时表示可以接收数据,nCTS(clear清除脚,判断另一设备的RTS是否可以接收,从而发送数据)。
2,8时钟输出
串口的时钟根据发送移位寄存器,发送移位寄存器移出一个位跳变一个周期。只能输出不能输入,可通过配置来兼容SPI。采样点时刻在数据的中间时间点,避免误差,也可以实现双设备同步时钟输出的功能。
2,9唤醒单元
可以通过USART的地址来唤醒设备,实现总线通信。
3,串口的振格式与时钟![](https://img-blog.csdnimg.cn/721e6e711f10457b80fee3cbef620003.png)
由上图可发现,串口的数据帧可以分为8位与9位(包含校验位),其中时钟为发送移位寄存器的输出时钟,可以通过配置应用为串口间相互通信的同步时钟。并且时钟的采样点位时每位数据传输时的中间。
关于时钟采样的16分频:正常来说每次传输一位的数据对应着通信之间的波特率, 但是串口的独特采样方式使得需要将时钟进一步进行配置。
时钟CLK=DIV*16*传输的波特率(时钟需要进行每一位十六次的采样进行跳变)
DIV为寄存器对时钟的分频处理
当时钟采样点过于靠近数据的跳变沿时,导致采样误差概率变高,因此串口的采样点设置在了数据传输时刻的中间。
关于每一位十六次采样:为了保证数据是在传输的中间时刻进行采样,采用了1bit16次的采样,通过将起始位进行十六次的采样(中途经过一系列的噪声检测)并且取得789次采样获得了低电平,从而使得后续每一位数据采样同样进行789的采样,并且根据3次当中更多出现的电平次数作为实际电平,从而进行了更为精准的数据采样