STM32--学习笔记 常用协议总结

学习笔记–STM32常用协议总结

文章目录

  • 学习笔记--STM32常用协议总结
    • 1. One-Wire:一根数据线
    • 2. I2C协议:时钟线(SCL)和数据线(SDA)
    • 3. UART串口:DB9接口为标准接口,其中(GND,RXD/TXD)必不可少
    • 4. SPI协议:MISO、MOSI、SCK、CS

STM32常用的协议根据外设连接的总线数量不同可以分为:

1根线: One-Wire/一线协议,比如DHT11温湿度传感器,DS18B20温度传感器;
2根线:I2C协议,比如SHT30温湿度传感器,OLED显示屏;
3根线:UART/串口协议,比如GPS,NB-IoT;
4根线:SPI协议,比如NFC,LoRa。

1. One-Wire:一根数据线

DHT11:
总线空闲时保持高电平,内置上拉电阻
传输时序:
STM32--学习笔记 常用协议总结_第1张图片
通信过程:

DHT11上电后(DHT11 上电后要等待1S以越过不稳定状态在此期间不能发送任何指令),测试环境温湿度数据,并记录数据,同时DHT11的DATA数据线由上拉电阻拉高一直保持高电平;此时DHT11的DATA引脚处于输入状态,时刻检测外部信号。

微处理器的I/0设置为输出同时输出低电平,且低电平保持时间不能小于18ms(最大不得超过30ms),然后微处理器的I/0设置为输入状态,由于上拉电阻,微处理器的I/0即DHT11的DATA数据线也随之变高,等待DHT11作出回答信号。发送信号如下图所示:
STM32--学习笔记 常用协议总结_第2张图片

DHT11的DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11的DATA引脚处于输出状态,输出81-85微秒的低电平作为应答信号,紧接着输出86-88微秒的高电平通知外设准备接收数据,微处理器的I/0此时处于输入状态,检测到I/0有低电平(DHT11回应信号)后,等待86-88微秒的高电平后的数据接收,发送信号如下图所示:
STM32--学习笔记 常用协议总结_第3张图片

由DHT11的DATA引脚输出40位数据,微处理器根据I/0电平的变化接收40位数据,位数据“0”的格式为: 54微秒的低电平和23- 27微秒的高电平,位数据“1”的格式为: 54微秒的低电平加68-74微秒的高电平。位数据“0”,“1” 格式信号如下图所示:
STM32--学习笔记 常用协议总结_第4张图片
结束信号:
DHT11的DATA引脚输出40位数据后,继续输出低电平54微秒后转为输入状态,由于上拉电阻随之变为高电平。但DHT11内部重测环境温湿度数据,并记录数据,等待外部信号的到来。

DS18B20:
复位和应答时序:
单总线上的所有通信都是以初始化序列开始,总线空闲状态都被上拉电阻拉为高电平;主机输出低电平,保持至少为480us,产生复位脉冲。接着主机释放总线,上拉电阻将总线拉为高电平,延时15-60us,进入接收模式。这时DS18B20拉低总线60-240us,产生低电平应答脉冲,然后释放总线。
STM32--学习笔记 常用协议总结_第5张图片

写时序:
总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中,每次只传输1位数据。

单片机想要给DS18B20写入一个0时,需要将单片机引脚拉低,保持低电平时间要在60~120us之间,然后释放总线。
单片机想要给DS18B20写入一个1时,需要将单片机引脚拉低,拉低时间需要大于1us,然后在15us内拉高总线.。

在写时序起始后15us到60us期间,DS18B20处于采样单总线电平状态。如果在此期间总线为高电平,则向DS18B20写入1;如果总线为低电平,则向DSl8B20写入0。

注意:2次写周期之间至少间隔1us
STM32--学习笔记 常用协议总结_第6张图片
主机向DS18B20写入的功能命令:
ROM指令:
采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20,如果是单个DS18B20,直接写跳过ROM指令0xCC即可。
STM32--学习笔记 常用协议总结_第7张图片

RAM指令:
DS18B20在获取温度之后会存放在内部的RAM里面,需要控制端使用相应的指令才能对RAM进行操作。
读取温度 0xBE,读取高速暂存器存储的数据。
温度转换 0x44,开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中。
STM32--学习笔记 常用协议总结_第8张图片

读时序:
读时隙由主机拉低总线电平至少1us然后再释放总线,读取DS18B20发送过来的1或者0。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。
STM32--学习笔记 常用协议总结_第9张图片
注意:所有读时隙必须至少需要60us,读写都是LSB顺序,也就是先读取高速暂存器的第0个字节(温度的低8位),在读取高速暂存器的第1个字节(温度的高8位) ,我们正常使用DS18B20读取温度读取两个温度字节即可。
STM32--学习笔记 常用协议总结_第10张图片

2. I2C协议:时钟线(SCL)和数据线(SDA)

通信时序:
在I2C总线上传送的每一位数据都由一个同步时钟脉冲想对应,即在SCL串行时钟的配合下,数据在SDA上从高位向低位依次串行传送每一位的数据。
STM32--学习笔记 常用协议总结_第11张图片

起始位和结束位:
I2C总线在空闲时SDA和SCL都处于高电平状态(由上拉电阻拉高),当主设备要开始一次I2C通信时就发送一个START信号,告诉从设备要开始通信,通信结束时,发送一个STOP信号,告诉从设备结束本次通信。
STM32--学习笔记 常用协议总结_第12张图片

I2C读写地址:
一个I2C总线上可以有多个从设备,主设备通过物理地址确定和哪个从设备通信,从设备的物理地址由内部电路决定。
主机在发送START信号之后,第二个时序应该立刻给出要通信从设备的物理地址。此外,I2C总线是一种能够实现半双工通信的同步串行通信协议,主设备应该具有读/写能力。
因此,I2C的读写地址除了7bit的物理地址以外,还有1bit标识读/写方向。所以I2C的读写地址一般为1Byte,高7位为物理地址,最低位为读写方向位。(0为写,1为读)
STM32--学习笔记 常用协议总结_第13张图片

I2C应答信号:
主机在发送I2C通信请求之后,对应物理地址的从设备会回应一个ACK应答信号。

此外,主/从设备在之后的通信过程中,数据接收方收到传输的一个字节数据后,需要给出ACK回应,此时处在第九个时钟周期,发送端释放SDA总线,将SDA电平拉高,由接收方控制。

继续通信:回应ACK信号,即SDA为低电平;
结束通信:回应NACK信号,即SDA为高电平。

数据位收发
主设备在收到从设备应答信号之后,开始给从设备发送数据。SDA数据线上的每个字节必须是8bit,每次传输的总字节数没有限制,每个字节发送完成后,必须跟着一个应答信号。

I2C总线通信时数据传输采用MSB方式发送,高电平表示1,低电平表示0。当传输的数据位需要改变时,比如现在发送的为1,下一个发送为0,必须要在SCL为低电平期间改变,此外,在传输过程中,SDA上的数据位在SCL高电平期间必须保持稳定不变,因为防止误发开始/停止信号,引起数据错乱。
STM32--学习笔记 常用协议总结_第14张图片
SHT30:
采用I2C协议的温湿度传感器,通信时序:
STM32--学习笔记 常用协议总结_第15张图片

3. UART串口:DB9接口为标准接口,其中(GND,RXD/TXD)必不可少

注意UART和USART的区别在于前者只支持异步通信,而后者支持异步/同步通信,目前使用主要是异步通信模式。
各个引脚的作用如下:
STM32--学习笔记 常用协议总结_第16张图片
现在大多数使用的是USB转串口的设备,缩小了串口的体积。

串口通信基本原理:
串口通信最少使用GND和一根信号线可以完成单工通信,比如GPS;大部分串口通信都是3根线(GND,RXD,TXD)实现全双工通信。
STM32--学习笔记 常用协议总结_第17张图片

串口通信时序:
串口通信时,收发是按周期进行的,每个周期传输N个二进制位。这一个周期就叫做一个通信单元。一个通信单元由起始位+数据位+奇偶校验位+停止位构成。
STM32--学习笔记 常用协议总结_第18张图片

波特率:
在电子通信领域,波特率为调制速率,指的是有效数据讯号调制载波的速率,即单位时间内载波调制状态变化的次数。

串口通信是一种异步通信方式,收发双方并没有同步时钟来约定一个bit的数据收发维持电平多长时间,这样只能靠收发双方的速率来同步收发数据,这个速率就是波特率,单位为bps(bit period second)。

常用的速率为115200(3G/4G/调试串口)、9600(NB-IoT/GPS)、4800等,收发双方保持一致即可。

起始位
表示发送方要开始发送一个通信单元。总线空闲时维持高电平,一旦产生一个下降沿变为低电平表示起始信号。

数据位:
表示一个通信单元中有效信息位,一次发送多少位有效数据是可以设定的(6,7,8,9,一般选择8位)。

奇偶校验位:
用来校验数据位,分为奇校验和偶校验:
奇校验保证传输过程中1的个数为奇数,偶校验保证传输过程中1的个数为偶数。

停止位:
收发双方本单元通信结束的标志,由通信线上的电平变化来反映。常见的有1位/1.5位/2位停止位等,一般用1位停止位。

TTL与RS232电平:
电平信号是信号线电平减去GND电平的差值,这个电压差决定了传输的是1还是0;

TTL电平(MCU或者芯片电平)标准规定:高电平为5V(51单片机)或者3.3V(ARM)表示1,0V表示0;
RS232电平标准规定:-15V至-3V表示1,+3V至+15V表示0;

显然TTL是芯片的串口直接出的电平,适合距离近干扰小的情况;设备与设备之间的远距离通信因为压降和干扰等因素需要使用RS232电平,但它的通信距离一般也小于15M;

4. SPI协议:MISO、MOSI、SCK、CS

SPI是一种同步串行全双工的接口技术,速度快,效率高。通常为一个主设备(Master)和一个或者多个从设备(Slave)构成,主设备通过片选端选择一个从设备进行通信。由四根线构成:MISO(Master input Slave output),MOSI,CLK(时钟),CS(片选)。但其在传输数据时没有像I2C协议有应答机制,在数据的可靠性传输上有一定缺陷。

SPI 传输模式:
SPI共有四种传输模式,由CPOL(时钟极性,表示空闲时为低电平还是高电平)和CPHA(时钟相位,表示从结束空闲状态开始第几个跳变沿开始采样数据)决定。
STM32--学习笔记 常用协议总结_第19张图片

模式0:CPOL=0,CPHA=0。SCK串行时钟线空闲是低电平。在SCK的上升沿采样数据,在SCK下降沿切换。
模式1:CPOL=0,CPHA=1。SCK串行时钟线空闲是低电平。在SCK的下降沿采样数据,在SCK上升沿切换。
模式2:CPOL=1,CPHA=0。SCK串行时钟线空闲是高电平。在SCK的下降沿采样数据,在SCK上升沿切换。
模式3:CPOL=1,CPHA=1。SCK串行时钟线空闲是高电平。在SCK的上升沿采样数据,在SCK下降沿切换。
常用的是模式0和3;

注意在数据传输过程中,One-Wire的DHT11是MSB,DS18B20是LSB,I2C是高位先行(MSB),UART是低位先行(LSB),SPI协议可选择使用MSB还是LSB。

SPI数据交换:
主设备通过拉低相应的NSS(片选)引脚选择相应的从设备进行通信,通信完成后再拉高相应的片选引脚,双方通过交换各自移位寄存器里的数据完成数据交换。主设备的读和写都是这样一种数据交换的模式。
STM32--学习笔记 常用协议总结_第20张图片

你可能感兴趣的:(stm32,学习,单片机)