GPIO实现高可靠性RS485/422通信的研究

发布者:敬亭山人最新更新时间:2014-02-10 来源: dzsc关键字:GPIO  RS485  RS422通信 手机看文章 扫描二维码
随时随地手机看文章

  1.引言

  工程实践中,对于解决同一个问题,我们常面临两种选择:要么硬件简单软件复杂,要么软件复杂硬件简单。如某引信系统的DSP电路,需要与内部两个组部件以及外部多个系统进行接口或者信息交互,且总体要求采用异步串口方式进行通信。此类问题主要有三种解决方案:第一,在DSP的并行总线上扩展UART芯片,通过硬件转换实现,软件最简单;第二,在DSP的McBSP串行总线上扩展UART芯片,软件有一定的复杂度;第三,不扩展其他硬件直接利用IO引脚通过软件控制实现,该方法软件最复杂。根据以往文献可知在硬件资源允许的前提下,前两种方法已经得到了广泛的研究。

  然而在产品的研制过程中,常出现引信硬件资源紧张的情况,无法扩展满足需求的UART,只能选择第三种解决方式,总体的高波特率和高可靠性要求增加软件设计的难度。笔者通过软件的合理设计,成功地解决了以上问题。

  2.串行通信基本原理

  串行通信的基本原理是以改变数字电平的方式将数据按照一定的时间宽度(波特率)按位(通常低位在前高位在后)顺序传输,分为同步串口和异步串口两类。同步串口通信主要应用于传输速率高但传输距离要求不高的场合,异步串口则侧重于传输速率要求稍低的情形。

  图1给出了异步串行通信的数据基本格式,对于一个完整的字节,传输时包含起始位、数据位、校验位。

  

  实现同步串口通信通常需要6根总线,即收、发数据线,收、发帧同步线,收、发位时钟线。而异步串口则最少可只需2条总线(最多4条)便实现数据通信,如果采用差分传输还可以有效地提高传输距离,根据能否同时收发数据又分为全双工和半双工两种工作模式。

  图2是应用最普遍的串口形式之一的RS485/422串口总线,RS485半双工传输采用一对差分信号,由主控端的RE和DE来控制当前数据收发,收发不能同时进行;RS422全双工传输采用两对差分信号,主控端直接独立收发,且收发可同时进行。

  

  本研究通过软件控制改变GPIO端口的状态,完成RS485/422串口通信的时序。

  3.基本流程设计

  为提高软件的质量和可维护性,收发通讯实现时均采用位、字节和帧三个处理层次。每层相对独立,低层处理的结果通过状态传递方式通知上一层。

  研究中采用的数据传输格式:1bit起始位“0”,8bit数据位(先低后高),无校验位,1bit停止位“1”,每个字节累计为10bit.

  3.1 发送通信流程

  主动发送数据形式的流程如下:

  1)底层:位发送。在波特率控制的时间间隔内将发送数据管脚置为和当前bit一致的电平状态。

  2)中间层:字节发送,如图3所示。发送当前bit,发送完位计数器+1,如果位数达到10位,则当前字节发送结束,并通知顶层;3)顶层:帧发送,如图4所示。首先检测串口当前状态是否为发送允许,如果不是则将串口置为接收禁止、发送允许状态,确定了发送允许后进入帧发送。帧发送按照报文格式顺序发送各字节,发送结束将串口设为发送禁止、接收允许状态。

  

  

  3.2 接收通信流程

  接收通信需要把每一个bit的数据准确地检测出来,确定字节的起止位,判断帧的起止字节,也就是说通过分析和计算将数据格式和通信协议所规定的每一个细节精确定位。对于帧起始时刻的判断,根据图1数据格式知在数据传输的过程中,即使数据位为全“1”或全“0”,由于有起始位和停止位的存在,也不会出现连续10个bit的“1”或“0”的情况,于是当连续出现10个bit的“1”时,则数据线处于停止传输的状态;而连续出现10个bit的“0”时,则数据线处于异常状态。于是接收通信开始后至少连续10个bit的“1”之后的“0”可以作为帧的起始位。这里的“帧”不是指通信协议中的完整报文,只是指收到的一段数据,至于当前字节是否为报文头,则需根据协议判断。好处是不漏任何数据,可靠接收约定报文。

  接收通信流程如下:

  1)底层:位接收,如图5所示。位接收在由波特率确定的时间间隔到达时,采样接收数据线的电平状态作为当前bit值,同时判断帧起始位,帧开始后的位接收完成,通知中间层进行字节处理。[page]

  

  2)中间层:字节接收,如图6所示。当新bit接收完成时,将当前Bit值按照格式组合到字节数据。当字节位计数器满一个字节时,如果满足起始位“0”和停止位“1”的条件,字节接收完成,并通知顶层进行帧接收控制,否则字节无效。

  

  3)顶层:帧接收,如图7所示。首先检测串口当前状态是否为接收允许,如果不是则将串口置为接收允许、发送禁止状态,在确任接收允许后开始收数。在新字节接收完成后,将新字节写入接收缓冲区,同时根据通信协议启动报文识别,直到收到一帧完整的报文,结束接收通信。根据实际需要可以加入通信超时控制。

  

  4.面向对象实现方法

  在DSP中,对某一个GPIO管脚操作,需要对某一个寄存器的某一位进行置位或者清零。

  为避免每次对管脚操作时去寻找寄存器的地址和位地址这个易出错的缺点,软件设计时采用C++类结构的方式进行数据封装,使用时只需在初始化时一次性的传入寄存器及其位地址,其余用处均采用交互性良好的助记符。

  4.1 GPIO管脚类数据结构

  在构建GPIO管脚类时,围绕寄存器以及位地址操作和电平操作进行。

  软件数据类型与处理器的型号相关,本文采用TMS3206713处理器,为有效控制数制,将硬件支持数制和编译系统符号相对应,将C6000数据类型重定义,在GPIO操作中主要使用无符号数。

  4.2 串口类数据结构

  为了区分当前使用的串口类型,故定义串口类型号枚举,为串口操作程序提供识别入口。

  由类的构造函数知,由于RS422和RS485所使用的管脚不同,为了将每种操作统一到一个函数中,采用了swtich结构,其他成员函数类似。其中发射函数Sending()对应图3、4中的流程,接收函数Receving()对应图5、6、7中的流程。

  软件设计以定时器为中心,由使用目的属性来区分发送还是接收,以中断方式控制通信时序,能够实现全双工通信。在全双工通信中,当出现收发定时中断冲突的极端情况时,可设定发送优先,由于端口操作时间为纳秒级,接收滞后处理的影响可以忽略不计。

  5.位检测与接收通信可靠性

  由于每一个bit的检测结果直接决定着接收数据是否正确,按照波特率所确定的时间间隔对端口电平采样一次来确定bit的值来实现的软件,实验室拷机时存在误码现象,因此通过提高bit的检测能力,降低误码率。bit检测改进方法如下:

  (1)接收通信的位采样仍然采用由波特率确定的时间间隔,但对于位检测时,采用读3次管脚电平然后进行表决的方式确定当前bit的值,有效降低了误码率,但仍有字节出错的问题,因为3取2的方式可以部分地剔除纳秒级的高频毛刺,但不能有效抑制强干扰引起的电平翻转,需进一步改进。

  ( 2 )将每一b i t检测的时间间隔缩短到1/3,即对每一个bit进行三次检测,然后做3取2判决,并将连续30个1/3bit的高电平后的首个1/3bit低电平作为帧起点的先决条件,确保正常情况下每一bit的3个1/3bit都是同样的电平值,这样做的好处是每一个bit的检测可以允许一个1/3bit出错。

  以下进行简要分析,令改进之前的误码率是p,引起误码的噪声为非相干的,第一次改进后,对于任一bit的三次检测中允许有一次出错,因此在理想状态下的误码率为检测出错两次和三次的条件概率:

  

  如果p=10-6,那么最终的误码率可以降低到约为1.4×10-25,分析表明改进措施应该有效。

  经改进的软件在实验室进行了30小时通讯强度试验,试验中20ms完成一轮收发,报文长度为20个字节,在约1.08×108字节的接收通信中,未发现一个字节的通信错误。此后在产品8个月的调试与外场试验统计数据表明,除了有一次因通信接口芯片损坏以及一次不明原因的通信出错以外,没有出现因为软件产生的通信故障,证实了接收通信的可靠性。

  6.结论

  本文在GPIO模拟通用RS485/422串口通信的研究中,采用分层处理技术、优化bit检测方法、面向对象设计手段,实现了全双工通讯,具有逻辑清晰、易于实现、可靠性高和易于改进、维护和移植的优点;但也存在一定的局限性,如软件不宜采用汇编语言实现,全双工通信是以定时器为中心进行统筹实现的,并不是真正独立意义上的全双工,其波特率受工作频率的限制较大。

关键字:GPIO  RS485  RS422通信 引用地址:GPIO实现高可靠性RS485/422通信的研究

上一篇:浅谈国内外CAN总线技术开发应用的主要方向
下一篇:基于PCI总线的微弱信号采集模块的设计方案

推荐阅读最新更新时间:2024-05-02 22:57

STM32总结之GPIO 常用库函数
配置相关函数 1.void GPIO_Init (GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) 函数解释:GPIO的初始化函数,该函数的作用是对io进行初始化。 参数: (1)GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。 (2)GPIO_InitStruct,GPIO的初始化相关结构体。该结构体里的成员变量决定了我们具体的初始化参数。以下进行说明: GPIO_Pin:指定具体的io脚,如GPIO_Pin_0,GPIO_Pin_1这样的宏定义。 GPIO_Mode:指定GPIO的模式,有八种模式: GPIO_
[单片机]
交流充电桩上电源和RS485隔离的应用
较直流桩而言,交流桩少了大功率的 电源模块 ,充电的功率也小很多,电磁环境相对友好,但仍不可轻视。同时,出于性价比考虑,许多解决方案并不合适,下面从充电控制板的供电和RS485隔离通信的角度出发,阐述一些合适的应用。 图 1 交流充电桩示意图 一、交流桩的主要通信方式 交流桩上因不带充电机,充电由车载的充电机完成,因此一般不需要CAN口跟BMS通信,主流的通信主要有RS485和Wifi/GPRS/以太网,如所示: 1、RS485:电能表和控制单元之间的通信,一般通过RS-485相连,完成电量的统计,消费等。 2、Wifi、GPRS、工业以太网等:主要是跟网络、充电APP等互联,实现远程监控、控制等。 图 2 交流桩的内部通
[嵌入式]
RS422RS485总线模型分析与应用
0 引言   RS422/RS485总线接口作为多点、差分数据传输的电气规范,现已成为业界应用较为广泛的标准通信接口之一。RS422/RS485标准只对接口的电气特性做出了规定,而不涉及接插件、电缆或协议,因此,用户可在此基础上建立自己的高层通信协议。 1 基本原理   RS422/RS485标准的全称为TIA/EIA-422-B和TIA/EIA-485串行通信标准。它们的数据信号均采用差分传输方式,也称作平衡传输。这两者在电气特性上非常接近,不同之处只是传输方式的不同。   RS485的典型工作方式如图1所示。RS485典型的驱动器使用一对双绞线,并将其中的一线定义为A,另一线定义为B。两线工作时采用半双工通
[嵌入式]
stm32f103 GPIO——一灯大师之I/O口输出模式的寄存器配置
在讲述寄存器配置之前,我们先来看看二进制中,在不改变其他位的条件下,对某个位的置1和清零。 先看口诀: 清零用& (对某一位,进行 与 操作。与0相与,会清零。与1相与,不改变) 置1用 | (对某一位,进行 或 操作。与0相或,不改变。与1相或,会置1) 例如: 二进制:0001 1100,我想要在不改变其他位的情况下,将第四位清零。因为,清零用&,与0相与,会清零,与1相与,不改变。所以: 0001 1100 & ~(0x01 3) == 0001 0100 注意:0x01 3 == 0000 1000(这里由于要和8位的二进制数相与,所以这里会自动扩展成8位)(而且注意这里
[单片机]
stm32f103 <font color='red'>GPIO</font>——一灯大师之I/O口输出模式的寄存器配置
[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_gpio] GPIO配置和使用
GPIO The general purpose I/O is organized as one port with up to 32 I/Os (dependent on package) enabling access and control of up to 32 pins through one port. Each GPIO can be accessed individually with the following user configurable features: Input/output direction Output drive strength Internal pull-up and pull-d
[单片机]
s3c2410_gpio_cfgpin函数解析
函数原型:s3c2410_gpio_cfgpin(unsigned int pin,unsigned int function) 位置:/linux-2.6.32.2/arch/arm/plat-s3c24xx/gpio.c 函数内容: void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function) { void __iomem *base = S3C24XX_GPIO_BASE(pin); unsigned long mask; unsigned long con; unsigned long flags; if (pin S3C2410_GPI
[单片机]
s3c2410_<font color='red'>gpio</font>_cfgpin函数解析
iTOP-4412嵌入式开发板ioremap控制GPIO寄存器
GPIO 的寄存器通过 ioremap函数转换之后,可以通过直接控制虚拟地址来控制物理地址(寄存器的实际地址),这样就实现 GPIO的读和写以及其它任意功能。 需要的基础知识 虚拟地址和物理地址 内存管理单元概念 linux 驱动模块的加载 主要内容 GPIO 的寄存器文档详细介绍和说明 函数 ioremap的用法 使用 ioremap实现对 GPIO的控制 硬件 以 LED2(靠近蜂鸣器的 LED)为例,介绍原理图以及Datasheet 中对应的寄存器。 原理图 打开底板原理图 pdf文档,如下图所示,选取 LED2,网络标号是 KP_COL0。 通过查找网络标号 KP_COL0,发现 KP_COL0接到连接器上,如下图所示
[单片机]
iTOP-4412嵌入式开发板ioremap控制<font color='red'>GPIO</font>寄存器
【STM32】1-LED 使用GPIO点灯
前言 本文用于记录学习过程,因个人水平有限,如有错误还请批评指正。 一、目的 使用STM32进行点灯实验 二、使用器材 1、keil 5 2、Proteus 三、Proteus仿真电路 元件包含: 1、STM32F103R6 2、LED-BIRG 3、POWER 4、RES(电阻) 四、keil 5操作 1、芯片选择 2、新建工程的勾选 3、添加main.c文件 五、main.c中的代码 #include stm32f10x.h void delay_ms(int32_t ms);//延时函数声明 int main() { uint8_t k;//LED亮灭计数 /*L
[单片机]
【STM32】1-LED 使用<font color='red'>GPIO</font>点灯
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved