新手请教UART串行数据:管脚模拟信号与数字信号号发送到电脑

UART串口通信的简介-文章-单片机-基础知识 - 畅学电子网
&&可用鼠标对图片进行拖动&
&UART串口通信的简介
*温馨提示:点击图片可以放大观看高清大图
UART的简介
计算机和外部设备的连接,基本上使用了两类接口:串行接口和并行接口。并行接口是指数据的各个位同时进行传送,其特点是传输速度块,但当传输距离远、位数又多时,通信线路变复杂且成本提高。串行通信是指数据一位位地顺序传送,其特点是适合于远距离通信,通信线路简单,只要一对传输线就可以实现双向通信,从而大大降低了成本。
串行通信又分为异步和同步两类。UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)正是设备间进行异步通信的关键模块。它的重要作用如下所示:
处理数据总路线和串行口之间的串/并、并/串转换;
通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx 和Tx)就可以完成通信过程;
采用异步方式,数据收发完毕后,可通过中断或置位标志位的方式通知微控制器进行处理,大大提高微控制器的工作效率。
若加入一个合适的电平转换器,如SP3232E、SP3485,UART 还能用于RS-232、RS-485 通信,或和计算机的端口连接。UART 应用非常广泛,手机、工业控制、PC 等应用中都要用到UART。
UART的作用
1. 发送/接收逻辑
发送逻辑对从发送FIFO 读取的数据执行&并&串&转换。控制逻辑输出起始位在先的串行位流,并且根据控制寄存器中已编程的配置,会面紧跟着数据位(注意:最低位 LSB 先输出)、奇偶校验位和停止位。
在检测到一个有效的起始脉冲后,接收逻辑对接收到的位流执行&串&并&转换。此外还会对溢出错误、奇偶校验错误、帧错误和线中止(line-break)错误进行检测,并将检测到的状态附加到被写入接收FIFO 的数据中。
2. 波特率的产生
波特率除数(baud-rate divisor)是一个22 位数,它由16 位整数和6 位小数组成。波特率发生器使用这两个值组成的数字来决定位周期。通过带有小数波特率的除法器,在足够高的系统时钟速率下,UART 可以产生所有标准的波特率,而误差很小。
3. 数据收发
发送时,数据被写入发送FIFO。如果UART 被使能,则会按照预先设置好的参数(波特率、数据位、停止位、校验位等)开始发送数据,一直到发送FIFO 中没有数据。一旦向发送FIFO 写数据(如果FIFO 未空),UART 的忙标志位BUSY 就有效,并且在发送数据期间一直保持有效。BUSY 位仅在发送FIFO 为空,且已从移位寄存器发送最后一个字符,包括停止位时才变无效。即 UART 不再使能,它也可以指示忙状态。BUSY 位的相关库函数是UARTBusy( )
在UART 接收器空闲时,如果数据输入变成&低电平&,即接收到了起始位,则接收计数器开始运行,并且数据在Baud16 的第8 个周期被采样。如果Rx 在Baud16 的第8 周期仍然为低电平,则起始位有效,否则会被认为是错误的起始位并将其忽略。
如果起始位有效,则根据数据字符被编程的长度,在 Baud16 的每第 16 个周期对连续的数据位(即一个位周期之后)进行采样。如果奇偶校验模式使能,则还会检测奇偶校验位。
最后,如果Rx 为高电平,则有效的停止位被确认,否则发生帧错误。当接收到一个完整的字符时,将数据存放在接收FIFO 中。
4. 中断控制
出现以下情况时,可使UART 产生中断:
FIFO 溢出错误
线中止错误(line-break,即Rx 信号一直为0 的状态,包括校验位和停止位在内)
奇偶校验错误
帧错误(停止位不为1)
接收超时(接收FIFO 已有数据但未满,而后续数据长时间不来)
由于所有中断事件在发送到中断控制器之前会一起进行&或运算&操作,所以任意时刻 UART 只能向中断产生一个中断请求。通过查询中断状态函数UARTIntStatus( ),软件可以在同一个中断服务函数里处理多个中断事件(多个并列的if 语句)。
5. FIFO 操作 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 和中断例程会自动搞定一切。
6. 回环操作
UART 可以进入一个内部回环(Loopback)模式,用于诊断或调试。在回环模式下,从Tx 上发送的数据将被Rx 输入端接收。
7. 串行红外协议
在某些 Stellaris 系列 ARM 芯片里,UART 还包含一个 IrDA 串行红外(SIR)编码器/ 解码器模块。IrDA SIR 模块的作用是在异步UART 数据流和半双工串行SIR 接口之间进行转换。片上不会执行任何模拟处理操作。SIR 模块的任务就是要给UART 提供一个数字编码输出和一个解码输入。UART 信号管脚可以和一个红外收发器连接以实现IrDA SIR 物理层连接。
如图所示,为UART 的IrDA SIR 模块基本应用电路。D1 为红外发射管,Q2 为红外接收管。
UART的基本结构及端口介绍
⑴输出缓冲寄存器,它接收CPU从数据总线上送来的并行数据,并加以保存。
⑵ 输出移位寄存器,它接收从输出缓冲器送来的并行数据,以发送时钟的速率把数据逐位移出,即将并行数据转换为串行数据输出。
⑶ 输入移位寄存器,它以接收时钟的速率把出现在串行数据输入线上的数据逐位移入,当数据装满后,并行送往输入缓冲寄存器,即将串行数据转换成并行数据。
⑷ 输入缓冲寄存器,它从输入移位寄存器中接收并行数据,然后由CPU取走。
⑸ 控制寄存器,它接收CPU送来的控制字,由控制字的内容,决定通信时的传输方式以及数据格式等。例如采用异步方式还是同步方式,数据字符的位数,有无奇偶校验,是奇校验还是偶校验,停止位的位数等参数。
⑹状态寄存器。状态寄存器中存放着接口的各种状态信息,例如输出缓冲区是否空,输入字符是否准备好等。在通信过程中,当符合某种状态时,接口中的状态检测逻辑将状态寄存器的相应位置&1&,以便让CPU查询。
UART的信号时序
① 起始位:先发出一个逻辑&0&信号,表示传输字符的开始。
② 数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
③ 奇偶校验位:数据位加上这一位后,使得&1& 的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。
④ 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
⑤空闲位:处于逻辑&1&状态,表示当前线路上没有数据传送。
&&&&&&&&&&&&&&&&&&&&转自电子发烧友网
金币:1216个|学分:1240个
关注我们:
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!
已有畅学电子网帐号?
可从合作网站帐号登录:串口通信发送接口_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
串口通信发送接口
上传于||文档简介
&&南​通​大​学​硬​件​描​述​语​言​课​程​设​计
阅读已结束,如果下载本文需要使用3下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩10页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢查看: 740|回复: 7
AX516 Verilog教程中串口Uart例程中的疑问请教
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
新手一枚,正在学习Spartan开发板中的UART模块例程。想请教两个问题:
(1)uarttx中一帧中,发送每个数据位为什么要等待16个时钟?
1.png (18.99 KB, 下载次数: 0)
20:02 上传
(2)在uartctrl模块中发送一个字符,为什么要等待255个时钟?
2.png (16.99 KB, 下载次数: 0)
20:02 上传
本帖最后由 damofeiying 于
22:26 编辑
第1个问题,是不是因为clk频率采用的是波特率的16倍,这样等待16个时钟就能够恢复原本的波特率了。例如,例程中波特率为9600,而clk为50MHz经过326分频,约为153.7kHz,大概为9600的16倍。
第2个问题,同理,发送一个字节数据,同第1个问题,先将clk频率降16倍到真实的波特率,则等待的时间为256/16=16个波特位的时间,而每个字节消耗的时间为11个波特位时间(起始位、数据位、校验位、停止位加到一起),现在放宽到16个波特位的时间,是为了传输时间更宽裕?为了数据传输不容易出错?&&这样的话真实波特率是不是就到不了9600啊?
不知这样理解对不对。
第一个问题,您的理解是对的, 16个时钟来发送一个bit和接收一个bit, 主要是接收的时候能够在16个时钟的 中间位置 接收数据,提高接收的正确性。
第二个问题, 255个时钟 是 每个字节之间的等待时间,其实发送一个字节的 时间大概在168(11个波特位时间),这里只是放宽一些。保证一个字节发送完成。
其实用户自己可以添加字节完成信号,在程序里判断字节发送完成信号,再发送下一个字节,这样应该效率会更高一些。
非常感谢解答!
还是楼主的第一个问题,源代码中cnt定时器被定义为16‘d325,应该可以写成9‘d325吧,而且这里16个时钟采一次和不除16,而直接将定时器满位定位16*325是一样的吧,即cnt为13‘d(0)
建议看下资料里面关于思维方式的文章,FPGA的思维得是CLK的思维,基于CLOCK的,这样理解起来要简单些
还有,通过深入理解,你可以找出BYTE与BYTE之间的需要间隔几个CLK才能完成数据的正确发送,建议可以究下时序仿真软件,这样能直观的看到,并分析出来。
里面的idle 这个状态是怎么确定 高低电平的?因为他在发送模块里面是个输出的idle,低表示线路空闲,那我在判断来一帧数据时候,wrsigrise为高和~idle相与,那这个idle的初始状态是随机么?C:\Users\liang\Desktop\.png
Powered by博客访问: 844273
博文数量: 98
博客积分: 2002
博客等级: 大尉
技术积分: 3962
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
1.UART&&& UART(Universal Asynchronous Receiver and Transmitter)通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。&& 而RS232、RS499、RS423、RS422和RS485等,是对应各种异步串行通信口的接口标准和总线标准,它规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容,这些东东都是物理层的概念。 && 通信协议,是属于通信网络中的数据链路层的概念。1.1 RS232&&& COM口是PC(个人计算机)上,异步串行通信口的简写。由于历史原因,IBM的PC外部接口配置为RS232,成为实际上的PC界默认标准。所以,现在PC机的COM口均为RS232。&&& & 上图最右边的是串口接口,统称为RS232接口(封装DB9)& 通信过程中实际只有两个管脚参与通信&&& 2脚:电脑的输入RXD& &&& 3脚:电脑的输出TXD&&&&& &&& 5脚:接地 & 通过2,3脚就实现全双工(可同时收发)的串行异步通信1.2 UART通信协议& &&& UART使用的是 异步,串行通信。&&& 串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。&&& 异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。 &&& 数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。&&& 数据通信格式如下图:其中各位的意义如下:&&& 起始位:先发出一个逻辑”0”信号,表示传输字符的开始。&&& 数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输&&& 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)&&& 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。&&& 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。&&& 注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)3. Uboot 串口驱动board_init_r()
&&&&--》devices_init()
&&&&&&&&--》drv_system_init()
&&&&&&&&&&&&创建串口设备 serial,放到全局数组devlist[]中去
&&&&&&&&&&&&&struct device_t serial{
&&&&&&&&&&&&&&&&.name = "serial"
&&&&&&&&&&&&&&&&.putc = serial_putc; //这些函数是芯片相关的
&&&&&&&&&&&&&&&&.puts = serial_puts;
&&&&&&&&&&&&&&&&.getc = serial_getc;
&&&&&&&&&&&&&&&&.gets = serial_gets;
&&&&&&&&&&&&}
&&&&&&&&--》console_init_r()
&&&&&&&&&&&&--》设置钩子函数,这些函数是硬件相关的
&&&&&&&&&&&&&&&&gd->jt[XF_getc] = serial_getc;
&&&&&&&&&&&&&&&&gd->jt[XF_tstc] = serial_tstc;
&&&&&&&&&&&&&&&&gd->jt[XF_putc] = serial_putc;
&&&&&&&&&&&&&&&&gd->jt[XF_puts] = serial_puts;
&&&&&&&&&&&&&&&&gd->jt[XF_printf] = serial_printf;
&&&&&&&&&&&&--》在devlist[]中搜索,初始化标准输入,标准输出和错误输出的device_t指针
&&&&&&&&&&&&&&&&inputdev = search_device (DEV_FLAGS_INPUT,
"serial");
&&&&&&&&&&&&&&&&outputdev = search_device (DEV_FLAGS_OUTPUT, "serial");
&&&&&&&&&&&&&&&&errdev = search_device (DEV_FLAGS_OUTPUT, "serial");
&&&&&&&&&&&&--》文件描述符file_no与设备device_t绑定,初始化stdio_devices[file_no] = dev
&&&&&&&&&&&&&&&&console_setfile (stdout, outputdev);
&&&&&&&&&&&&&&&&console_setfile (stderr, errdev);
&&&&&&&&&&&&&&&&console_setfile (stdin, inputdev);Uboot中,串口打印流程printf-->puts-->fputs
void fputs (int file, const char *s){
&&&&if (file < MAX_FILES)
&&&&&&&&stdio_devices[file]->puts(s);
&&&&&&&&//调用的函数为serial_puts,芯片相关不分析
}4. Linux串口驱动start_kernel()
&&&&--> console_init()
&&&&&&&&-->cpm_uart_console_init()
&&&&&&&&&&&&-->register_console(&cpm_scc_uart_console)
&&&&&&&&&&&&&&&&console->setup()
&&&&&&&&&&&&&&& //最终调用cpm_uart_cnsole_setup()& & & & & & & & //初始化uart控制器,并将console 结构加入到 console_drivers 列表中去&&& 注意,&&& 由于我们在console_init中调用cpm_uart_console_init时,&&& 因为当时uart port的基址等基本参数都没有确立, 故其中调用console->setup 以失败返回,&&& 即调用register_console 没有成功注册,&&& 故后面在do_initcalls中调用 cpm_uart_init()进行初始化时,&&& 其初始化中调用uart_configure_port会再次调用register_console&&& 这次由于uart port的基址等参数得到初始化,故register_console成功do_initcalls()
&&&&-->cpm_uart_init()&&&&&&&&&&&&&&&&
&&&&&&&&-->uart_register_dirver(&cpm_reg)
&&&&&&&&for( i=0; i< cpm_uart_nr; i++)
&&&&&&&&&&&&con = cpm_uart_port_map[i]
&&&&&&&&&&&&-->uart_add_one_port(&cpm_reg, &cpm_uart_ports[con].port)&&&&&&&&&&&&&& //行参(struct uart_driver *drv, struct uart_port *port)
&&&&&&&&&&&&&&&&注意这里有 port->cons = drv->cons;
&&&&&&&&&&&&&&&&-->uart_configuare_port(drv, state, port)
&&&&&&&&&&&&&&&&&&&&--> port->ops->config_port(port, flags)&&&&&&&&
&&&&&&&&&&&&&&&&&&&&//这里port的ops是 cpm_uart_pops
&&&&&&&&&&&&&&&&&&&&//即调用cpm_uart_config_port, 初始化buf,bd,controlller,enable rx/tx
&&&&&&&&&&&&&&&&&&&&&&&&--> cpm_uart_request_port(port)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&cpm_uart_allocbuf(pinfo,0)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&cpm_uart_initbd(pinfo)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&cpm_uart_init_scc(pinfo)
&&&&&&&&&&&&&&&&&&&&-->uart_report_port(drv,port)&&&&//打印串口相关信息
&&&&&&&&&&&&&&&&&&&&-->register_console(port->cons)&&&&//形参(struct console *console)
&&&&&&&&&&&&&&&&&&&&&&&&//加入到 console_drivers 列表中去
&&&&&&&&&&&&&&&&&&&&-->uart_console(port)printk在src/kernel/printk.c中实现int printk(const char *fmt, ...)
&&&&static char printk_buf[1024];&&&&
&&&&// 函数内申请了一块静态内存printk_buf[]作为format缓冲区,然后把缓冲区内容放到LOG_BUF中
&&&&// 不管console是否存在,printk都成功返回。
&&&&--> release_console_sem();
&&&&&&&&--> call_console_drivers();
&&&&&&&&&&&&-->_call_console_drivers(start_print, cur_index, msg_level);
&&&&&&&&&&&&&&&&// 对console驱动中write的调用
&&&&&&&&&&&&&&&&for (con = console_drivers; con; con = con->next) {
&&&&&&&&&&&&&&&&
if ((con->flags & CON_ENABLED) && con->write)
&&&&&&&&&&&&&&&&
con->write(con, &LOG_BUF(start), end - start);
&&&&&&&&&&&&&&&&}
&&&&&&&&con->write() 实际上是
cpm_scc_uart_console.write
&&&&&&&&即 cpm_uart_console_write()
阅读(40186) | 评论(1) | 转发(16) |
相关热门文章
给主人留下些什么吧!~~
没想到U-boot下串口处理写的这么漂亮。
请登录后评论。【图文】第八章单片机串行接口_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第八章单片机串行接口
上传于||文档简介
&&单&#8203;片&#8203;机&#8203;实&#8203;验
大小:502.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢

我要回帖

更多关于 苹果数字信号 的文章

 

随机推荐