设计指标如下:
Ø 串口通信的波特率支持3种:57600bps、115200bps、230400bps;
Ø 1位起始位;
Ø 8个数据位;
Ø 奇偶校验位支持3种模式:无奇偶校验、奇校验、偶校验;
Ø 停止位支持2种:1位停止位、2位停止位。
原理图如下:
如下图所示,FPGA有MCU配置模块、串口发送模块、串口接收模块和两个同步FIFO组成。
外部串口芯片接收到的数据首先经过串口接收模块产生8位并行数据和FIFO写信号,则将收到的8位数据写进FIFO。
设计中FIFO深度为1024,数据位宽为8位。
通常FIFO和MCU之间的握手协议有两种:
一是FIFO的半满信号有效后产生中断信号,MCU接收到中断信号,首先查询串口接收FIFO的状态寄存器,确定为半满后,一次性将512个数据独读走。这种方案用在MCU需要处理的其他任务比较多的时候,不需要轮询FIFO的状态,一次性读走512个数据,效率比较高。
如果MCU需要处理的其他任务不繁重,可以通过查询FIFO非空状态,如果非空的话,则读取FIFO中的数据,然后判断FIFO是否为空,直到FIFO为空为止,大家可以评估下,这种方案其实FIFO很难存储太多的数据,基本有一两个数据就会及时被MCU读走。
需要说明的是,选择方案1和方案2需要具体情况具体分析,比如串口发过来的只是命令数据,协议格式里面只有几十个数据,这种情况下,等待几个小时也等不到半满信号,所以用方案2比较合适。
为了实现设计指标要求的3种波特率的要求,设计中选用的晶振为11.0592Mhz,其为最大波特率的整数倍,是串口通信系统中常用的晶振。
串口发送模块需要奇偶校验位、停止位等参数控制,这几个参数由MCU配置提供,默认值为波特率为115200bps、停止位1位、无奇偶校验。
MCU偏移地址 |
地址空间大小(字节) |
类型 |
读写说明 |
寄存器名称 |
功能定义 |
0x0000 |
1 |
寄存器 |
读写 |
波特率设置; |
0xC0:57600bps; 0x60:115200bps(默认值); 0x30:230400bps; 其他:115200bps |
0x0001 |
1 |
寄存器 |
读写 |
奇偶校验位设置; |
0x00:无奇偶校验(默认值); 0x01:奇校验; 0x02:偶校验; 其他:无奇偶校验 |
0x0002 |
1 |
寄存器 |
读写 |
停止位设置; |
0x02:2位停止位; 其他:1位停止位 |
0x0010 |
1 |
FIFO |
只写 |
串口发送FIFO; |
MCU向该FIFO写入准备发送的数据即可 |
0x0020 |
1 |
寄存器 |
只读 |
串口接收空状态寄存器; |
只有bit0为FIFO的是否为空状态,其他位全为0,如果bit0为高电平,则FIFO为空状态,否则为非空状态 |
0x0021 |
1 |
FIFO |
只读 |
串口接收FIFO; |
串口接收到的8位并行数据 |
用户1385266 2014-8-21 08:21
sunyzz 2014-8-20 09:01
hot.summer_2010_438634915 2014-8-20 06:12
hot.summer_2010_438634915 2014-8-20 06:04
sunyzz 2014-8-19 21:53