【【无用的知识之串口学习】】

无用的知识之串口学习

USART串口协议
•通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统
•通信协议:制定通信的规则,通信双方按照协议规则进行数据收发

就是我们并不能在芯片上设计完全部的一下子完成所有的设计,我们总需要一些外设 所以需要学会通信接口 掌握通信协议来沟通 STM32芯片与其他外设
就像是你要去作弊 你和好朋友会约定一个口号比如说咳嗽为信号 这就是通信 另外 你们相约1根手指为A 2根手指为B 3根手指为C 等等 这就是通信的规则 也叫通信协议

对于第一种USART 它有两种引脚 TX RX TX是发送端 RX是接收端 有的地方也叫TXD RXD 这两种其实是同一种东西
全双工指的是通信双方可以同时相互传递信息 只有一根数据线叫半双工 或者说不能叫只有一根数据线 因为可能两根数据线组合成一种大的数据线
在我们这里判断时序的变化 因为 I2C 和 SPI有单独的时钟线 所以是对于它们两者来说时钟是同步的
单端信号引脚的高低电平都是对GND的电压差 所以准确的来说 前三个情况下 其实都要加一个GND 没有GND 是无法实现通信的
而下面两个是靠差分信号的电压差来控制电平的 所以并不需要加GND 而USB在使用中有些时候还是需要添加GND的 使用差分信号 可以极大的提高信号的抗干扰能力
而最后一列的设备选项是这样的 点对点指的是 从一个设备到另一个设备点对点的传输 而 多设备指的是 举个例子 就像是在教室里 老师给一群学术讲课

串口通信
•串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信
•单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力

USART 串口通信选取的各个引脚
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

TTL电平:+3.3V或+5V表示1,0V表示0
RS232电平:-3-15V表示1,+3+15V表示0
RS485电平:两线压差+2+6V表示1,-2-6V表示0(差分信号)

一般来说整个数据帧中会有2种情况 一种是数据帧一共有10位 还有一种数据帧有11位 其中区别就在于是否在数据位第八位后添加一个奇偶校验位
串口的主要参数需要注意的
•波特率:串口通信的速率
•起始位:标志一个数据帧的开始,固定为低电平
•数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
•校验位:用于数据验证,根据数据位计算得来
•停止位:用于数据帧间隔,固定为高电平

起始位是这样得来的,就是我们把空闲状态全部视为高电平1 而后的起始位必须是低电平0 用来打破这种高电平的垄断
停止位: 也是如此 ,必须固定是高电平 1 用来表示真正的结束
校验位的作用是算上你发送的数据使得数据与校验位有奇数个1 这就是奇校验

这个发送和接收寄存器 占据了同一个地址 其实他的逻辑分为了两部分 发送数据寄存器和接收数据寄存器
其实就是你在写的时候相当于写入了TDR这样的发送数据寄存器 而当你接收的时候 你会使用它的接收数据寄存器RDR其实他是2个东西

举一个简单的例子
假如我们所暂时写入的数据是01010101
之后我们会检测发送移位寄存器有没有东西还占用着如果没有数据会立刻被移入这个发送移位寄存器中
当这个TDR吧东西移动到发送移位寄存器时,会置一个标志位TXE (TX Empty) 发送寄存器空 如果这个标志位为1 了 那么就表示我们上面的这个TDR是空的 可以继续往发送数据寄存器内写入数据

只要数据是从 TDR 进入发送移位寄存器后 TXE 就会被置为1

CTS和RTS 其实和上面的TX RX其实是差不多的 主要是 交差使用来保证 合理的流式传输速度 以什么样的速率发送 以何种速率接收

这里就表示 我发送和接收都有他规定的引脚口 你不能瞎写 有些还有机会进行重映射 重新选取其他端口的机会

因为起始位的侦测 确确实实是在需要检测到我们在空闲状态到起始位完成一个从1到0的跳变 就高电平到低电平的变化 我们就需要对整个 数据进行采样按照他的要求在按照间隔 确认出 何为上升 何为下降

差不多得了 我们接下来看IIC 实验

STM32----I2C通信协议

我们会发现I2C有两根通信线: SCL和SDA
同步 半双工
带数据应答
支持总线挂载多设备(一主多从,多主多从)
硬件电路
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

左边的CPU就是主机,他的权力很大包含了对SCL线的完全控制,任何时候都是主机完全掌控SCL线

从机的权利比较小,不允许任何时刻控制SCL总线

另外在空闲状态下,主机可以主动发起对SDA的控制.
从机 不允许主动发起对SDA的控制

只有在从机发送数据和从机应答的时候主机才会转交SDA的控制权给从机

就好比这些是挂在在I2C总线上的从机

我们在观察这个图中可以看出这几个特点

假设我们没有这两个电阻

对于SCL端 其实是非常容易控制的
因为主机掌控了对SCL端的完全控制权
但是对于SDA 并不是很好的处理
因为有些时候从机会发送 主机会接收
从机接收 主机发送
所以如果仅此而已 可能会在某些形式上
为了避免主线没协调好导致短路的问题
I2C的设计是禁止所有设备输出强上拉的高电平
采用外置弱上拉电阻和开漏输出的电路结构
就是怎么通俗易懂的解释呢 ,

这属于是强上拉和强下拉的输出模式
直接接入地和电源Vcc 那么直接接入的上拉 和下拉就会直接沟通电源或者是地 这样来说并不安全
那么我们如果把上拉的电源切断 换成浮空态的话 那么就会对我们的电路 产生一个保护作用
简称浮空态

我们会发现这样的做法会对我们的电路起到一定的保护作用

我们现在增加一个上拉电阻 就会实现其他不一样的功能
就像是一根杆子但是上面增加了一个弹簧
我们规定所有人只能向下拉杆子
或者放手(放手就相当于给置为低电位0)输出高电平 因为有根弹簧的存在它会自己回弹到悬空态 这相对于低电位0 肯定是高的,但是又不是很高 所以我们称其为弱上拉
这样就完全杜绝了短路的现象
第二 避免了引脚模式的频繁更换

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

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

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

因为就像是上面所说的 主机牢牢把控着SCL 在SCL低电平的时候 ( 主机控制的) 然后主机在将数据依次放到SDA线上 再释放SCL 像弹簧一样回弹到高电平 从机会自动读取SDA的数据 所以这里就要求我们SCL为高 SDA不允许有数据变化
在这种情况下,SCL与SDA全部由主机控制

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

在我们这里是这个意思
首先我们需要明白一个道理 我们总是控制着主机的 考虑也是基本上只说主机
我们先把SCL拉至低电平(完全由主机控制) 然后从机会把数据依次放到SDA线上 再释放SCL 释放的意思就是我不用手拉着了 嗖的一声回弹上去了 变成了高电位 这就是所说的释放的概念 主机接着会在SCL高电平期间进行数据读取 在SCL为高 就是主机读取的阶段并不允许 数据有所变化
另外注意点是 主机在开始接收之前,需要提前释放掉SDA 因为对我们来说 因为是一根线线与的关系 你放手了 让别人拉这根杆子 他才会传递不同的信息给你

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

怎么解释呢
我们首先需要明确的观点是
当SCL拉低时候 是在传输数据 (不管是主机把数据传送到SDA上,还是从机把数据放到SDA上 ,这里我们可以在具体实践中通过代码控制)
在SCL为高的时候 ,总是在读取数据(要么是主机读取SDA 要么是从机读取SDA)

我们现在以接收应答为例
就像是我们发送一个东西 之后马上判断是否有人收到了
就是这样我们先把SCL拉低(主机 开始操作发送数据) 接下来需要释放掉SDA 因为只有释放掉SDA 从机才能操作SDA 接下来SCL为高进入读取阶段 那么我们如果SDA响应了被拉下那么是不是 相当于我们读取到的是数据0 应答成功 如果是没有接收到就会处于拉高模式就是1 表示非应答
这是我之前在江科大看到的既然是作为总结性质的叙述 再介绍一下充满乐趣的正点原子的设计

① 起始信号
当 SCL 为高电平期间,SDA 由高到低的跳变,起始信号是一种电平跳变时序信号,而不是
一个电平信号。该信号由主机发出,在起始信号产生后,总线就处于被占用状态,准备数据传
输。
② 停止信号
当 SCL 为高电平期间,SDA 由低到高的跳变;停止信号也是一种电平跳变时序信号,而不
是一个电平信号。该信号由主机发出,在停止信号发出后,总线就处于空闲状态。
STM32-SPI通信协议
•SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
•四根通信线:SCK(Serial
Clock)、MOSI(Master Output Slave Input)、MISO(Master
Input Slave Output)、SS(Slave Select)
•同步,全双工
•支持总线挂载多设备(一主多从)
既然是同步的,我们就会发现它是存在时钟线的,那么其中的SCK就是同步时钟的时钟线
全双工就是 发送归发送接收归接收 这是两根线 互相不受影响
MOSI 是 主机发送从机接收的数据线
MISO 是 主机接收从机发送的数据线

SPI支持总线挂载多设备 一主多从
SS的作用是直接连接到一个从机上 一个从机连一根 片选作用

所有SPI设备的SCK、MOSI、MISO分别连在一起
主机另外引出多条SS控制线,分别接到各从机的SS引脚
输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

SS 主要起到了片选的作用因为有多个从机 所以才会接上了SS1 SS2 SS3 等等
虽然它在图片里没有画出来但是这种设备的实现都是需要共地的
如果没有供电的话,主机和从机都要引入Vcc 一起带动电压
SCK 完全是由主机掌控 主机单纯的输出 从机只能被动的接收
SS线是低电平有效的 当我们主机需要控制某个从机时 给SS线赋低电平 结束通信之后会重新把SS置回高电平1
我们把SPI通信中的输出设置为推挽输出模式
输入引脚配置为浮空或上拉输入
因为MISO都接在了一起 所以为了防止出现不必要的扰动 当SS 为高 未被选中时 ,那么MISO 就会被设置为高阻态 因为其实我们基本上都是操作主机的 从机的这种只要我们了解即可,并非需要真的写此类代码

起始条件:SS从高电平切换到低电平
终止条件:SS从低电平切换到高电平

你可能感兴趣的:(stm32学习,学习,单片机,嵌入式硬件)