完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
STM32中的通信协议
通讯协议是指在嵌入式开发中,不同的硬件系统或者操作系统之间进行数据交换的方式,是一种数据通讯的规约。 通讯协议有很多种,而我今天要说的是串口通讯协议,而且是基于STM32来说的。 首先说串口通信,串口是单片机最常见的外设。常见的UART串口主要有两个线,一个线是发送、一个是接收。至于串口发送数据的时候数据线上的高低电平是怎么变化的,这个大家可以自行查阅相关知识,我们常见的单片机自带的串口已经把这个最底层的电平级别的协议做好了,我们使用的时候,收发都是以一个字节为单位来进行的。 举个例子: (1)我们想使用串口连接STM32的串口1到PC机,然后通过PC上位机给STM32发送一个字节0x01,然后在STM32接收到之后,判断一下是不是0x01,如果是的话,点亮一个小灯,如果不是的话,就不点亮灯。这个很多人都可以理解而且实现起来非常容易,基本上几行代码就实现了。 (2)那么把刚才的例子扩展一下,假如STM32连接了很多很多灯,然后我们要使用串口发送一个指令来控制所有灯,这时候应该怎么操作? (3)把问题再扩展一下,假如我们要控制或通信的不是一个灯,而是一个更复杂的东西,比如是一个电机控制模块、是一个GPS模块、是一个物联网模块呢,这些东西在数据交互的时候都有很大的数据量,不可能一个一个字节去发送数据。 这时候我们就可以联想一下人类是怎么交互的,首先经过上万年的潜移默化,人类形成了很多种语言,同一个国家的人说话基本上都可以听懂,而不同国家的人说话的时候,如果不懂外语是听不懂的。这是为什么呢,因为同一个国家的人,说话的时候使用的协议是相同的,你说桌子,我就知道是桌子。而不同国家的人,通讯协议是不一样的,所以说话的时候不能理解,比如你说apple,我如果没有学过英语,我就不知道你说的是苹果。但是我学习了你的语言,也就是协议。就可以听懂你说的是苹果了。 所以,STM32和PC通讯,或者扩展到更多的场景,STM32和GPS,其他单片机和WIFI等等,这样的通讯都需要通讯双方执行同样的协议。那么对于刚接触单片机的人而言,就产生了几个问题,协议是什么样的,如何执行协议? 还是以最简单的场景来举例子。以使用PC机发指令来控制STM32点亮8个小灯中的若干个小灯固定时长(一秒到255秒之间)然后关闭这样一个实际小项目为例,我们现在明白了,如果只发一个指令,是没办法完成以上任务的。所以我们需要制定一个简单的协议。比如我STM32的程序这么写:当串口收到0xAA然后又收到0x55的时候,我就开始不断收集,并把收集到的所有数据都放在一个数字中,直到收到0xA5x5A这两个的时候就停止收集。接下来我把收集到的数组里面的第一个拿出来,使用if进行判断,如果是0x01的话就点亮第一个小灯,如果是0x00或者其他的话,就不点亮灯,然后看看数组的第二个字节是多少,是多少就给延时多少。相当于通过前两个字节来控制第一个灯亮灭固定时间长度。**同样的接下来的两个字节是第二个灯的亮灭和时间长度。按这样的节奏来,要控制这8个灯需要16个字节。**那么我们是否可以优化一下这个协议呢? 假如把8个灯的亮灭信息只用一个字节来表示,后面加8个字节,分别用来表示每个灯的亮灭时间长度,这样的话,就可以用9个字节来完成这个任务。 现在我们再想想,假如在这个数据传输的过程中,出了一点小错误,其中有一个电平在跳变的时候受到了干扰,没有按照发送方的数据跳变,这时候接收方接收到的数据就是错误的,假如这个错误发生在第一个灯的亮灭位上,那这个灯就会发生错误的反应,这不是发送方想要的结果。那如何避免这种情况发生呢?使用校验位,校验位是什么意思呢,就是我在给你发的时候,我把9个字节的数据做一个运算。运算有很多种方式,以求和为例子,把9个字节的数据求和,然后拿出里面低八位的数据,放在我要发送的9个字节后面。这样,发送的内容除了0xAA,0x55,0xA5和x5A之外,还多了一个位,我们把多出来的这个通过数据位运算得到的这一字节称为校验位。当发送出去之后,接收方在接收完这些数据之后,也对数据位做一个求和,然后取出低八位,和发送方发送过来的那个校验位做比较,如果相等,说明数据发送过程中没有出错,如果不相等,说明数据发送过程中有地方出错了,那么我们整个不要这一包数据了,然后给发送方通知一下,告诉他让他重新发送一下刚才的数据。 现在回到数据收发,PC端发数据,STM32端接收,这时候STM32也就要每过一会儿(很短暂的时间)就去看看串口是否有数据收到,这种方式称为扫描。扫描有一个缺点,就是需要不断的去看,结果可能去看了一百次,才有一次有数据收到,这样效率太低了,老板(cpu)肯定不高兴,就给串口说,以后你自己处理,有数据来了给我说一下我去处理就行,别让我自己去看,手里事情多着呢。所以就有了中断,中断就是当串口上有数据接了,就会产生一个接收中断,这时候串口就去通知老板来处理。原本要不断过来看看有没有数据,现在他有数据了才通知老板,老板开始还感觉不错,比以前扫描的时候轻松了点。 过了一段时间,老板想,这样每来一包数据,我得去拿几十次呀,太累,于是扔给串口一个仓库(数组),然后说,我给你一个特殊的通道(DMA)你以后收完一包数据直接通过这个通道把数据放在这个仓库里,放完了再通知我来处理,别让我来一次处理一个,手里事情多着呢。然后就有了串口空闲中断,串口每次收到一帧数据之后,才会产生一个中断通知cpu处理。串口空闲中断+DMA的方式简直是处理串口通讯的神器,没有之二。 接下来我们再想想,如果我们有一天突然觉得只控制8个灯不够用了,需要扩展几个呢,这时候,灯加上去之后,协议上还要有很大的改动,比如要把灯的控制位插在数据位的后面,就要把校验位往后挪挪,这样程序就需要改改,那么有没有一种方式,可以允许你在一定范围之内随意改灯的数量而不需要修改协议呢?这就需要设计一个不定长的通讯协议了。既然不定长,那也就意味着,发送方每次都可能发送出不同长度的数据给接收方,这也就要求发送方在发送数据的时候,在这个数据包的前面要加上数据有几个字节,这样接收方才好根据这个数量去接收(串口空闲中断+dma的方式不需要根据这个数量去接收),并且根据这个数量去解析,进而控制灯。 按照数据传送方式分: 串行通信(一条数据线、适合远距离传输) 并行通信(多条数据线、成本高、抗干扰性差) 按照通信的数据同步方式分: 异步通信(以1个字符为1帧、发送与接收时钟不一致) 同步通信(位同步、时钟一致) 按照数据的传输方向分: 单工(只能往一个方向传播) 半双工(数据传输可以沿两个方向,但是需要分时) 全双工(同时双向传输) 通信速率通常以比特率来表示,单位是:位/秒(bps),即每秒传输二进制代码的位数。之后会遇到一个波特率的概念,它表示每秒传输多少个码元。一般情况下,码元都是表示两种状态,即比特率=波特率。 串口通信:串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。串口通信的接口标准有很多,有RS-232、RS-232C、RS-422A、RS-485等。比较常用的就是RS-232和RS-485。串口通信也是仪表仪器设备常用的通信协议。 I2C通信:集成电路总线是两线式串行总线,接口少、控制简单、通信速率较高。I2C总线只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL。常用在多个集成电路间的通信。 SPI通信:串行外围设备接口是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,因其硬件功能很强,与SPI有关的软件就相当简单,使MCU有更多的时间处理其他事务。用在通信速率较高的场合,例如ADC、LCD、MCU间。 串口外围设备接口SPI是一种低成本,易使用的接口,主要用于微控制器与外围设备芯片之间的连接。SPI接口可以用来连接存储器、A/D转换器、D/A转换器、实时时钟日历、LCD驱动、传感器、音频芯片等。 SPI是一个四线接口:主机输出/从机输入(MOSI)、主机输入/从机输出(MISO)、串行SCLK或SCK、外设芯片(CS/)。 SPI是一个同步协议接口,所有的传输都参照一个共同的时钟,这个时钟信号由主机产生。SPI允许芯片与外部设备以半/全双工、同步、串行方式通信。 根据时钟极性和时钟相位的不同,SPI有4种工作模式,如图。 CAN通信:控制器局域网络(Controller Area Network)是ISO国际标准化的串行通信协议。具有已经被大家认可的高性能和可靠性。CAN总线是半双工的,虽然没有单独的时钟线,但是其采用位时序的方法进行同步传输。广泛应用于汽车、船舶等分布式控制系统。 I2S通信:集成电路内置音频总线是专门用于音频设备之间的数据传输,广泛应用于各种多媒体系统。 USB通信:通用串行总线(Universal Serial Bus)是PC体系中的一套较新的工业标准,USB 具有传输速度快、使用方便、支持热插拔、连接灵活、独立供电等优点,可以连接键盘、鼠标、大容量存储设备等多种外设,该接口也被广泛用于智能 手机中。计算机等智能设备与外界数据的交互主要以网络和USB接口为主。 串口知识笔记 1.串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一般是电脑后面的9针梯形接口,通常采用RS232信号。 2.RS-232:也称标准串口,最常用的一种串行通讯接口。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座(DB25),后来使用简化为9芯D型插座(DB9)。RS-232采取不平衡传输方式,即所谓单端通讯。由于其发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。 3.RS-485:是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到32个设备。 4.串口与并口:串口形容一下就是一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。但是并不是说并口快,由于8位通道之间的互相干扰(串扰),传输时速度就受到了限制,传输容易出错。串口没有互相干扰。并口同时发送的数据量大,但要比串口慢。 串口硬盘就是这样被人们重视的。 5.TTL电平:TTL电平信号规定,+5V等价于逻辑“1”,0V等价于逻辑“0”(采用二进制来表示数据时)。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。这是计算机处理器控制的设备内部各部分之间通信的标准技术。 6.串口、COM口是指的物理接口形式(硬件);TTL、RS232和RS485是指电平标准(电器信号),它们电平不同,需要转换和调整。转换的芯片如:MAX3485、MAX3490。 7.USB转TTL:USB接口和TTL串口无法直接通信,因为接口不匹配,电平也不匹配,需要借助外围的设备来实现接口与电平的转换。常规操作是使用CH340、CP2102这种芯片。 说说异同点和使用场景吧。首先,I2C和SPI都是同步协议,都有时钟信号,在一条总线上也都可以挂多个从设备,但是I2C的从设备是通过地址来区分的,SPI的从设备是通过片选线来区分的,所以SPI总线上,每多挂一个从设备,就要多用一个线作为片选线,而I2C则不用,只要地址不冲突,可以随便挂设备。但是,I2C总线速度一般普遍慢于SPI,I2C一般的速度是100kbs、400kbps和1Mbps,而SPI的速度可以在几Mbps,也可以10+Mbps。所以看使用场合,低速的话,I2C就挺合适的,如果速度快一些,则一般都要选用SPI。另外,I2C总线的管脚都是开漏输出,必须外接上拉电阻,阻值可以根据总线速度来推算,一般我们常用400kbps传输速率,上拉电阻选用2.2K。UART和SPI、I2C不同,他是异步传输的,一般来说传输速度比较慢,传统的传输速度一般在115200bps或以下,不过现在大部分UART控制器也能支持到4Mbps或者8Mbps了。UART目前最常用的就是调试接口,因为UART比较简单,所以CPU输出log一般都通过一个UART口来输出。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 23:18 , Processed in 0.838652 second(s), Total 76, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号