完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
提及串口通信,最常用的就是UART协议。
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。 具体实物表现为独立的模块化芯片,或作为集成于微处理器中的周边设备。一般是RS-232C规格的,与类似Maxim的MAX232之类的标准信号幅度变换芯片进行搭配,作为连接外部设备的接口。在UART上追加同步方式的序列信号变换电路的产品,被称为USART(Universal Synchronous Asynchronous Receiver Transmitter)。 数据通信格式如下图: 其中各位的意义如下: 起始位:先发出一个逻辑”0”信号,表示传输字符的开始。 数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验) 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。 注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)。也即: UART的工作原理: 发送数据过程:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为高电位),一帧数据发送结束。 接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存。 由于UART是异步传输,没有传输同步时钟。为了能保证数据传输的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。 UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这时计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第1位数据,依此类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,一帧数据接收完成。 一个标准的10位异步串行通信协议(包含1个起始位、1个停止位和8个数据位)收发时序。 当然我们现下讨论的是有关FPGA上实现UART串口通信的方法,结合上述普适的UART的相关知识,我们不难总结FPGA上实现UART的原理(这里要感谢参考了@alexdos的部分总结): UART 主要由 UART 内核、信号监测器、移位寄存器、波特率发生器、计数器、总线选择器和奇偶校验器总共 7 个模块组成,如图: 1.UART 内核模块 UART 内核模块是整个设计的核心。在数据接收时,UART 内核模块负责控制波特率发生器和移位寄存器,使得移位寄存器在波特率时钟的驱动下同步地接收并且保存 RS-232 接收端口上的串行数据。在数据发送时,UART 内核模块首先根据待发送的数据和奇偶校验位的设置产生完整的发送序列(包括起始位、数据位、奇偶校验位和停止位),之后控制移位寄存器将序列加载到移位寄存器的内部寄存器里,最后再控制波特率发生器驱动移位寄存器将数据串行输出。 2.信号监测器模块 信号监测器用于对 RS-232 的输入信号进行实时监测,一旦发现新的数据则立即通知 UART内核。(注意:这里所说的 RS-232 输入、输出信号都指的是经过电平转换后的逻辑信号,而不是 RS-232 总线上的信号。绝对不能直接将 RS-232 总线的信号连接到 FPGA 管脚上,否则很容易造成 FPGA芯片的损坏。) 3.移位寄存器模块 移位寄存器的作用是存储输入或者输出的数据。当 UART 接收 RS-232 输入时,移位寄存器在波特率模式下采集 RS-232 输入信号,并且保存结果;当 UART 进行 RS-232 输出时,UART 内核首先将数据加载到移位寄存器内,再使移位寄存器在波特率模式下将数据输出到 RS-232 输出端口上。(注意:波特率模式指的是模块的输入时钟是符合 RS-232 传输波特率的时钟,与波特率模式对应的就是系统时钟模式,即模块是工作在系统时钟下。) 4.波特率发生器模块 由于 RS-232 传输必定是工作在某种波特率下,比如 9600,为了便于和 RS-232 总线进行同步,需要产生符合 RS-232 传输波特率的时钟,这就是波特率发生器的功能。 5.奇偶校验器模块 奇偶校验器的功能是根据奇偶校验的设置和输入数据计算出相应的奇偶校验位,它是通过纯组合逻辑实现的。 6.总线选择模块 总线选择模块用于选择奇偶校验器的输入是数据发送总线还是数据接收总线。在接收数据时,总线选择模块将数据接收总线连接到奇偶校验器的输入端,来检查已接收数据的奇偶校验位是否正确;而在发送数据时,总线选择模块将数据发送总线连接到奇偶校验器的输入端,UART内核模块就能够获取并且保存待发送序列所需的奇偶校验位了。 7.计数器模块 计数器模块的功能是记录串行数据发送或者接收的数目,在计数到某数值时通知 UART 内核模块。 UART的优点和缺点 没有任何一种通信协议是完美的,以下是一些优点和缺点,可帮助您确定它们是否符合您项目的需求: 1. 优点 只使用两根电线 不需要时钟信号 有一个奇偶校验位 只要双方设置后,就可以改变数据包的结构 有完整的文档并且具有广泛的使用 2. 缺点 数据帧的大小限制为最多9位 不支持多个从属或多个主系统 每个UART的波特率必须在10%之内 有了上述的总结后,我们便可以开始在Robei中添加适当的代码进行实现了。官方给出的代码仍然是有一些问题的,debug完成后 具体运行后仿真一切顺利,设计成功。其它的步骤我们大可交给QuartusⅡ完成,如前面提到的方法一样,主要是绑定管脚和查验实际电路图即可。完成后即可下载到FPGA开发板进行验证。 |
|
|
|
只有小组成员才能发言,加入小组>>
4254个成员聚集在这个小组
加入小组3271 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4214 浏览 1 评论
4220 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-6 00:22 , Processed in 0.659485 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号