参考[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协议里面也有些地方需要单端信号,需要共地