【STM32协议讲解】使用STM32CubeMX分析IIC、SPI和串口协议,附逻辑分析仪分析结果

这段时间也是在准备STM32单片机的八股文总结,面试常问的一些关于传感器协议部分的问题,常见的为UART、RS232、RS485、IIC和SPI等。因UART、RS485和RS232同属串口协议,故只分析UART协议。

本文主要是基于STM32CubeMx与正点原子的STM32F103精英学习板为实验基础,结合正点原子自产的逻辑分析仪进行波形分析。

参考博客:【逻辑分析仪的简单使用介绍(附带i2c、串口、spi数据分析)】

大纲

  • 一、IIC协议(以AT24C02为例)
  • 1.1 IIC原理分析
  • 1.2 STM32CubeMX + 24C02实验
  • 1.3 逻辑分析仪捕获IIC波形
  • 二、SPI协议
  • 2.1 SPI协议原理
  • 2.2 STM32CubeMX + W25Q128实验
  • 2.3 逻辑分析仪捕获SPI波形
  • 三、UART协议
  • 3.1 UART协议原理
  • 3.2 逻辑分析仪捕获串口波形
  • 四、面试常问问题总结
  • 4.1 IIC和SPI协议的区别?
  • 4.2 绘制IIC的时序图
  • 4.3 一个IIC最多支持多少传感器
  • 4.4 SPI有哪四种模式?
  • 4.5 UART、RS232与RS485的区别?逻辑电平一样吗?
  • 4.6 RS485与Modbus区别是什么?
  • 一、IIC协议(以AT24C02为例)

    参考:【IIC原理超详细讲解—值得一看】

    1.1 IIC原理分析

    1、IIC简单介绍:

    IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上IIC是为了与低速设备通信而发明的,所以IIC的传输速率比不上SPI

    IIC一共有只有两个总线: 一条是双向的串行数据线SDA,一条是串行时钟线SCL。
    SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的;
    SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的。

    IIC的特点:

  • IIC是真正的多主机总线,(对比SPI在每次通信前都需要把主机定死,而IIC可以在通讯过程中,改变主机),如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏;
  • IIC的标准通信速度为100KHz,最高400KHz;
  • SCL和SDA都是需要接上拉电阻(大小一般为3.3K-10K之间);
  • IIC是半双工,同一个时间只可以单向通信;
  • 为避免总线信号混乱,各设备连接到总线的输出端必须是漏极开路(OD),如果需要高电平,则需要使用外部上拉电阻
  • 2、IIC的协议层

    开始信号: SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
    结束信号: SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
    应答信号: 接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。

    IIC总线最多可以挂多少个设备由IIC地址决定,对于7位地址的IIC系统,2^7=128,但是地址0x00不用,那就是127个地址, 所以 理论上可以挂127个从器件

    但是IIC协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件
    总线之所以规定电容大小是因为,IIC的OD要求外部有电阻上拉,电阻和总线电容产生了一个RC延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险。传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以RC乘积必须更小。所以结论就是IIC总线挂载设备一般在8个以下。

    上面的是IIC数据传输的时序图,这个就是最基本,当我们用IIC协议的元器件是按照它的手册来书写正确的读写函数。

    1.2 STM32CubeMX + 24C02实验

    源程序代码:
    链接:https://pan.baidu.com/s/154nO2WNGbo0K5gLJivkcog?pwd=0wy9
    提取码:0wy9


    在生成的代码里面,采用的硬件IIC已经帮我们把初始化工作做好了,我们只需要加一个下面的代码

    #define ADDR_AT24C02_Write 0xA0
    #define ADDR_AT24C02_Read 0xA1
    uint8_t I2C_Buffer_Write[256];
    uint8_t I2C_Buffer_Read[256];
    uint16_t i;
    

    其实使用了下面的HAL库函数就可以简单的完成数据写入和读取。

    for(i=0; i<256; i++)
    {
    	I2C_Buffer_Write[i]=i;    /* WriteBuffer Initialization */
    }
    for(i=0; i<256; i=i+8){
    	if (HAL_I2C_Mem_Write(&hi2c1, ADDR_AT24C02_Write, i, I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8, 1000) == HAL_OK)
    	{
    		HAL_Delay(5);//写完以后需要延时5ms,这个不能少
    	}
    }
    HAL_I2C_Mem_Read(&hi2c1, ADDR_AT24C02_Read, 1, I2C_MEMADD_SIZE_8BIT, I2C_Buffer_Read,255, 1000);
    

    1.3 逻辑分析仪捕获IIC波形

    下面是我们烧录完程序,按下复位按键之后,可看到下面的波形,左边断断续续的波形是写入的逻辑,右侧是读取的逻辑。

    在写入的过程成要每个5ms再重新写,24C02规定写入的方式如下:

    根据波形我们可细致观察出来:起始信号、终止信号以及等待响应位。


    HAL_I2C_Mem_Read(&hi2c1, ADDR_AT24C02_Read, 0, I2C_MEMADD_SIZE_8BIT, I2C_Buffer_Read,256, 1000);采用的是随机读取的方式
    随机读并不是指在所有的地址中随机挑一个地址进行读取,而是按照给定的地址读取其中的数据。这个是24C02单独规定的,与IIC协议无关,IIC协议就是普通波形的变化。

    二、SPI协议

    参考:【SPI原理超详细讲解—值得一看】

    2.1 SPI协议原理

    1、什么是SPI?

    SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

    2、SPI主从模式
    SPI分为主、从两种模式,一个SPI通讯系统需要包含一个(且只能是一个)主设备,一个或多个从设备。提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写操作,都是由主设备发起。当存在多个从设备时,通过各自的片选信号进行管理。SPI是全双工且SPI没有定义速度限制,一般的实现通常能达到甚至超过10 Mbps

    3、SPI信号线

    SPI接口一般使用四条信号线通信:
    SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)

    MISO: 主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
    MOSI: 主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
    SCLK:串行时钟信号,由主设备产生。
    CS/SS:从设备片选信号,由主设备控制。它的功能是用来作为“片选引脚”,也就是选择指定的从设备,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。

    4、SPI数据发送接收
    SPI主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。

    首先拉低对应SS信号线,表示与该设备进行通信
    主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据
    这里要注意,SCLK时钟信号可能是低电平有效,也可能是高电平有效,因为SPI有四种模式,这个我们在下面会介绍

    主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。

    从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。

    SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

    5、SPI的4种不同的操作模式:

    SPI通信有4种不同的操作模式,不同的从设备可能在出厂是就是配置为某种模式,这是不能改变的;但我们的通信双方必须是工作在同一模式下,所以我们可以对我们的主设备的SPI模式进行配置(设置SCLK时钟信号线的那种信号为有效信号),通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式,具体如下:

    时钟极性(CPOL)定义了时钟空闲状态电平:

    CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
    CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时

    时钟相位(CPHA)定义数据的采集时间。

    CPHA=0,在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。,在第2个边沿发送数据
    CPHA=1,在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。,在第1个边沿发送数据

    根据波形,如何判断CPOL和CPHA的值呢?
    (1)空闲时间为低电平:CPOL = 0;空闲时间为高电平:CPOL = 1;
    (2)采集数据在第一个变化沿:CPHA = 0;采集数据在第二个变化沿:CPHA = 1。


    比如下面的波形,平时空闲状态处于低电平,CPOL=0;采集数据是在第一个变换沿,CPHA = 0;

    平时空闲状态处于低电平,CPOL=0;采集数据是在第二个变换沿,CPHA = 1;

    平时空闲状态处于高电平,CPOL=1;采集数据是在第一个变换沿,CPHA = 0;

    平时空闲状态处于高电平,CPOL=1;采集数据是在第一个变换沿,CPHA = 1;

    当然对于特点的SPI通信类型的传感器都是特定支持的SPI模式:

    比如W25Q128支持的模式:

  • CPOL = 0,CPHA = 0;
  • CPOL = 1,CPHA = 1;
  • 主从设备必须使用相同的工作模式——SCLK、CPOL 和 CPHA,才能正常工作。如果有多个从设备,并且它们使用了不同的工作模式,那么主设备必须在读写不同从设备时需要重新修改对应从设备的模式。以上SPI总线协议的主要内容。

    是不是感觉,这就完了? SPI就是如此,他没有规定最大传输速率,没有地址方案,也没规定通信应答机制,没有规定流控制规则
    只要四根信号线连接正确,SPI模式相同,将CS/SS信号线拉低,即可以直接通信,一次一个字节的传输,读写数据同时操作,这就是SPI
    些通信控制都得通过SPI设备自行实现,SPI并不关心物理接口的电气特性,例如信号的标准电压。

    2.2 STM32CubeMX + W25Q128实验

    参考例程:链接:https://pan.baidu.com/s/1UX6Sx9i7vDclcglYV47WnA?pwd=w9z1
    提取码:w9z1




    在主程序中初始化完成后,然后查询ID:


    在查询ID的函数中,首先使能CS片选信号(拉低PB12引脚),然后发送4个字节{0x90, 0x00, 0x00, 0x00}以查询SPI传感器器件的地址,MISO线上发送0x00,MOSI线上发送具体的4个字节。

    其发送时的图像如下所示,CPOL=1,CPHA=1。第一个沿时发送,第2个沿时采样(正好一个周期内)

    2.3 逻辑分析仪捕获SPI波形

    参考:

  • 【STM32】HAL库 STM32CubeMX教程十四—SPI
  • CPOL = 0,CPHA = 0;

    CPOL = 0,CPHA = 1;(不正确的)

    CPOL = 1,CPHA = 0;

    三、UART协议

    参考:【通信协议详解(一):UART串口(协议 + 数据格式 + 设计实现)】

    3.1 UART协议原理

    通用异步收发器UART(Universal Asynchronous Receiver/Transmitter),是一种串行、异步、全双工的通信协议,将所需传输的数据一位接一位地传输,在UART通讯协议中信号线上的状态位高电平代表’1’,低电平代表’0’。其特点是通信线路简单,只要一对传输线就可以实现双向通信,大大降低了成本,但传送速度较慢。

    在串口通信中,尤其需要关注的是数据流以及波特率。一个数据流由10个数据位组成,包含1位起始位,7位有效数据位,1位奇偶校验位,1位停止位。uart串口信号线上空闲时常驻高电平,当检测到低电平下降沿时认为数据传输开始,到停止位时数据传输结束,一共10位数据位组成一个数据包。

    起始位: 通信线路上空闲时为“1”,当检测到“0”即下降沿时,认为数据传输开始
    有效数据位: 传输开始后传递的需要接收和发送的数据值,可以表示指令或数据
    奇偶校验位: 奇偶校验,通过来校验传输数据中“1”的个数为奇数个(奇校验)或偶数个(偶校验)来指示传输数据是否正确
    停止位: 数据传输结束,传输线恢复常“1”状态
    此外,还需关注数据传输波特率,波特率表示一秒内传输了多少个码元数量,一般波特率为300,1200,2400,9600,19200,38400,115200等。例如9600 Baud表示一秒内传输了9600个码元信息,当一个码元只含1 bit信息时,波特率=比特率。

    传输数据时先传送字符的低位,后传送字符的高位。即低位(LSB)在前,高位(MSB)在后。

    3.2 逻辑分析仪捕获串口波形

    四、面试常问问题总结

    4.1 IIC和SPI协议的区别?

    参考:【SPI与IIC通信协议对比篇】

    4.2 绘制IIC的时序图

    4.3 一个IIC最多支持多少传感器

    IIC总线最多可以挂多少个设备由IIC地址决定,对于7位地址的IIC系统,2^7=128,但是地址0x00不用,那就是127个地址, 所以 理论上可以挂127个从器件
    但是IIC协议没有规定总线上device最大数目,但是规定了总线电容不能超过400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件
    总线之所以规定电容大小是因为,IIC的OD要求外部有电阻上拉,电阻和总线电容产生了一个RC延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险。传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以RC乘积必须更小。所以结论就是IIC总线挂载设备一般在8个以下。

    4.4 SPI有哪四种模式?

    4.5 UART、RS232与RS485的区别?逻辑电平一样吗?

    参考:【UART和RS232、RS485的联系和区别、以及对软件编程的影响】

    主要是定义逻辑1和逻辑0引脚电平的区别

    通信协议 UART RS232 RS485
    逻辑电平 +5V为逻辑1,0表示逻辑0 逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15V 两线间的电压差为+2v到+6v表示逻辑“1”,两线间的电压差为-2v到-6v表示逻辑“0”
    通信方式 全双工 全双工 半双工
    传输距离 1m以内 15米以内 1500米
    特点 RS232接口在总线上只允许连接1个收发器,不能支持多站收发能力,所以只能点对点通信,不支持多点通讯。 RS485接口在总线上是允许连接多达128个收发器。即具有多站通讯能力,这样用户可以利用单一的RS485接口方便地建立起设备网络。最高传输速率为10Mbps

    (1)狭义上的串口:指的是串口协议,就是时序图、数据收发先后顺序等,是抽象出来的协议;
    (2)广义上的串口:指的是符合串口协议的接口,UART、RS232、RS485在实际工作中都叫做串口;
    (3)UART:主要指的是Soc端的串口控制器和引脚,也是串口编程主要考虑的;
    (4)RS232和RS485是在两个Soc的串口引脚相连的中间电路,负责做转换,解决传输距离和电压不匹配的问题;

    4.6 RS485与Modbus区别是什么?

    参考:【485通讯与MODBUS的区别与联系】

    RS485是一个工业常用的物理接口,是物理层的硬件设备(串口)。
    Modbus是一种国际标准的通讯协议,一般用于不同厂商设备之间进行数据交换,是应用层的软件协议,不能自己单独存在,必须要依赖于硬件设备作为实现平台。

    两台设备之间通过Modbus协议传输数据,需要硬件接口,于是就有了RS232\RS422\RS485等,其中RS485传输距离远,成为现在最主流的工业现场硬件接口。

    Modbus按照一般维度分为Modbus Rtu、Modbus ASCII、Modbus TCP三种模式。协议分为硬件协议和软件协议。而通讯协议属于软件协议,它包含报头包围的格式,MODBUS是应用层的通讯协议,主要用于传送和接收文件包的格式。而RS232,RS485是物理层的串行接口,它可以支持几十种通讯协议,MODBUS只是其中的一种。

    作者:李白不爱吃红烧肉

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32协议讲解】使用STM32CubeMX分析IIC、SPI和串口协议,附逻辑分析仪分析结果

    发表回复