完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
` 本帖最后由 HUANGYEZHIYING 于 2016-5-23 07:46 编辑 刚学FPGA的时候,就在论坛发过一个关于串口接收的帖子,时隔八月,现如今又来说RS232 UART,或因为明白的稍多一些吧,或许来骗点浏览量吧。
直到最近我才明白 串口通讯(Serial Communication):是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式,就是一类通讯方式。 UART(Universal Asynchronous Receiver and Transmitter):通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232、RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。 RS232:COM口是PC(个人计算机)上,异步串行通信口的简写。由于历史原因,IBM的PC外部接口配置为RS232,成为实际上的PC界默认标准。所以,现在PC机的COM口均为RS232。 这里所说的串口通讯,准确的说,应该是RS232 UART串口通讯,说白了,它就是一种数据传输的方式,一次能发送或接收一串数据。 首先,我们要了解下这个协议。 RS232 UART串口通讯就是将传输数据的每个字符一位接一位地按照一定时间间隔传输,这个数据是被包装起来的,首先,由起始位(0)+八位数据+奇偶校验+停止位构成。 那个一定的时间间隔称之为波特率,波特率就是发送一位所用的时间,在发送的时候,每一位的发送都是在这个时间段内的。 如果波特率为9600,也就是每秒发送9600个数据,这样的话发送一个数据的时间就是1÷9600=0.0001041667s=104166ns我们晶振是50MHZ,则始终周期是20ns,所以奇数个数为104166÷20=5208.所以,当我们在计数5208过程中要完成一位数据的传输,但为了保险起见,我们在这个数的中间进行传输,也就是2604时一位发送数据。 起始位:顾名思义,就是开始发送数据的标志位。当我们检测到X电平时,则是起始位,然后就可以发送八位数据了。 奇偶校验:如果发生的数据为计数,则置1,否则为0,但这并不能精准的检测是否发送正确,所以,既不能精准,便是无用,置一置零看你心情了, 停止位:如果为高电平,则发送数据完成且正确,反之,你懂得。
波特率的产生模块命名为pbs_module.v 数据发送命名为tx_module 控制数据的发送命名为ctrl_module 首先,先描述三个模块的沟通吧
例如: 发送起始位: 4'd0: if(pbs_ctrl_sig) begin tx <= 1'b0; i <= i + 1'b1; end 但是,不能说pbs_ctrl_sig=1我们就发送数据,那样的话容易乱套,所以我们还需要start_sig信号tx_module.v模块和pbs_module.v模块同时干活,注意是同时干活,这样保证了不会出错。 当数据发送完后,再来个完成信号告诉ctrl_module活干完了,这样,该模块就会不让波特率计数,更不让数据发送 else if(ctrl_sig) begin start <= 1'b0; t_data <= 8'h32; end 歇息1s再干活。 else if(cnt == T1S) start <= 1'b1;
上面所说的是数据的发送,那么接收呢?也是类似的。先发送起始位,也就是0,接着接收八位数据,最后是奇偶校验位和停止位。所以了,先检测到低电平是否产生,然后在接收数据。
always @ (posedge clk or negedge rst_n) if(!rst_n) begin begin_sig_1 <= 1'b1; begin_sig_2 <= 1'b1; end else begin begin_sig_1 <= rx_pin; begin_sig_2 <= begin_sig_1; end assign rx_begin = begin_sig_2 & ~begin_sig_1; 起始位的检测,使产生bps的模块开始工作,当 assign pbs_ctrl_sig = (pbs_cnt == pbs_half) ? 1'b1 : 1'b0; 为1的时候,采集一位数据, 4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9: if(pbs_ctrl_sig) begin rx_data[i-2] <= rx_pin; i <= i + 1'b1; end 同样,低位在前,高位在后。 至于奇偶校验位和停止位,咱就这样对待吧,它只能有限的交错,总感觉没啥用。
if(pbs_ctrl_sig) i <= i + 1'b1; 4'd11: if(pbs_ctrl_sig) begin i <= 4'b0; ctrl <= 1'b0; end 最后,有没有发现,我们发送方式是 起始位(0)+八位数据+奇偶校验+停止位 接收方式还是 起始位(0)+八位数据+奇偶校验+停止位 先发送给PC机的,PC机就先发送给下位机,也就是先进来的现出去。这个就是FIFO。做项目的时候总是用到这玩意。 识浅薄出拙文,如察错误望赐教,小弟在此感涕零。 欲瞧凔海笔记之单片机、FPGA等系列文章,请戳下面链接(*^__^*) 嘻嘻…… 凔海笔记本 `
TX_RX.rar
(5.55 MB, 下载次数: 53
)
|
|
相关推荐
4 个讨论
|
|
你正在撰写讨论
如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。
NVMe高速传输之摆脱XDMA设计50:主要功能测试结果与分析2 nvmePCIe高速存储
252 浏览 0 评论
NVMe高速传输之摆脱XDMA设计49:主要功能测试结果与分析1
1501 浏览 0 评论
907 浏览 0 评论
855 浏览 0 评论
658 浏览 0 评论
4427 浏览 63 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 07:06 , Processed in 0.779524 second(s), Total 58, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
5585