基于STM32通信协议(串口、I2C、SPI)

参考[9-1] USART串口协议_哔哩哔哩_bilibili

单工、半双工、全双工

单工:数据传输只支持数据在一个方向上传输;       

只能A给B讲话;

半双工:数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;       

A、B都能讲,同一时刻只能一个人讲话,A给B讲话时,B不能讲;B给A讲话,A不能讲;

全双工:数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

A、B同一时刻都能讲;

时钟

异步:无时钟线,所以需要双方约定一个采样频率,并且还需要加一些帧头帧尾等,进行采样位置的对齐

同步:有单独的时钟线,时钟特性:同步,接收方可以在时钟信号的指引下进行采样

电平

差分信号:使用差分信号可以极大地提高抗干扰特性,所以差分信导般传输速度和距离都会非常高,性能也是很不错的
 

设备特性

点对点:只有两个人,直接传输数据就可以

多设备:可以在总线上挂载多个设备的;多设备就相当于老师在教室里。面对所有同学谈话

多设备有一个需要有一个导址的过程,以确定通信的对象

串口通信协议

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信(点对点)

单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力

硬件电路

TX和RX是单端信号,它们的高低电平都是相对于GND的,所以严格止来说,GND应该也算是通线

信线所以,串回通信的TX、RX、GND是必须要接的

上面的VCC,如果两个设备都有独立供电,VCC可以不接。如果一个设备没有供电,比如这里设

备1是STM32,设备2是蓝牙串口模块STM32有独立供电,蓝牙串回没有独立供电那就需要把蓝牙

串口的VCC和STM32的VCC接在起,由STM32向子模块供电当然供电的电涯也需要注意下,要按

照子模块的要求来。

电平标准

在硬件电路上,协议规定是,一个设备使用TX发送高低电平,另一个设备使用RX接收高低电平

在线路中,使用TL电平因为STM32是3.3V的器件。所以如果线路对地是3.3V,就代表发送了逻辑1

如果线路对地是0V,就代表发送了逻辑0
 

 串口参数及时序

波特率:每秒发送几位;1000bps,那就表示,1s要发1000位,每位的时间就是1ms(发送D0需要1ms)

起始位:表示传输开始,低电平

停止位:停止位固定为1,把引脚恢复成高电平

数据位:发送0x0F: 0000 1111 波形如下(低位先行)

 校验位:奇偶校验;校验可以选择种方式。无校验、奇校验和偶校验

无校验 时序如图

奇校验和偶校验 时序如图

 

 如果使用了奇校验,那么包括校验位在内的9位数据会出现奇数个1

如:发送 0000 1111,偶数个1,需要在校验位补一个1保证奇数:0000 1111 1

        发送 0000 0111,奇数数个1,需要在校验位补一个0保证奇数:0000 0111 0

偶校验同理

串口时序

其中第一个波形:

 这个波形是发送一个字节数据0x55时, 在TX引脚输出的波形,波特率是9600。所以每一位的时

间就是1/9600,大概是104us

解析:没发送数据的时候,是空闲状态高电平,数据帧开始。先发送起始位,产生下降沿,代表数

据帧开始数据0x55转为二进制0101 0101,低位先行,就是依次发送1010 1010。8位数据,1位停

止,无校验。

偶校验位波形:

 总结:

总结下就是,TX引脚输出定时翻转的高低电平,RX写脚定时读取引脚的高低电平每个字节的数据

加上起始位、停止位、可选的校验位,打包为数据帧,依次输出在TX引脚,另端RX引脚依次接

收。这样就完成了1Byte(字节)=8bit(比特)数据的传递。

USART

USART

TX (Transmit Exchange)是数据发送脚

RX (Receive Exchange)是数据接收脚

异步:无时钟线,所以需要双方约定一个采样频率,并且还需要加一些帧头帧尾等,进行采样位置的对齐

电平特性:单端;也就是它们引脚的高低电平都是对GND的电压差,所以弹端信号通信的双方必须要共地,就是把GND接在起

简介

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器

(串口通信的硬件支持电路)

USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里

自带波特率发生器,最高达4.5Mbits/s        类似分频器

可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)

可选校验位(无校验/奇校验/偶校验)

支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN

STM32F103C8T6 USART资源: USART1、 USART2、 USART3

原理框图主要部分

                                                                    

                                         

 USART基本结构

结构图分析参考[9-2] USART串口外设_哔哩哔哩_bilibili19:38

P26        19:38

数字帧

9位字长,有校验:

 8位字长,无校验:

常用1位停止位

起始位侦测

[9-2] USART串口外设_哔哩哔哩_bilibili         P26        26:10 解析

首先输入的这部分电路对采样时钟进行了细分,它会以波特率率的16倍额率进行采祥,也就是在一位的时间里,可以进行16次采样。根据这16次采样进行侦测,判断起始位、噪声,并在8、9、10次采样进行对其中间对其起始位正中间之后。接收数据位时,就都在第8、9、10次,进行采样。这样就能保证采样位置在位的中间了。

这就是起始位侦测采样位置对齐的策略。

检测噪声数据采样

已经对齐过,因此在第8、9、10次采样数据位,采样3次,没有噪声的理想情况下,这3次肯定全为1或者全为0。全为1,就认为收到了1,全为0,就认为收到了0。如果有噪声,导致B次采样不是全为1或者全为0。那它就按照2: 1的规则来,2次为1,就认为收到了1;2次为0,就认为收到了0。在这种情况下,噪声标志位NE也会置1,告诉你,我收到数据了,但是有噪声,你悠着点用。

波特率发生器

USART1时钟

DIV:分频系数

代码框架(串口发送、接收代码逻辑):

串口发送:

//第一步。开启时钟,把需要用的USART和GPIO的时钟打开

//第二步。GPIO初始化。把TX配置成复用输出,RX配置成输入

//第三步。配置USART,直接使用个结构体

//第四步。如果你只需要发送的功能就直接开启USART,初始化就结束了(需要接收,配置中断)

串口发送+接收:

//查询: 在发送基础上初始化开启RX引脚PA10,模式开启RX

//中断:

1.USART_ITConfig

2.开启RXNE标志位到NVIC的输出 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

3.中断函数 USART1_IRQHandler

HEX、文本数据包接收

开启时钟

初始化结构体 GPIO和NVIC

启动

发送函数,调用库函数

(中断函数)状态机逻辑(包头、包尾、数据的判断)

和HEX区别:可变包长,含包头包围     数据类型不同

I2C通信

SCL (Serfial Clock)串行时钟线                

SDA (Serfial Data)串行数据线

同步:有单独的时钟线,时钟特性:同步,接收方可以在时钟信号的指引下进行采样

电平特性:单端;也就是它们引脚的高低电平都是对GND的电压差,所以弹端信号通信的双方必须要共地,就是把GND接在起

简介

I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线

两根通信线:SCL(Serial Clock)、SDA(Serial Data)

同步,半双工

带数据应答

支持总线挂载多设备(一主多从、多主多从)

硬件电路

所有I2C设备的SCL连在一起,SDA连在一起

设备的SCL和SDA均要配置成开漏输出模式

SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

解释:(开漏输出模式与上拉电阻

类似一个弹簧(电阻)吊着的杆子,只能下拉输出低电平,然后放手靠弹簧弱上拉高电平

所有的设备都只能输出低电平而不能输出高电平;

第一,完全杜绝了电源短路现象,保证电路的安全(所有人拉杆子、或者放手都不会强拉、强推)

第二,避免了引脚模式的频繁切换。

开漏加弱上拉的模式,同时兼具了输入和输出的功能(你要是想输出,就去拉杆子或放手,操作杆子变化就行了。你要是想输入,就直接放手,然后观察杆子高低就行了)

第三,就是这个模式会有一个“线与”的现象。

时钟一个低全低,总线全高才是高


I2C时序基本单元(软件)

[10-1] I2C通信协议_哔哩哔哩_bilibili     P31        22:27   

起始条件:SCL高电平期间,SDA从高电平切换到低电平

终止条件:SCL高电平期间,SDA从低电平切换到高电平

起始:SCL高电平SCL处于高电平不去动它,然后把SDA拽下来,产生一个下降沿。当从机捕获到这个SCL高电平,SDA下降沿信号时,就会进行自身的复位,等待主机的名唤。

        然后在SDA下降沿之后,主机要再把SCL拽下来。拽下SCL,一方面是占用这个总线,另一方面也是为了方便我们这些基本单元的拼接。就是之后我们会保证,除了起始和终止条件,每个时序单元的SCL都是以低电平开始,低电平结束。

 终止:SCL先放手,回弹到高电平,SDA再放手,回弹高电平,产生个上升滑,这个上升沿触发终止条件,同时终止条件之后,SCL和SDA都是高电平。回归到最初的平静状态。

(一主多从)在总线空闲状态时,从机必须始终双手放开,不允许主动跳出来,去碰总线。总线只有主机能碰。

发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行B7-B0),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

串口是低位先行

 发送        在这个单元里,SCL和SDA全程都由主机掌控(实线),从机只能被动读取

接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA(应答位))

接收       在这个单元里,SCL全程由主机掌控(实线),SDA实线主机控制,虚线从机控制,主机在接收之前,需要释放SDA

发送应答(从机还发不发?)主机接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答。        0从机继续发,1主机不想要,从机交出SDA控制权

接收应答(从机接收到没有?):主机发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

(电阻弱上拉高电平)

这个场景就是,主机区发送一个字节,然后说,有没有人收到啊。我现在把SDA放手了哈。如果有人收到的话,你就把SDA拽下来,然后主机高电平读取数据。 发现,唉,确实有人给它拽下来了。(0从机收到,1从机没收到)

I2C时序

 指定地址

 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

这个数据帧的目的就是,对于指定从机地址为1101 000的设备,读写位 0(读1 写0),在其内部0x19地址的寄存器中,写入0xAA这个数据        (应答位RA)

指定地址

对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)

这个数据帧的目的:

        前半段        对于指定从机地址为1101 000的设备,读写位 0(0xD0),指定其内部0x19地址的寄存器

        后半段        对于指定从机地址为1101 000的设备,读写位 1(0xD1),读取指定内部寄存器内容为0xAA

注:指定地址写的指定地址部分,加上 ‘ 当前地址读 ’ 的读取部分。

Sr (Start Repeat)的意思就是重复起始条件;拼接处(因为前一段时序已经指定了写操作 0,需要重新指定读操作 1)(指定读写标志位只能是跟着起始条件的第一个字节)

图解释:前面的部分是指定地址写,但是只指定了地址,还没来得及写

 因为前面指定了地址,因此后面再调用当前地址读,就是指定地址读

当前地址读 (此方法不常用,因为选完从机后,读写给读1,直接发送(要读的)数据,不能指定从机寄存器地址)

对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

读写数据帧对比

写数据 0

读数据 1

读写对比

代码框架

1.这里。我们首先建立2C通信层的.c和.h模块
在通信层里,写好I2C底层的GPIO初始化和6个时序基本单元,也就是起始、终止,发送、接收一个字节,发送应答和接收应答
2.写好I2C通信层后,我们再建立MPU6050的.c和.h模块,在这一层我们将基于I2C通信的模块,来实现指定地址读、指定地址写,再实现与寄存器对芯片进行配置,读寄存器得到传感器数据
3.最终在main.c里,调用MPU6050的模块。初始化,拿到数据,显示数据



 

SPI通信

SCLK (SerialClock)是时钟                

MOSI (Master output Slave Input)是主机输出数据脚

MISO (Master Input Slave output)是主机输入数据脚

CS (Chip select)是片选,用于指定通信的对象

同步:有单独的时钟线,时钟特性:同步,接收方可以在时钟信号的指引下进行采样

电平特性:单端;也就是它们引脚的高低电平都是对GND的电压差,所以弹端信号通信的双方必须要共地,就是把GND接在起

读写数据帧对比

写数据 01

读数据 10

读写对比

CAN通信

CAN_H、CAN_L 这两个是差分数据脚,用两个引脚表示一个差分数据

异步:无时钟线,所以需要双方约定一个采样频率,并且还需要加一些帧头帧尾等,进行采样位置的对齐

电平特性:差分信号;它是靠两个差分引脚的电压差来传输信号的(使用差分信号可以极大地提高抗干扰特性

数据帧

感觉通信协议其实大同小异,都差不多:可以分成三步

1.寻址,并且说明要干嘛(读写)

2.数据

3.校验和结束

USB通信

DP、DM(D+、D-)一对差分数据脚

 异步:无时钟线,所以需要双方约定一个采样频率,并且还需要加一些帧头帧尾等,进行采样位置的对齐

电平特性:差分信号;它是靠两个差分引脚的电压差来传输信号的(使用差分信号可以极大地提

高抗干扰特性)        不过USB协议里面也有些地方需要单端信号,需要共地

猜你喜欢

转载自blog.csdn.net/qq_42241352/article/details/132459684