STM32的数据传输外设:USART、I2C、SPI三种常见接口的学习

时间:2024-03-28 21:00:46

一、USART串行接口

串行接口分为异步串行接口和同步串行接口两种,其中异步串行接口统称为通用异步收发器接口UART,具有同步功能的UART(包含时钟信号SCLK)称为通用同步/异步收发器接口USART。

USART的电气特性标准包括RS-232C、RS422、RS423和RS485等,其中RS-232C是最常见的串行通信接口(台式机的显示器与主机的连接线好像就是RS232吧)

RS232有9个引脚,当然最常用的只有三个:RXD(接收数据)、TXD(发送数据)、GND(用来共地);而RS232的主要指标有两个:数据速率和数据格式。数据速率就是我们设置的波特率,而数据格式便是我们设置的起始位、数据位、校验位、停止位;

因为UART是挂载在APB1上的,所以我们使用其传输数据的时候,要先开启相应的时钟。但是不要忘了,UART是需要用到GPIO接口的,所以我们还需要开启GPIO的时钟,并且先初始化GPIO接口,再初始化USART。

至于USART使用哪些GPIO引脚,我就不赘述了,网上随便一查就能知道。

当我们程序需要对USART进行操作的时候,我们若通过寄存器进行操作的话,那么通过查询USART寄存器的表便可以慢慢书写下来,而通过库函数的话,通过正点原子的例程也可以很清楚的学习到。

我们只需要知道在我们的主函数里先使用初始化函数,将USART初始化完成,然后接收数据的话通过串口中断来完成,根据项目设置的接收结束标志,把接收结束标志位置1,在主函数中通过查询该标志位的真假来完成接收。

而发送的话,我们既可以用重定向printf来发送数据(但是我不建议实时系统或者系统资源比较小的时候使用,因为该方法会使程序耗费的资源大大增加);也可以通过自己写发送函数,通过传入字符串指针,通过对指针的查询,来逐字节输出到USART->DR,再查询USART->SR来判断是否发送成功,从而发送下一字节。

二、I2C内部集成总线接口

内部集成电路总线接口I2C是通信控制领域广泛采用的一种标准,连接在总线上的每一个设备都有唯一的7/10位地址。

I2C采用一根双向串行数据线SDA和一根双向串行时钟线SCL实现主/从设备间的多主串行通信。

而I2C所要学习的也正是其各个时期的时序以及数据线的高低电平变动:

I2C总线在传输数据的过程中一共有三种信号:开始信号、结束信号、应答信号。

开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传输数据。

结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传输数据。

应答信号:接收数据的IC在接收到8bit的数据后,向发送数据的IC发出一个特定的低电平脉冲,表示已经接收到数据。例如CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号则再根据实际情况决定是否发送下一个信号;若没有接收到应答信号,则可以判断受控单元出现了故障。

这三种信号里,起始信号是必须需要的,而结束信号和应答信号都可以视情况不要。

STM32的数据传输外设:USART、I2C、SPI三种常见接口的学习

而使用I2C的时候肯定是要先初始化,初始化的时候我们先初始化GPIO的时钟,然后根据时序图来写出起始信号,结束信号与应答信号,而向从IC写数据与读数据,这些函数在正点原子里都有写,我就不占篇幅赘述啦。

三、SPI串行设备接口

SPI在工业控制领域的应用也可以说是非常多的,SPI可以实现主设备或从设备协议,并且它是一种典型的全双工数据传输方式,其传输的正确性通过串行时钟SCK来保证。当配置为主设备时,SPI可以连接多达16个独立的从设备,发送数据和接收数据寄存器的宽度可以设置为8位或者16位。

SPI使用四根线来实现串行通信:两根数据线、一根时钟线、一根控制线

主出从入MOSI:主设备输出数据,从设备输入数据

主入从出MISO:主设备输入数据,从设备输出数据

串行时钟SCK:主设备输出,从设备输入,用于同步数据位

从设备选择NSS:主设备输出,从设备输入,用来选择哪一个从设备与主机通信。

并且SPI的接口时序也由两个很重要的参数决定:时钟极性与时钟相位

时钟极性为0时初始电平是低电平,为1时初始电平是高电平;时钟相位为0时第一个边沿采集数据,为1时第二个边沿采集数据。

STM32的数据传输外设:USART、I2C、SPI三种常见接口的学习

由于时间原因,我在这个篇幅里无法完全说明SPI的使用方法,我会在找个时间更新此次的博客,或者另开一个帖子,欢迎大家前来指正。谢谢啦,嘿嘿