打印
[51单片机]

kafeng初识嵌入式 2 - UART/USART

[复制链接]
1056|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kafeng|  楼主 | 2015-8-24 17:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kafeng 于 2015-8-28 10:59 编辑

单工(Simplex Communication)模式的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线。
半双工( Half-Duplex)模式的数据传输是双向的。既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。
全双工(full-duplex)数据可以在两个方向上同时进行传送操作。指在发送数据的同时也能够接收数据,两者同步进行。
波特率:在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。假设数据传送速率为1200字符/秒,传输使用256阶符号,每个符号8bit,则波特率就是1200baud,比特率就是1200*8=9600bit/s。

UART: Universal Asynchronous Receiver/Transmitter,通用异步串行收发传输器
可以实现全双工的传输和接收,作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

基本通信协议:
起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

基本结构:
输出缓冲寄存器,它接收CPU从数据总线上送来的并行数据,并加以保存。
输出移位寄存器,它接收从输出缓冲器送来的并行数据,以发送时钟的速率把数据逐位移出,即将并行数据转换为串行数据输出。
输入移位寄存器,它以接收时钟的速率把出现在串行数据输入线上的数据逐位移入,当数据装满后,并行送往输入缓冲寄存器,即将串行数据转换成并行数据。
输入缓冲寄存器,它从输入移位寄存器中接收并行数据,然后由CPU取走。
控制寄存器,它接收CPU送来的控制字,由控制字的内容,决定通信时的传输方式以及数据格式等。例如采用异步方式还是同步方式,数据字符的位数,有无奇偶校验,是奇校验还是偶校验,停止位的位数等参数。
状态寄存器。状态寄存器中存放着接口的各种状态信息,例如输出缓冲区是否空,输入字符是否准备好等。在通信过程中,当符合某种状态时,接口中的状态检测逻辑将状态寄存器的相应位置“1”,以便让CPU查询。

基本工作思想:
数据发送思想:当启动字节发送时,通过TXD先发起始位,然后发数据位和奇偶数校验位,最后再发停止位,发送过程由发送状态机控制,每次中断只发送1个位,经过若干个定时中断完成1个字节帧的发送。
数据接收思想:当不在字节帧接收过程时,每次定时中断以3倍的波特率监视RXD的状态,当其连续3次采样电平依次为1、0、0时,就认为检测到了起始位,则开始启动一次字节帧接收,字节帧接收过程由接收状态机控制,每次中断只接收1个位,经过若干个定时中断完成1个字节帧的接收。

FIFO:First-In First-Out,意为“先进先出”,是一种常见的队列操作。
发送FIFO的基本工作过程: 只要有数据填充到发送FIFO 里,就会立即启动发送过程。由于发送本身是个相对缓慢的过程,因此在发送的同时其它需要发送的数据还可以继续填充到发送 FIFO 里。当发送 FIFO 被填满时就不能再继续填充了,否则会造成数据丢失,此时只能等待。
接收FIFO的基本工作过程: 当硬件逻辑接收到数据时,就会往接收FIFO 里填充接收到的数据。程序应当及时取走这些数据,数据被取走也是在接收FIFO 里被自动删除的过程,因此在接收 FIFO 里同时会多出一个空位。如果在接收 FIFO 里的数据未被及时取走而造成接收FIFO 已满,则以后再接收到数据时因无空位可以填充而造成数据丢失。

USART:Universal Synchronous/Asynchronous Receiver/Transmitter,通用同步/异步串行收发传输器
其与UART主要区别在于,包含一个时钟收发器,可用于同步通信。相关控制寄存器决定时钟源是由内部产生(主机模式)还是由外部生产(从机模式)。当用于异步通信时与UART一致。

数据收发思想:把许多字符组成一个信息组(信息帧),帧的第一部分包含一组同步字符,它是一个独特的比特组合,类似于前面提到的起始位,用于通知接收方一个帧已经到达,但它同时还能确保接收方的采样速度和比特的到达速度保持一致,使收发双方进入同步。帧的最后一部分是结束(效验)字符。与同步字符一样,它也是一个独特的比特串,类似于前面提到的停止位,用于表示在下一帧开始之前没有别的即将到达的数据了,同时可用于正确性检验。
同步传输通常要比异步传输快速得多。接收方不必对每个字符进行开始和停止的操作。一旦检测到帧同步字符,它就在接下来的数据到达时接收它们即可。



编号:QR - 2

相关帖子

沙发
舟锐央| | 2015-8-26 15:16 | 只看该作者
支持楼主!说来惭愧,我每次想写读书笔记或者连载学习博客都没有**下去,楼主加油!
另外,想请教一下,通信协议是硬件规定的吗,还是说也可以软件规定呢?51单片机串行口4种工作方式传输的数据位数不同,是不是就是通信协议不同?而且,串行口方式0时发送或接受8位数据,是说没有起始位和停止位吗?

使用特权

评论回复
板凳
kafeng|  楼主 | 2015-8-26 21:53 | 只看该作者
本帖最后由 kafeng 于 2015-8-26 21:55 编辑
舟锐央 发表于 2015-8-26 15:16
支持楼主!说来惭愧,我每次想写读书笔记或者连载学习博客都没有**下去,楼主加油!
另外,想请教一下, ...

哎呀,我也是新手,真的不好意思了
尽我知道和你交流一下,这个STC89C52RC的UART方式0应该是一种比较特殊的情况:
同步移位寄存器输出方式。在这种方式下,数据从 RXD 端串行输出或输入,同步信号从 TXD 端输出,波特率固定不变,为振荡率的 1/12 。该方式是以 8 位数据为一帧,没有起始位和停止位,先发送或接收最低位, 其主要作用应该是用于扩展并行输入输出口。真正通信应该还是用的后面三种方式,都是在通信协议的框架内,方式1是1起始位+8数据位+1停止位,也就是没有效验位,方式23是1起始位+8数据位+1可编程位(效验位)+1停止位,也就是包含效验位。

使用特权

评论回复
地板
kafeng|  楼主 | 2015-8-26 21:59 | 只看该作者
本帖最后由 kafeng 于 2015-8-26 22:12 编辑
舟锐央 发表于 2015-8-26 15:16
支持楼主!说来惭愧,我每次想写读书笔记或者连载学习博客都没有**下去,楼主加油!
另外,想请教一下, ...

个人感觉在某种程度上,软件、硬件是一个整体,不是还有用普通I/O口软件模拟I2C通信的吗。

使用特权

评论回复
5
舟锐央| | 2015-8-27 18:31 | 只看该作者
kafeng 发表于 2015-8-26 21:59
个人感觉在某种程度上,软件、硬件是一个整体,不是还有用普通I/O口软件模拟I2C通信的吗。 ...

多谢多谢:)
我...有点明白了,其实我前面迷惑是因为我老师说让我自己自定通信协议,我以为要通过软件设定,但是看书又只能找到串行口的工作方式,也没有提通信协议。我现在觉得UART通信协议应该就是硬件决定的,程序只能在硬件有的范围内规定,是不是所有的单片机UART通信的串行口都是这几种模式呢?
我基础比较薄弱,希望提的问题不要太搞笑吧...

使用特权

评论回复
6
kafeng|  楼主 | 2015-8-27 19:04 | 只看该作者
本帖最后由 kafeng 于 2015-8-27 19:07 编辑
舟锐央 发表于 2015-8-27 18:31
多谢多谢
我...有点明白了,其实我前面迷惑是因为我老师说让我自己自定通信协议,我以为要通过软件设定 ...

整体的框架应该还是这样,但工作方式可能会有很多,像AVR Atmega8的USART,数据格式就可以设置为1个起始位+(5、6、7、8或9)个数据位+(0或1【奇或偶】)效验位+(1或2)停止位
上传一个AVR Atmega8可以看看。


ATmega8中文手册.pdf

2.45 MB

ATmega8中文手册

使用特权

评论回复
7
舟锐央| | 2015-8-28 15:27 | 只看该作者
kafeng 发表于 2015-8-27 19:04
整体的框架应该还是这样,但工作方式可能会有很多,像AVR Atmega8的USART,数据格式就可以设置为1个起始位 ...

哇,多谢!
呃,还是想多问一句,这个AVR和STC,如果通信协议都不一样应该是不能通信的吧?

使用特权

评论回复
8
kafeng|  楼主 | 2015-8-28 20:41 | 只看该作者
本帖最后由 kafeng 于 2015-8-28 20:49 编辑
舟锐央 发表于 2015-8-28 15:27
哇,多谢!
呃,还是想多问一句,这个AVR和STC,如果通信协议都不一样应该是不能通信的吧? ...

只要两边规定的数据格式是一致的,把波特率、数据位数,有没有效验,怎么效验都规定一致就可以通信啦:lol。当然还要考虑电平,5V单片机直接接3.3V单片机可能会出现问题。

使用特权

评论回复
9
李香兰| | 2015-8-30 10:16 | 只看该作者
可以实现全双工的传输和接收,作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

使用特权

评论回复
10
quray1985| | 2015-8-30 20:11 | 只看该作者
单工(Simplex Communication)模式的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线。

使用特权

评论回复
11
lovecat2015| | 2015-8-31 11:03 | 只看该作者
半双工( Half-Duplex)模式的数据传输是双向的。既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

54

帖子

3

粉丝