FPGA开发之UART的使用
UART使用过程中的一些错误提示 首先是关于UART测试的步骤:
在使用超级终端软件测试UART的回显时,一定要遵循以下步骤:
- 1、烧写工程与测试程序给FPGA芯片
- 2、连接串口通信线
- 3、打开软件 Hyper Terminal并点击绿色的+号开始通信,并且要设置好波特率
- 4、输入字符测试能否回显
测试回显的步骤与一些注意事项:
对终端的设置不同,回显的效果也不一样:
如果设置了本地显示的话,如果按下一个序列:abcdefg 在软件中成功回显的标志应该是:aabbccddeeffgg
如果没有设置本地显示,如果按下一个序列:abcdefg 在软件中成功回显的标志应该是:abcdefg
还有注意,输入的字符必须是 英文 模式下的字符,如果是 中文 模式下输入,则不会发送,但会产生回显的错觉。(因为会显示在屏幕上)
判断是否发送的标志是看终端软件下方的 Send后面是否有变化,而成功回显时Recevied应该也会变化。
UART测试过程中常出现的错误原因:
1、测试程序中未初始化波特因子寄存器
所以在自己自行写程序测试的时候初始化时一定要写如下语句:
ori $t1,$0,0x145
sw$t1,0x7f18($0)
(设置接收波特因子,这里的145h是25MHz频率,9600波特率下的数据)
ori $t2,$0,0xa2b
sw$t2,0x7f1c($0)
(设置发送波特因子,这里的a2bh是25MHz频率,9600波特率下的数据)
(在我的工程设计中 UART的除数因子寄存器地址分别是 0x7f18 和 0x7f1c)
波特因子的计算已经给出了公式,下面给出一个计算的实际例子:
如果接收波特率为9600,CPU的全局时钟频率为50MHz,(UART的时钟频率应该和从Clock IPcore生成的CPU全局时钟频率是一致的)
计算过程如下:
- 接收波特率=fclk /(DIVR+1)x8→ DIVR = -1 + fclk /(接收波特率 x 8)
由50MHz 和 9600可以算出
DIVR = 650.04 取整为 650 转换为16进制为 28A h
- 发送波特率=fclk /(DIVS+1)→DIVS =-1 + fclk /发送波特率
由50MHz和9600可以算出
DIVS =5207转换为16进制为 1457 h
2、使用非默认波特率时未调整设备传输波特率
在串口通信时默认设置应该是9600波特率的,如果你设置了使用别的波特率传输和发送,需要在 我的电脑 > 属性 > 设备管理器 中找到对应设备进行调整。
3、Hyper Terminal软件没有打开端口
在通信前需要打开端口,点击Hyper Terminal的绿色的加号即可,成功后下方会显示关于串口的设置信息
4、接错串口
在无法回显的时候一定要好好看看串口在FPGA芯片上的位置是否接错,与ucf约束文件里引脚是否一致。
5、FPGA芯片工作频率太快
如果Clock_wizard IP core产生的CPU全局时钟频率要大于报告中的最大频率,则整个系统有些通路是无法使用的。
6、如果以上未能解决
可以尝试更改你的CPU全局频率,重新定制Clock_wizard,有时候因为频率值不好引起误差偏大(因为波特因子算出来不一定是整数,近似时可能会有较大偏差)有可能导致最后的收发不正确。
7、如果回显成功但是出现??字符
有些字符输入时确实会回显??字符,比如一些使用频率不高的特殊符号,但是如果输入0~9的数字依旧显示??字符的话,注意检查你的波特因子是否和波特率匹配。波特率是否和设备波特率匹配。
8、注意是否更改源代码head_uart.v中的sys_clk的值
【FPGA开发之UART的使用】如果未更改的话,UART应该是无法在你所用的频率下工作的。注意更改即可。
(设置接收波特因子,这里的145h是25MHz频率,9600波特率下的数据)
推荐阅读
- 开学第一天(下)
- 20170612时间和注意力开销记录
- 深入理解Go之generate
- 开花店的前景怎么样()
- 眉头开了
- 上班后阅读开始变成一件奢侈的事
- 小影写在2018九月开学季
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 从蓦然回首到花开在眼前,都是为了更好的明天。
- 流转