本文为作者学习笔记
欢迎交流讨论,喜欢的话点个赞吧
欢迎去看我的主页
: NicholasYe’s Hompage.
串口
UART
UART,全称UniversalAsynchrONous Receiver/Transmitter,译为通用异步收发器。
- UART,“串口”时序协议的名称,定义了各个信号时序协议;
- USART,相比UART增加了同步信号,可实现ISO-7816智能卡接口;
- COM口,在PC等操作系统上,区别于USB、SATA接口的串行接口,定义了在操作系统中的规范;
- TTL/CMOS,嵌入式硬件系统的信号电平;
- RS-232,在UART基础上再定义了信号的电气特性
- RS-422,在RS-232基础上定义了差分信号传输的电气特性
- RS-485,在RS-422基础上定义了半双工模式
UART信号线
UART常用的信号线有:
- RxD,当前终端设备的接收管脚
- TxD,当前终端设备的发送管脚
- GND,当前终端设备的地
一般的,设计者在设计PCB时,对外连接做的一些预留接口,标记接口管脚时,都会添加丝印标记,这时标记的都是当前终端设备的管脚信息。
例如标记着RxD的引脚,应该与外部的UART接口TxD连接
UART信号时序
信号线空闲时,处于高电平,当有数据发送时,信号线以1个bit时长的低电平标志开始通信,通信过程中,单个字节在信号线上的帧结构如下图:
信号管脚传输每个数据时,在管脚上呈现的是电气信号为高低电平的变化,对应数据每个bit的逻辑“1”和“0”。
UART在不同电气规范下的接口
对于不同平台或者使用环境,信号管脚的电气特性依次可以分为:
TTL/CMOS、RS232、RS422、RS485
TTL/CMOS
TTL电平,逻辑“0”等于0V电压,逻辑“1”等于+5V电压
CMOS电平,逻辑“0”接近0V电压,逻辑“1”接近电源电压(3.3V或其他)
TTL电路与CMOS电路比较:
1)TTL电路是电流控制器件,而CMOS电路是电压控制器件。
2)TTL电路的速度快,传输延迟时间短(5-10ns),但是功耗大。
CMOS电路的速度慢,传输延迟时间长(25-50ns),但功耗低。
CMOS电路本身的功耗与输入信号的脉冲频率有关,频率越高,芯片即越热,这是正常现象。
常见的,在嵌入式开发时,UART的电平信号由MCU芯片决定。
日常的开发过程中,MCU管脚上的UART通信电平就是TTL/CMOS电平信号。
RS-232
RS232对电气特性、逻辑电平和各种信号线功能都作了规定。
在TxD和RxD信号管脚上:
逻辑“1”电压范围-3V~-15V
逻辑“0”电压范围+3~+15V
在RTS、CTS、DSR、DTR和DCD等控制线上:
信号有效(接通,ON状态,正电压)电压范围+3V~+15V
信号无效(断开,OFF状态,负电压)电压范围-3V~-15V
可见RS232的信号管脚特性为负逻辑电平的信号。
UART快速使用串口及应用
调试-输出
C库函数printf格式输出重定向到串口输出
输出串口数据过程中,需要向寄存器逐字节传入数据的,而在传送之前必不可少的,就是将要发送的数据、字符放到同一个Buffer后,执行轮询的方式传送直到buffer内容全部被传送。
而这个“放”的过程也是需要做些计算、判断,尤其是增加必要的字符来描述输出信息,保证信息的可识读。
在C标准库printf函数就有格式输出的功能,利用这个接口更便于调试输出这个过程。
这就需要将printf函数重定向到串口输出上!
实现重定向只需3步:
- Options for target选项卡内勾选UseMicroLIB
- 在串口实现的*.c文件内,将stdio.h文件和stdarg.h文件包含进来
- 重新定义int fputc函数的内部实现
完成以上3步,即可利用printf函数来格式化输出,并且能够在串口上接收到。
SPI
SPI是串行外设接口(SerialPeripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。
SPI信号线
SPI被称为四线串行总线,其信号线分别有:
- SCLK:串行时钟(主机输出)
- MOSI:主输出从机输入或主机输出从机输入(主机输出的数据)
- MISO:主输入从输出或主输入从输出(从输出的数据输出)
- SS:从机选择(通常为低电平有效,主机输出)
信号线命名也是五花八门,以下的命名也是会遇见的:
串口时钟:
SCLK:SCK
主输出--->从输入(MOSI):
SIMO,MTSR - 对应主设备和从设备上的MOSI,相互连接
SDI,DI,DIN,SI - 在从设备上; 连接到主设备上的MOSI,或连接到下面的连接
SDO,DO,DOUT,SO - 在主设备上; 连接到从站上的MOSI,或连接到上面的连接
主输入<---从输出(MISO):
SOMI,MRST - 对应主设备和从设备上的MISO,相互连接
SDO,DO,DOUT,SO - 在从设备上; 连接到主设备上的MISO,或连接到下面的连接
SDI,DI,DIN,SI - 主设备; 连接到奴隶上的MISO或上面的连接
从机选择:
SS:S̅S̅,SSEL,CS,C̅S̅,CE,nSS,/ SS,SS#
SPI作为同步串行接口,可以认为有两个同步信号,第一个是从机选择SS信号,告知被选中的从机,准备开始进行SPI通信,第二个是同步时钟信号SCLK,收发双方进行数据的交互时,都是基于SCLK的跳变进行逐BIT输出和采样的。
四根信号线并非全部都需要,根据工作模式,可以配置成两线、三线。
在STM32CubeMX工具的配置页面,可以很清楚看到,配置不同的工作模式时,对应被使能的芯片管脚有何不同:
对比发现,全双工的四线和三线的区别是从机选择信号NSS。这种情况一般是因为SPI总线上只有一主一从的通信架构,从机的NSS信号一直接低电平,不需要做从机选择。
SPI信号时序
四线SPI接口的时序一般的总是先拉低从机选择信号线SS,然后输出SCLK,带着数据MOSI,此时MISO为高阻态。大致如下如:
SPI接口配置项
一般在开发时,接口的可选配置有:接口模式(实际配置的是单、双工模式选择)、设备主从模式、数据宽度、时钟极性(CPOL:)、时钟相位(CPHA)、时钟速率、数据bit位大小端选择。
接口模式
- 标准的四线SPI接口,使用的场景是主从机进行数据交互的通信,两方都有数据的收发过程。
- 在LCD/OLED这样的SPI接口作为从设备的器件中,就不需要数据返回给主机,只需要接收来自主机的控制信息和显示的数据。基于这样的使用场景,就可以配置成三线的单工通信,即仅需要从机选择SS、时钟SCLK、数据输出MOSI即可。
设备主从模式
这个配置一般需要看芯片是否支持,可将芯片配置成SPI主机或者从机,能更好地集成在项目的系统中。
数据宽度
顾名思义,就是发送数据可以配置成8bit、16bit等,这也是根据芯片而定。
时钟极性、时钟相位
这两者分别是CPOL(Clock Polarity)、CPHA(Clock Phase),极性就是指高低电平,这个定义了SPI总线在空闲状态下,时钟保持高电平还是低电平,因为这个关系到了SPI通信时第一个时钟跳变沿是上升还是下降沿;相位指的是时钟的跳变沿,指定了数据信号的输出和采样如何与时钟对齐。
时钟速率
速率选择定义了时钟信号线在数据传输是的翻转速率,这体现到每个芯片定义的接口时序图中,即可承受的速率范围,如果主机设的速率太快,而从机响应过慢会导致通信失败。
数据bit位大小端选择
数据的发送优先bit可配置,SPI是可配置优先发送bit的,可设置最低位或者最高位。
IIC
IIC 即Inter-IntegratedCircuit(集成电路总线),这种总线类型是一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线接口。
IIC信号线
IIC作为两线串行总线,信号线分别是:
- SCL(Serial ClockLine):串行时钟,主机输出
- SDA(Serial DataLine):串行数据,双向传输
总线信号的电平在电路连接上,一般加上拉电阻Rp,使得总线在空闲时,信号管脚处于高电平状态。
IIC信号时序
IIC作为同步串行总线,可以认为有两个同步信号,第一个是通信起始、结束标志,告知挂在IIC总线上的从机设备,何时开始通信并且何时结束;第二个是同步时钟信号SCL,收发双方进行数据的交互时,都是基于SCL的跳变进行逐bit输出和采样的。
- 起始标志
处于空闲状态下时,SCL和SDA都是高电平,某一时刻,SDA拉低,则此刻认为开始IIC传输。 - 结束标志
即将完成数据传输时,在SCL处于高电平时,将SDA强制拉高,则此刻认为结束IIC传输。 - 数据输出
在SCL为低电平时,发送方根据传输的数据内容逐bit改变SDA的电平。 - 数据采样
在SCL为高电平时,接收方读取SDA的电平逐bit接收,并逐8个bit组成1个Byte。 - 应答ACK
ACK表示在8bit数据后的第9个时钟的高电平期间,SDA保持低电平。 - 应答NACK
NACK表示在8bit数据后的第9个时钟的高电平期间,SDA保持高电平。
IIC要实现主机与指定从机的通信,需要每次开始通信时,主机会先把指定从机设备的地址通过接口发出,这样一来,对应的从机设备即可被选中,才能进行后续的通信操作。
IIC接口配置项
相比于SPI接口丰富的配置项,然而IIC仅有2根数据线,可配置的也就是时钟SCL的翻转速率,因为这个时钟的速率直接影响到数据的传输速率。
这里所配置的推荐值,应该确认IIC总线上各个从机设备的速率极限,这样在设计IIC接口时,能够兼容总线上的所有设备通信速率。
参考资料:
- 《嵌入式硬件通信接口协议-UART(一)协议基础》
- 《嵌入式硬件通信接口协议-UART(二)不同电气规范下的标准》
- 《嵌入式硬件通信接口协议-UART(三)快速使用串口及应用》
- 《嵌入式硬件通信接口协议-SPI(一)协议基础》
- 《嵌入式硬件通信接口协议-IIC(一)协议基础》
请在转载文章过程中明确标注文章出处!尊重原创,尊重知识产权,谢谢!