你这个小板子和电脑通讯,做个上位机,最常用的接口是什么?我想大家闭眼说-串口!
串口是什么?
串行接口(Serial port),也称串行接口或串行端口,串行通信接口,COM接口,简称串口。
就字面意思,一根线就可以传输,也就是说,其实传输的是帧数据,那不免得就要说一帧里面有什么?
我在之前的文章里面说,一个协议最重要的就是抓住01到底是怎么传输的,以及我们如何设计一些东西,可以找到这个帧数据的头和尾如何把数据载荷取出来。
你看这个就是头+尾+8bit数据,不就是一个字节,这就是包装出来的一帧数据。
更加详细的是这样
当两个设备需要通过UART协议进行通讯时,它们需要同时约定好以下内容:
有了这些约定,接收设备只需要等待起始位的到来,再对之后的波形进行固定间隔的采样即可获得传输的具体信息。以字符‘D‘的波形为例:
取样的波形
波特率是UART协议,或者说所有异步串行协议,非常重要的一个概念,即单位时间内(1秒)可表示的bit位个数,或者也可以表述为bit位宽的倒数。例如一个波特率为115200的UART波形表示1秒可容纳115200个bit位,也就是说每一位bit数据占大约8.68uS的时长。
UART等异步串行协议,为了简化信号物理连接,降低通讯成本,一般只有一根信号线,无法同时传输数据和时钟信号。
收/发设备为了正确解析波形就需要在相同的波特率设置下。而相同的波形使用不同的波特率获取的信息可能会完全不同。对于接收设备来讲,只有起始位可以作为一帧数据的同步点,其它数据都是通过波特率来确定具体的取样位置。
波特率错误
空闲时持续的高电平
UART接收端会一直检测信号线上的电平变化,开始传输数据时,发送端将信号线从高电平拉到低电平结束空闲状态,并保持一个bit位的时长。
接收器检测到高低电平转换时,开始接收信号。
而我们现代的协议其实是分层的
我们关心的是具体数据的意思,但是物理层走的确实高高低低的电平。物理层就是数据手册里面的东西,这个电平范围什么的,IO的速度什么的,因为一翻转就是一个01出来了。然后这么多的01,交给协议层,就是01如何分配,把里面的头尾校验这些都分离出来。然后把我们感兴趣的数据再传一层,拥有着实际意义的应用层。
为什么我这一次说了这个协议分层?因为串口的物理层有点多。
针对不同的通讯需求,便可以使用不同的物理层实现。例如简单的板内通讯,或者常见的设备调试场景,使用简单的LVTTL/TTL电平即可在两个设备间进行UART协议通讯。
梦源的图
通用的串口则使用的是RS232电平,可以增加传输距离,并且抵抗一定程度的信号干扰。
付出的成本则是在物理层需要对应的电平转换芯片来实现,发送端需要将内部的高低电平信号转换成电压更高的+/-电压信号,接收端需要将+/-电压信号转换成内部的高低电平信号。
这里使用这个芯片,就好像是一个外置的RF芯片,01还是哪个01,但是物理层做了一些更改。
电压大了,这个传输的时候,其实能量也强了
在工业通讯的场景下,为了进一步提高传输距离,以及增强信号的可靠性,一般会采用RS485的电平标准。
在发送端将普通的高低电平信号转换成一对差分信号,在接收端将差分信号再转换成普通的高低电平信号。另外,RS485允许总线上连接多达128收发器,而TTL或者RS232则是点对点的连接。
也就是说,工业设备要追求抗干扰和稳定,一个节点数据量不大,但是又需要通讯,那这个RS485就大显身手了。
可以看到,就是AB两个线就可以传输了
甩来甩去
我们使用的最多的是TTL电平
还是梦源的图
我们看这些MCU的特性里面一定会有,这个支持的模式
同步通讯是有时钟的,大家在一个线上面采集。
也就是要三个线
高级功能
还可以设置时钟
后者也叫字符同步,大家一般都是选这个的多。
上面就是咱们的基础知识了,来看看具体在MCU,SOC里面的样子
我这里选了英伟达 Jetson Nano:
可以看到,直接给了3个串口
不愧是说SOC,性能就是好,时钟200M,还有FIFO
三组
可以看到,再牛逼也得用串口调试
那其实我们的电脑只有USB和Type-C接口了,根本没有串口!!!那咋办?
所以就需要一个USB转串口的芯片!
CP2102,明星产品,也是贵族了
中规中矩的异步串口功能
这里
虚拟串口,全平台适配
框图也简单,如果异步通讯的话,就TX和RX就行了
这也简单,电源就是滤波,然后USB就是保护,RST是上拉
还有一个2104
1. CP2104更便宜。
2. CP2104体积更小,占地面积不同。CP2104是QFN24(4x4mm); CP2102是QFN28(5x5mm)。
会小一点
3. CP2104具有 I/O 电源引脚,可通过外部电阻承受VDD至5V的电压。
4. CP2104支持RS-485; CP2102没有。
5. CP2104具有GPIO引脚; CP2102没有。
6. CP2104具有一次性可编程存储器(OTP); 只能自定义一次CP2104。CP2102具有可重新编程的闪存; 可以多次自定义CP2102。
一模一样,无所谓
还有咱们的WCH
就是它的封装不好看,有点大
微小型的 10 脚贴片-MSOP-10,这个好
这个是什么画的?PADS?
就和我不出油的笔有一拼。
还有下载电路,数据手册里面介绍了不少应用例子,不错
反正就是这三个吧!
MCU还是要说一下:
CW32还有个好玩的,就是TX和RX互换功能,再也不怕连错了
在CR2这个寄存器这里改
这个也值得一看,别的MCU也可以用的上
除了MCU有串口,需要一个USB桥以外,还有自己带MCU USB IP的。
哈哈哈哈,没想到吧?每次买东西凑单的货,有这种好玩的东西。也就是说可以不使用额外的芯片,就直接一个USB线就可以通讯了。
直接这样就ok
推荐这本书
STM32F103 自带的 USB 符合 USB2.0 规范,不过 STM32F103 的 USB 都只能用来做设备,而不能用作主机。
标准 USB 共四根线组成,除 VCC/GND 外,另外为 D+,D-; 这两根数据线采用的是差分电压的方式进行数据传输的。
在 USB 主机上,D-和 D+都是接了 15K 的电阻到低的,所以在没有设备接入的时候,D+、D-均是低电平。而在 USB 设备中,如果是高速设备,则会在 D+上接一个 1.5K 的电阻到 VCC,而如果是低速设备,则会在 D-上接一个 1.5K 的电阻到 VCC。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。
STM32F103 的 MCU 自带 USB 从控制器,符合 USB 规范的通信连接;PC 主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被 USB 外设直接访问。
这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用 512 字节缓冲区(专用的 512 字节,和 CAN 共用),最多可用于 16 个单向或 8 个双向端点。USB 模块同 PC 主机通信,根据 USB 规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括 CRC 的生成和校验。
这个是设置页面
USB 的 DP 引脚必须上拉 1.5K 欧的电阻,电脑才能检测到 USB,否则检测不到。
如果USB端口出现感叹号设备无法启动的问题,可适当将堆改大,如0x400。
就是这么多了。
这样看就低速协议全面了。
https://blog.csdn.net/qq_36347513/article/details/127404464
https://blog.csdn.net/qq_36347513/article/details/127404464
https://dreamsourcelab.cn/logic-analyzer/uart/
https://zh.wikipedia.org/wiki/%E4%B8%B2%E8%A1%8C%E7%AB%AF%E5%8F%A3
https://www.silabs.com/documents/public/data-sheets/CP2102-9.pdf