STM32初学入门笔记(4):一文解析常见通信协议(USATR/UART,SPI,IIC)

学习STM32就不得不接触通信问题,本篇将讲解常用的通信协议基础

STM32自学交流及程序示例Q_qun:659512171

基本知识:

并行通信、串行通信

        并行通信顾名思义就是多个数据位并在一起发送,主要有8线,16线,32线,64线等方式

        串行通信是指设备间通过少量的数据线将数据位单个发送的方式,我们生活中常用此种方式通信

        不难看出,相同传输速率下,并行通信传输的数据量要大于串行通信,但由于要使用较多的数据线,所以在硬件成本上不如串行通信,今天讲解的均为串行通讯协议

同步传输、异步传输

        同步通信 发送端在发送串行数据的同时,提供一个时钟信号,并按照一定的协议(如在时钟信号的上升沿将数据发送出去)发送数据,接收端根据发送端提供的时钟信号以及协议接收数据。如:I2C、SPI等有时钟信号的协议,都属于这种通信方式

        异步通信: 没有时钟信号的辅助,接收方并不知道数据什么时候会到达,收发双方有各自的时钟。发送方发送的时间间隔可以不均,接收方是在数据的起始位和停止位的帮助下实现信息同步的。这种传输通常是很小的分组,比如:一个字符为一组,数据组配备起始位和结束位。这种传输方式的效率是比较低的,因为额外加入了很多的辅助位作为负载,常用在低速的传输中。

全双工,半双工,单工

        全双工:在进行通信时可以实现同时接收与发送

        半双工:通信的设备均可以收发数据,但无法实现同时收发,可以分时收发

        单工:通信设备只能发送/接收,即固定一个设备为发送,另一个设备为接收

一,USART通信:

        与USART相对的还有一个UART,而UART通信相较于USART只不过是砍掉了一个同步通信功能,其余功能并无太大差异,根据具体场景选用即可
通讯协议可分为物理层协议层
物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。
协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。

物理层:

        USART最简单有三根线(默认共地,如不是还需加一根GND),TXD,RXD与SCLK(仅同步通信时使用),常用的有TTL,RS-232电平标准,STM32使用的为TTL标准,一般用于通过USB-TTL连接电脑进行测试(在上一篇博文里就使用了USART连接电脑发送ADC信息),以及连接串口模块(如ESP8266wifi模块),连接USART通信时需要TXD,RXD反接,如果两个设备是不同的电平标准,还需要接转换器

 协议层:

        通信协议一般包括三个方面:
        时序,数据帧格式,传输速率,因为时钟线一般不使用,所以不考虑时序

数据格式:

同步:

                 

异步:

        波特率:异步通讯中由于没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。常见的波特率为4800、9600、115200 等。

        有效数据:在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7 或8 位长。

        数据校验:在有效数据之后,有一个可选的数据校验位。校验的目的是为了解决由于数据通信受到外部干扰导致传输数据出现偏差。校验方法有奇校验偶校验0 校验1 校验无校验

        奇校验要求有效数据和校验位中 1 的个数为奇数,比如一个8 位长的有效数据为:10101101,此时总共有5 个 1,本身已是奇数个1,校验位就为 0,如果数据为:11011000,为了使数据位+校验位1的总数为奇数个,校验位就为 1。

        偶校验与奇校验要求刚好相反,要求帧数据和校验位中 1 的个数为偶数,比如数据帧:10101101,此时数据帧 1 的个数为5 个,所以偶校验位为 1 。

        0 校验是不管有效数据中的内容是什么,校验位总为 0 ,1 校验则是校验位总为 1 。

二,SPI通信: 

        SPI通信属于串行通信,通常有4根线,SCK时钟线MOSIMISOCS片选线

        CS片选线低电平表示选择从机 

        对于SPI通信,MOSI和MISO无需反接,具体原因如下:

        MISO : Mast In Slave Out,即主机是输入,从机是输出

        MOSI : Mast Out Slave In,即主机是输出,从机是输入

        所以说主机MISO从机MISO主机MOSI从机MOSI,不能反接

        只需看SPI的通信引脚便可发现,SPI是支持全双工通信模式的,同时SPI的传输速率较快,可达到 Mbps 级(SPI速度主要取决于电路与CPU的处理能力,但几Mbps还是可以轻松达到的)所以常用来传图片,大文件等,但SPI会占用主机较多的引脚,只支持单主机。

SPI基本结构:

         从理论上讲,SPI支持不限量的从机,但实际由于IO口数量及数据线负载电容的关系,并不能实现无限扩展

        另外当主机只有一个IO口时,可以使用 “菊花链” 式连接


        在菊花链模式下,通过配置从机使得所有从机的片选信号共用一个,数据从一个从机传播到下一个从机。主机连接到第一个从机,主机向该从机提供数据,该从机向下一个从机提供数据,依此类推直到最后一个从机。

        在这种方法中,当数据从一个从机传播到下一个从机时,传输数据所需的时钟周期数与菊花链中的从机位置成正比。例如,图中在8位系统中,需要24个时钟脉冲从机3才能获取到数据。而如果使用常规连接方式,第三个从机只需要8个时钟脉冲就可获取到数据,而且并非所有SPI器件都支持菊花链模式,所以菊花链除非资源紧张不会使用。

        相较于菊花链,我开发出另一种占用同样较少但性能不损失的方式,就是使用移位寄存器来控制CS片选,下面将对此种方式进行讲解:

        上图是一个3位的串行转并行移位寄存器,Q0,Q1,Q2分别接3个从机的CS脚,串行输入拉高,初始时先清零,然后给三个移位脉冲使寄存器设为111。接着把串行拉低,即 0 ,给一个移位脉冲后把串行输入拉高,此时寄存器状态为 110,接着只需要确定控制哪个从机然后输出对应脉冲就好了,例如,要控制从机2,就只需要再给一个脉冲使寄存器状态为 101(由于串行输入置高所以后面的位为1),再进行SPI通信即可,如果要控制从机1就无需再给脉冲,(相当于把110左移 n 位使对应从机置 0 其余置 1)如果需要更多从机以此类推增加寄存器位数就好了

        此方式的通信性能与第一种一个片选对应一个IO方式相同,只是将一个CS对应一个IO换成了寄存器(其实就是利用寄存器拓展单片机IO口的原理,在其他IO紧张的场合也适用,另外,选用并行转串行的寄存器还可实现IO口的输入的拓展)

SPI时序:

         可以看出,时钟分为两种极性,0和1,而每一种极性又可以分为两个相位,总共有4种模式

时钟极性:

        0:表示时钟空闲状态为低电平

        1:表示时钟空闲状态为高电平

相位:

        0:表示数据在时钟的上升沿采样,下降沿切换

        1:表示数据在时钟的下降沿采样,上升沿切换

模式:

        模式0:时钟极性为0,表示时钟空闲状态为低电平,相位为0,表示数据在时钟的上升沿采样,下降沿切换

        模式1:时钟极性为0,表示时钟空闲状态为低电平,相位为1,表示数据在时钟的下降沿采样,上升沿切换

        模式1:时钟极性为1,表示时钟空闲状态为高电平,相位为0,表示数据在时钟的上升沿采样,下降沿切换

        模式1:时钟极性为1,表示时钟空闲状态为高电平,相位为1,表示数据在时钟的下降沿采样,上升沿切换

三,IIC总线通信:

        IIC通信属于串行通信,只有两根信号线,SCL时钟线SDA数据线

        IIC总线通信可以在总线上挂载多个设备,通过地址区分,无需像SPI一样需要片选信号连接,具有很强的可拓展性,但并不是可以无限增加,IIC的上限取决于总线上的电容负载,即每个接口的等效电容总和,一般上限为400pf,同时IIC总线允许多主器件,任何支持发送和接收的设备都可以成为主设备,可以决定IIC的传输与时钟线频率,同一时间点上只能有一个主设备

        IIC的缺点就是传输速率相对SPI较低(普通模式100kbit/s,高速模式400kbit/s)且不支持全双工模式。

IIC总线的基本结构:

        IIC总线只有两条信号线,一条是双向的串行数据线SDA,另一条是串行时钟线SCL。SDA和SCL都是双向的,IIC总线上的各器件的数据线都接到SDA线上,IIC总线上的各器件的时钟线都接到SCL线上。

        每个连接到IIC总线上的器件都有一个唯一的地址,扩展时受到器件地址数量的限制。总线结构如下图所示:

        

IIC总线的信号:

        IIC 总线在传送数据过程中一共有三种类型的信号:开始信号结束信号应答信号

        起始信号:SCL 串行时钟线为高电平时,SDA 线由高电平向低电平的变化表示起始信号。

        终止信号:SCL 串行时钟线为高电平时,SDA 线由低电平向高电平的变化表示终止信号。

        应答信号:主机每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由从机反馈一个应答信号。当应答信号为低电平时,规定为有效应答(ACK,简称应答位),表示从机已经成功地接收了该字节,当应答位为高电平时,规定为非应答信号(NACK),表示从机没有成功接收该字节。
        对于反馈的有效应答信号ACK的要求是:从机在第9个时钟脉冲之前的低电平期间将数据线SDA拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果主机是接收方,则在主机收到最后一个字节后发送一个NACK信号,以通知从机数据发送结束,并释放数据线SDA,以便从机发送停止信号P。

 IIC总线数据的有效性:

        IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态允许变化。 也就是说当时钟为高电平时,数据线电平(即数据)只有稳定才生效,当时钟线为低电平时,数据线上的电平允许发生改变。

IIC总线的数据格式:

         可以看到,传输的数据中不仅有数据与应答位,还有设备地址,设备地址只由主机发出,当任何从设备受到起始信号时都必须释放总线以接收地址。每个数据字节后都有一个应答位。

------------------------------------------------------- 完 -------------------------------------------------------

都看到这里了点点关注再走呗

 交流Q群:659512171

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值