| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 常用通信协议总结之uart -> 正文阅读 |
|
[嵌入式]常用通信协议总结之uart |
1.uart 通用异步收发传输器(Universe Asychronous Receiver/Transmitter)。是一种串行异步收发协议,应用十分广泛。uart工作原理是将数据的二进制位一位一位的进行传输。在uart通讯协议中信号线的状态位高电平代表“1”,低电平代表“0” 。当然两个设备使用uart串口通讯时,必须约定好传输速率和一些数据位。 1.1硬件连接 比较简单,仅需要3条线,发送数据线TX(发送数据端,要接通讯设备的RX),接受数据线RX(接受数据端,要接通讯设备的TX),接地GND(保证两个设备共地,有统一的参考平面)。 ? 1.2软件通信协议(双方约定好的信号处理方式等) uart作为异步串口通信协议的一种,工作原理是将数据的字节一位接一位地传输。 ?(1)空闲位:就是不进行数据传输时的位,uart协议规定,当总线处于空闲状态时信号线的状态为“1”即高电平。 (2)起始位:开始进行数据传输时发送方要先发出一个低电平“0”来表示传输字符的开始,因外空闲位一直是高电平所以开始第一次通讯时先发送一个明显区别于空闲状态的信号即为低电平。 (3)数据位:起始位之后就是要传输的数据,数据可以是5,6,7,8,9位,构成一个字符,一般都是8位,先发送最低位后发送最高位。 (4)奇偶校验位:数据位传送完成后,要进行奇偶校验,校验位其实是调整个数,串口校验分几种方式:(1.无校验no parity,2.奇校验odd parity:如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”,3.偶校验even parity:如果数据位中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”,4.mark parity:校验位始终为1,5.space parity:校验位始终为0)。 (5)停止位:数据结束标志,可以是1位,1.5位,2位的高电平。 (6)波特率:表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。常用的波特率有:9600,11500......。时间间隔计算:1秒除以波特率得出的时间。例如,波特率为9600的时间间隔为1s/9600(波特率)=104us。 1.3STM32中uart工作原理 1.3.1发送接受 发送逻辑对从发送FIFO读取的数据执行“并->串”转换。控制逻辑输出起始位在先的串行位流,并且根据控制寄存器中已编程的配置,后面紧跟着数据位(注意:最低位LSB先输出),奇偶校验位和停止位。在检测到一个有效的起始脉冲后,接受逻辑对接受到的位流执行“串->并”转换。此外还会对溢出错误,奇偶校验错误,帧错误和线中止(line-break)错误进行检测,并将检测到的状态附加到被写入接受FIFO的数据中。 1.3.2波特率产生 波特率除数(baud-rate divisor)是一个22位数,它由16位整数和6位小数组成。波特率发生器使用这两个值组成的数字来决定位周期。通过带有小数波特率的除法器,在足够高的系统时钟速率下,uart可以产生所有标准的波特率,而误差很小。 1.3.3数据收发 发送时,数据被写入发送FIFO。如果uart被使能,则会按照预先设置好的参数(波特率,数据位,停止位,校验位等)开始发送数据,一直到发送FIFO中没有数据。一旦向发送FIFO写数据(如果FIFO未空),uart的忙标志位busy就有效,并且在发送数据期间一直保持有效。busy位仅在发送FIFO为空,且已从移位寄存器发送最后一个字符,包括停止位时才变为无效。即uart不再使能,它也可以指示忙状态。 在uart接收器空闲时,如果数据输入变成“低电平”,即接收到了起始位,则接受计数器开始运行,并且数据在Baud16的第8个周期被采样。如果rx在Baud16的第8周期仍然为低电平,则起始位有效,否则会被认为时错误的起始位并将其忽略。 如果起始位有效,则根据数据字符被编程的长度,在Baud16的每第16个周期(即一个位周期之后)对连续的数据位进行采样。如果奇偶校验模式使能,则还会检测奇偶校验位。 最后,如果rx位高电平,则有效的停止位被确认,否则发生帧错误。当接受到一个完整的字符时,将数据存放在接受FIFO中。 1.3.4中断控制 出现以下情况时,可使uart产生中断:FIFO溢出错误;线中止错误(line-break,即rx信号一直为0的状态,包括校验位和停止位在内);奇偶校验错误;帧错误(停止位不为1);接受超时(接受FIFO已有数据但未满,而后续数据长时间不来);发送;接受。由于所有中断事件在发送中断控制器之前会一起进行“或运算”操作,所以任意时刻uart只能向中断产生一个中断请求。通过查询中断状态函数,软件可以在同一个中断服务函数里处理多个中断事件(多个并列的if语句)。 1.3.5FIFO操作 FIFO是“First-In First-Out”的缩写,意为“先进先出”,是一种常见的队列操作。Stellaris系列ARM的uart模块包含有2个16字节的FIFO:一个用于发送,另一个用于接受。可以将两个FIFO分别放置为以不同深度触发中断。可供选择的配置包括:1/8,1/4,1/2,3/4和7/8深度。例如,如果接受FIFO选择1/4,则在uart接收到4个数据时产生接受中断。 发送FIFO的基本工作工程:只要有数据填充到发送FIFO里,就会立即启动发送过程。由于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送FIFO里。当发送FIFO被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。这个等待并不会很久,以9600的波特率为例,等待出现一个空位的时间在1ms上下。发送FIFO会按照填入数据的先后顺序把数据一个个发送出去,直到FIFO全空时为止。已发送完毕的数据会被自动清除,在发送FIFO里同时会多出一个空位。 接受FIFO的基本工作过程:当硬件逻辑接受到数据时,就会往接受FIFO里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接受FIFO里被自动删除的过程,因此在接受FIFO里同时会多出一个空位。如果在接受FIFO里的数据未被即时取走而造成接受FIFO已满,则以后再接受到数据时因无空位可以填充而造成数据丢失。 收发FIFO主要是为了解决uart收发中断过于频繁而导致cpu效率不高的问题而引入的。在进行uart通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发FIFO,则每收发一个数据都要中断处理一次,效率仍然不够高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14个)后才产生一次中断然后一并处理,这就大大提高了收发效率。 完全不必要担心FIFO 机制可能带来的数据丢失或得不到及时处理的问题,因为它已经帮你想到了收发过程中存在的任何问题,只要在初始化配置uart后,就可以放心收发了,fifo和中断例程会自动搞定一切。 1.3.6回环操作 uart可以进入一个内部回环(Loopback)模式,用于诊断或调试。在回环模式下,从tx上发送的数据将被rx输入端接受。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:28:30- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |