当前位置:   article > 正文

一文解决,STM32基本外设UART、I2C及SPI常用通信协议_stm21的uart.c

stm21的uart.c

前言

STM32单片机中支持很多外设通信,为了方便学习,根据我的个人理解,这里对这些通信协议做一个总结,不足之处,还请各位指教。

正文

首先,需要了解一下通信的基础知识,以及STM32为什么需要通信。

STM32通信的目的、协议以及基本定义

      (1)、通信的目的:将一个设备的数据传送到另一个设备,实现与众多模块的互联,极大的扩展硬件系统。

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

      (3)、基本需求:对于STM32来说,比如定时器计数,PWM输出,AD采集等,都是芯片内部的电路,这些电路的配置寄存器、数据寄存器都在芯片里,直接读写就可以操作,但是有些功能却是STM32没有的,比如想要蓝牙无线遥控的功能等,这些是STM32没有的,只能由外挂芯片完成,而外挂的芯片,数据都在STM32外边,STM32获取数据就必须在两个设备之间连接上一根或多根通信线,通过通信线路发送或者接收数据,完成数据交换,从而实现控制外挂模块和读取外挂模块数据的目的。

      (4)、并行通信:数据字节的各位同时传送的通信方式,比如说二进制数据0100 1000 发送时,这8位同时发送过去,最少也要占用8条传输线,缺点就是适用于近距离通信,远距离成本高,优点就是传送速度非常快

      (5)、串行通信:STM32提供很多功能强大的串行通信模块,串口USART、集成电路总线I2C、SPI等都属于串行通信,串行通信,将数据字节一位一位的传输过去,比如0100 1000,8位一位一位的发送过去,这种方式优点就是占用传输线少,适合远距离传送,但是传输速度慢。

      (6)、串口通信:STM32支持的通信方式的一种,有同步串口通信UART、还有支持同步和异步的USART通信,他们属于串行通信。

      (7)、异步时序(和异步时钟类似):异步时序的好处就是省了一根时钟线,节省资源,缺点就是对时间要求严格,对硬件电路的依赖比较严重,因为异步时钟就是缺少一根时钟线,需要通信双方约定频率才能通信。

      (8)、同步时序:同步时序的好处就是对时间要求不严格,对硬件电路不过于依赖,缺点就是多一根时钟线。有单独的时钟线,因此是同步的。


接下来,步入正题,各类通信协议的基础知识和用法:

UART串口通信

小端和大端模式

      (1)、小端模式:高位字节存在高地址上、低位字节存在低字节上。

      (2)、大端模式:高位字节存在低地址上、低位字节存在高地址上。

通信协议

     (1)、USART串口(没有时钟线,需要双方约定一个采样频率,属于异步通信,也就是说发送的停止了,可能接收的还在工作,异步工作)。

     (2)、全双工(通信双方能够同时进行双向通信)。

     (3)、时钟异步,单端电平、点对点通信。

     (4)、速率较慢、最快仅有1.5Mbps,但是传播距离远RS485可达1200m,采用小端模式。

UART串口通信、RS232和RS485   

      (1)、UART、USART、RS232、RS485其实都是属于串口通信,但是UART和USART的电平一般为TTL,低电平,标准TTL输入高电平最小2V,输出高电平最小2.4V,典型值3.4V,输入低电平最大0.8V,输出低电平最大0.4V,典型值0.2V。RS232电平逻辑1=-3V~-15V,逻辑0=+3V~+15V,RS485电平,采用差分方式输出,逻辑1表示 +(2~6)V,逻辑0表示 -(2~6)V。

      UART一般用于电路板内部通信或者短距离通信,最常用的就是单片机,STM32等都有,板子上有个串口设备,就可以直接使用UART的TX,RX管脚连接使用,或者留个排针或者端子座对外,注意如果要外接,需要供电和共地,这种情况适用于距离较短的串口模块,比如刷卡,蓝牙,WiFi小模块等。

      从上面可以看出,若想增大传输距离,就需要使用外挂芯片,将TTL电平高的转为RS232的-15V,TTL电平低的转为RS232的+15V,通过外挂芯片,提升UART的传输距离,那也就是说,其实,发送的电平信号还是使用USART,而RS232和RS485相当于两个扩大传输距离的芯片,使用的时候,底层依然使用的时USART串口。

      (2)、RS232的特点:a、接口的信号电平值较高(+/-15V),已损坏接口电路的芯片;b、传输速率较低,在异步传输时,波特率20Kbps;c、接口使用一根信号线和一根信号返回线而构成供地的传输形式,这种供地传输容易产生共模干扰,因此抗噪声干扰性弱;d、而RS-232接口只允许一对一通信。e、而RS-232接口为20Kbps。d、传输距离有限,最大传输距离也只能50米左右

      (3)、RS485的特点:a、接口电平低,不易损坏接口电路芯片;b、传输速率高,10米时,最高可达10Mbps,在1200米时,可达100Kbps;c、抗干扰能力强,RS485接口采用平衡驱动器和差分接收器的组合,也就是差分信号传输,因此抗噪声干扰性好。d、传输距离远,支持节点多;e、RS485接口在总线上允许连接多达128个收发器;f、RS-485接口的最高传输速率为10Mbps;g、多使用半双工,也可以全双工。

主要就是给CR控制寄存器和BBR波特率寄存器赋值

UART和TTL、RS-232、RS-485的关系

       (1)、UART是一种具有协议特征的收发器/接口/总线,也就是说它是一个按照特定协议来收发数据的硬件,它规定了数据按照什么格式和时序来传输。

       (2)、而TTL、RS-232、RS-485是三种不同的电气协议,是对电气特性的规定,作用于数据传输通路,但它并不包含对数据的处理方式。UART可以使用TTL电平,也可以使用RS-232、RS-485电平。

UART串口时序、波特率的定义

       波特率:串口通信的速率,因为异步通信,因此通信双方需要约定频率,它决定了每隔多久发送一位。

       UART串口时序中包含一个起始位、一个数据位、一个停止位,也有可能包含检验位时序图如下图所示。

      (1)、起始位、初始状态为高电平、标志着一个数据帧的开始。

      (2)、数据位、也就是需要传输的数据、1为高电平、0为低电平,传输时,低位先行,意思就是将16进制数转化为二进制数,然后翻转电平,使低位先进行传输,比如0xAA,二进制数为1010 1010,传输时为0101 0101 ,这就是低位先行,这也是遵循小端模式。

      (3)、停止位、停止位必须恢复高电平,用于数据帧间隔,也为下一个起始位做准备。

     (4)、校验位、如果没有校验位,总共有8位有效载荷,如果需要校验位,将会在有效载荷之后,加上一个校验位,该校验位如果使用奇校验,包括校验位在内的9位数会出现奇数个1。发送方,在发送数据后,会补一个校验位,保证1的个数为奇数,接收方在接收数据后,会验证数据为和校验位,如果1的个数还是奇数,证明传输正确。

I2C通信

通信协议

     (1)、I2C通信(拥有一条数据线SDA和一条时钟线SCL,因此属于同步通信)。

     (2)、半双工(一根数据线兼具发送和接收)。

     (3)、时钟同步,单端电平、多主机通信(可以一对多,也可多对多),每个挂接在总线上的设备都有唯一的地址。

     (4)、速率较慢、标准模式下达100Kbit/s,快速模式下400Kbit/s,高速模式下3.4Mbit/s,bit/s=bps,最快只有3.4M,采用大端模式(高位先行)。

      (5)、传输距离较近,不超过30cm。

I2C通信协议的优点 

      (1)、同步(这也是有时钟线的好处:改成同步,然后加一条时钟线,指导对方读写,存在时钟线,对传输的时间要求不高,单片机可以随时暂停传输,去处理其他事情,暂停传输的同时,时钟线也暂停了,传输双方定格在暂停时刻,可以极大的降低单片机对硬件电路的依赖)。

      (2)、当主机向从机发送数据或者接收数据时,将会产生数据应答。

      (3)、支持总线挂载多设备(一主多从(单片机作为主机,主导I2C总线的运行,挂载在I2C总线的所有外部模块都是从机)、多主多从。

I2C协议的硬件设备配置、协议规定

       (1)、设备的SCL和SDA均要配置成开漏输出模式(因为是半双工协议,主机的SDA在发送的时候是输出,在接受的时候是输入,从机的SDA也会在输入和输出之间反复切换,如果总线时序没有协调好,造成两个引脚都是输出状态,如果正好是高电平,就会造成短路,因此I2C的设计是禁止所有的设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出的电路结构,设计为开漏输出模式),SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右。

       (2)、单片机的核心是CPU,还有RAM、ROM等,作为总线的主机,主机权力很大,包括对SCL线的完全控制,任何时候,都是主机完全掌控SCL线,在空闲状态下,主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机。

       (3)、挂载在I2C总线上的从机权力很小,对SCL时钟线,在任何时刻都只能被动的读取,不允许控制SCL时钟线,对SDA数据线,从机不允许主动发起对SDA的控制,只有主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂的获取SDA的控制权。

I2C时序基本单元

      (1)、处于空闲状态时,SCL时钟线和SDA数据线均处于高电平,也就是没有任何一个设备去碰SCL和SDA,SCL和SDA由外部的上拉电阻拉高至高电平,总线处于平静的高电平状态。

      (2)、起始条件,主机需要进行数据收发时,打破宁静,此时SCL高电平期间,SDA从高电平切换到低电平,也就是预示着要开始数据传输了。在SDA成为低电平之后,主机将SCL拽下来,也成为低电平,此时SCL一方面占用这个总线,一方面方便基本单元的拼接。

      (3)、终止条件,和串口时序类似,需要一个终止条件,SCL高电平期间,SDA从低电平切换到高电平。

       I2C在发送字节和接收字节时,从机与主机,SCL与SDA的状态信息

      (1)、发送字节时,也就是指定地址写的过程,SCL低电平,主机将数据放到SDA数据线上(发送0,就拉低SDA,反之,释放SDA),接着主机释放SCL,从机开始读取SDA数据,一般在上升沿即可读取完成,并且此时SDA不可以改变;之后主机继续拉低SCL,继续放入数据,循环操作就发送了8位数据,也就是一个字节。

      (2)、接受字节时,主机在接收数据之前需要释放SDA,将控制权交给从机,SCL全程还是由主机控制,同样主机若想读取数据,也需要SCL在高电平期间。循环操作就接收了8位数据,也就是一个字节。

I2C指定地址写的步骤

     也就是主机向从机写入数据,具体时序图如下图所示

      (1)、主机发起一个启动信号(START)。

      (2)、主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。(因为一主多从的特性,而且每个从机地址拥有特定的地址,因此需要发送地址位,选择从机,比如MPU6050就是7位的从机,第8位是读或者写的标志位,1代表读,0代表写),这里发送的就是0。

      (3)、发送地址之后,从机若收到,将会产生应答(ACK),这里步骤是(从机应答期间,主机会将SDA控制权给从机,主机释放了SDA,SDA将要恢复高电平时,从机将其拉低,变为0,当主机处于SCL高电平,读取SDA时,发现是低电平,证明从机收到主机发送的数据)

      (4)、主机接着发送8bit的寄存器地址,(这是对于MPU6050来说的,其他的发送的可能并不是寄存器地址)。

      (5)、从机继续产生应答信号(ACK),原理和上面相同。

      (6)、主机发送一个字节数据。写入寄存器地址中。

      (7)、从机产生应答信号(ACK)。

      (8)、主机发送停止信号,将SDA拉回低电平,再进行释放,保证SCL和SDA都处于高电平,为下一次传输做准备。

     下方时序图指的是对于指定从机地址为1101000的设备,在其内部0x19地址的寄存器中,写入0xAA这个数据。

I2C指定地址读的步骤

     也就是主机从从机读取数据,具体时序图如下图所示  

     这里前两步的步骤肯定是和指定地址写的时候是一样的,因为都需要指定地址

     (1)、主机发起一个启动信号(START)。

   (2)、主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。这里发送的还是0。

     (3)、发送地址之后,从机若收到,将会产生应答(ACK)。

     (4)、主机接着发送8bit的寄存器地址,(这是对于MPU6050来说的,其他的发送的可能并不是寄存器地址)。

     (5)、从机继续产生应答信号(ACK),原理和上面相同。


     接下来就不同了

     (6)、主机再次重新发送一个启动信号(START) ,用来读取数据。

     (7)、主机再次发送7bit从机地址+1bit读写选择位,1表示读、0表示写。这里发送的就是1,读数据。

     (8)、从机产生应答信号(ACK)。

     (9)、主机读取一个字节数据。。

    (10)、主机产生一个非应答信号,之后产生一个停止信号(STOP),将SDA拉回低电平,再进行释放,保证SCL和SDA都处于高电平,为下一次传输做准备。

      下方时序图指的是对于指定从机地址为1101000的设备,在其内部0x19地址的寄存器中,读取0xAA这个数据,在这个过程中,发送两次获得从机地址的数据位。

 SPI通信

通信协议

     (1)、SPI通信(拥有四条通信线SCK(串行时钟线)、MOSI(主机向从机发送数据的线路)、MISO(主机由从机接收数据的线路)和SS(Slave Select 从机选择   直接通过一条通信线路去联系从机,不像I2C通过发送从机设备地址,而且不只有一根SS线)属于同步通信)。

     (2)、全双工(发送和接受单独各占一条线)。

     (3)、时钟同步,单端电平、串行通信、多设备通信(一对多,不支持多主机),每个挂接在总线上的设备都有唯一的地址。

     (4)、高速、可达到50Mbit/s,bit/s=bps,采用大端模式(高位先行)。

     (5)、传输距离较远10m。

     (6)、SPI通信没有应答机制。

SPI通信的原理   

     原理如下图所示

     (1)、SPI主要是通过交换一个字节进行数据传输的   高位先行主机输出的时候,左边移出的数据通过MOSI引脚,输入到从机移位寄存器的右边,主机输入的时候,从机移位寄存器移出的数据通过MISO引脚,从左边输入到主机移位寄存器的右边。

      (2)、时钟源由主机提供,产生的时钟驱动主机的移位寄存器进行移位,同时也经过SCK引脚输出,接到从机的移位寄存器中,上升沿进行移出数据到MOSI和MISO数据线上,下降沿时,将数据线上的数据移位到移位寄存器中。

      SPI的本质就是交换一个字节,完成数据传输,可以实现 a、发送一个字节; b、接收一个字节; c、发送和接收一个字节

SPI时序基本单元  

      (1)、起始条件:SS从高电平切换到低电平     下降沿通信的开始,上升沿通信的结束。

      (2)、终止条件:SS从低电平切换到高电平    从机的整个选中状态中,SS需要始终保持低电平  也就是通信时,SS为低电平。

     SPI共有四种操作时序模式,通过时钟极性(CPOL)和时钟相位(CPHA)配置   选择0或者1

     模式1  CPOL = 0 CPHA = 1   特点    如下图所示

     (1)、空闲状态时(也就是SS未进入低电平时),SCK为低电平   并且MISO必须置为高阻态。

     (2)、SCK第一个边沿移出数据,第二个边沿移入数据。

     (3)、SCK上升沿,主机和从机同时输出当前移位寄存器的最高位,SCK下降沿,主机和从机同时移入数据,进行采样。

     (4)、接下来就是重复上述过程,就可以完成数据交换。

     模式0  CPOL = 0 CPHA = 0   特点  (使用最多)   如下图所示

     (1)、空闲状态时,SCK为低电平。

     (2)、SCK第一个边沿移入数据,第二个边沿移出数据。

     (3)、这里也就是提前将数据移出,并没有等到SCK上升沿才开始移出数据,等上升沿的时候,已经开始移入数据了。

     (4)、接下来就是重复上述过程,就可以完成数据交换。

     模式0和3都是SCK上升沿采样(就是移入数据),模式1和2都是SCK下降沿采样,因为模式0和1,SCK默认是低电平,而模式2和3,SCK默认是高电平。

总结

通信适用设备

      (1)、支持串口通信的设备:(a)、USB转串口模块(CH340),将串口协议转为USB协议;(b)、陀螺仪传感器模块,带有串口引脚和ISC引脚;(c)、蓝牙串口模块 手机遥控单片机的功能

     (2)、支持I2C通信的设备:(a)、MPU6050模块,用于姿态测量;(b)、OLED显示屏模块;(c)、存储器模块;(d)、DS3231实时时钟模块

     (3)、支持SPI通信的设备:(a)、W25Q64 FLASH存储器;(b)、OLED显示模块;(c)、无线通信模块;(d)、SD卡

通信方式的选择

      (1)、SPI和I2C适用传输距离短,像触摸屏、OLED屏什么的,UART传输距离可以更长,程序设计相对简单。

     (2)、板级通信用I2C,SPI。 板间通讯用串口(环境理想情况下)。若通信环境不理想可以考虑差分信号,也就是串口转485或者CAN总线。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/712622
推荐阅读
相关标签
  

闽ICP备14008679号