ARM9与FPGA并口通信的实现
并口通信是最常用基础功能,实现ARM9与FPGA的并口通信有两种方式,一种颇为巧妙,利用SMC(Static Memory Controllor),其中的使能点都通过寄存器可以轻松控制;另一种方式就是通过GPIO来完成。
由于我拿到板子硬件的DRAM_CSN0、DRAM_WEN和DRAM_RDN在前期PCB设计时没有充分考虑过SMC可能被使用,故使用接插件上其他引脚进行代替,使用了图1中画圈的三根引脚SPI0_MOSI、SPI0_SCK、SPI0_CS。因为这三根引脚可以复用为GPIO,所以在并口调试中将这三根引脚当作GPIO来使用。
图1
图2
图3
表1
原SPI功能 |
GPIO |
FPGA引脚 |
功能 |
SPI0_MOSI |
PA1 |
W21 |
写使能 |
SPI0_SCK |
PA2 |
W22 |
读使能 |
SPI0_CS |
PA3 |
W20 |
片选 |
硬件连接对应情况如图2、图3和表1所示。到此,你应该已经了解了实现通信需要关注的引脚了吧。
工程步骤:
1 重设Pin Planner
根据当前硬件的实际连接情况,对Quartus中的Pin Planner进行更新,将信号i_rd_cpu、i_wr_cpu、i_select对应的location改为PIN_W22、PIN_W21、PIN_W20。如图4所示。
图4
2 对PIOA的寄存器组重新初始化
在最初的驱动程序中包括了对GPIO的初始化,经过试验观察PIO可读寄存器的内容发现寄存器的配置不能满足本任务的完成,使用已有的初始化会干扰到使能信号的操作,于是要对GPIO进行重新初始化,对寄存器进行配置。
2.1 PIO_PER寄存器
图5
该寄存器是用来启用PIOA各个引脚的GPIO模式,如图5所示,每一位都对应控制着一根GPIO管脚,通过给P1、P2、P3置1激活了PA1、PA2、PA3的GPIO模式,同时也等于关闭了复用外围A、B的模式。
2.2 PIO_OER寄存器
图6
该寄存器有默认的设置,观察发现最低4位默认为1100。本项目需要用到GPIO的输出模式,所以需要对该寄存器进行重新配置,给P1,P2,P3置1,开启引脚的输出功能。
2.3 PIO_PUDR寄存器
图7
通过观察PIO_PUSR寄存器可以发现默认的上拉寄存器是全部开启的,上拉寄存器的启用会影响GPIO的正常输出,所以通过PIO_PUDR寄存器将上拉寄存器关闭,为之后正常操控GPIO提供基础。
数据的写入:
1 概况
PIO_SODR和PIO_CODR这两个寄存器可以将指定位的GPIO电平置1置0。由于这里设计的读写使能为低电平有效,在程序中首先将涉及的信号均拉高,相当于对信号进行一个复位。之后就可以进行数据的发送工作。
图8
图9
图8为连续发送0x1122,0x3344,0x5566等多个数据时的情况,在写使能的上升沿对数据总线和地址总线上的信息进行取样;图9中显示当写使能信号上升沿的时刻,数据总线上的信息为0x5566,地址总线上的信息为0x0005,即将0x5566存储到RAM的0x0005地址中。(上图SignalTap采样时钟为125MHz)
在一个发送周期中,经历以下过程:
0:地址总线上出现地址信息;
1:片选信号拉低;
2:写使能信号拉低;
3:数据放到数据总线上;
4:写使能拉高,同时在上升沿时刻对数据取样;
5:片选信号拉高。
在DATASHEET的SMC一章中有对并口的发送时序进行描述,当前实验结果也符合数据手册中通过SMC实现并口通信的说明,如图10、图11所示。可见,其实两种方式大同小异,实现的结果相同。
图10
图11
2 ARM中数据的发送
通过FPGA_WriteData函数完成数据的发送工作,其中使用了PIO寄存器中的PIO_CODR,PIO_SODR,PIO_ODSR三个寄存器,分别实现使能拉低,使能拉高,和标志位判断的功能。
#define WREG(x) (*((volatile unsigned short *)(x))) 语句中,(volatileunsigned short *)(x)将x定义为了一个地址指针,再通过*取内容,这样就可以将数据写到这个地址上,在之后的程序中只要直接调用WREG()就可以方便的向地址写数据。
3 FPGA中数据的存储
always @(posedgei_clk,negedge i_rst_n)
uprise_wr_dly <= i_wr_cpu_pre;
always @(posedgei_clk,negedge i_rst_n)
else if((i_wr_cpu_pre == 1'b1) && (uprise_wr_dly ==1'b0))
以上程序制作了一个比写使能信号延后一个clock的信号,再通过两个信号的组合判断实现了写使能上升沿信号的处理。这在FPGA的程序中是很常见的处理方式。
最后通过RAM程序中的接口程序,将已经处理好的数据总线信号、地址总线信号和使能信号、时钟信号添加进接口当中,功能便实现了。
数据的读取:
数据读取时的使能信号同样使用了PIO_CODR和PIO_SODR这两个关键的寄存器,按照时序控制这两个寄存器的值即可。
关于涉及到的寄存器、寄存器的控制方式、使能信号的时序以及相关软件的使用和编程思路,读取与写入是大致一样的,这里不再重复描述。
ARM9与FPGA并口通信的实现相关推荐
- 华大半导体HC32F4A0系列ARM芯片EXMC并口通信时序的FPGA实现
华大半导体HC32F4A0系列ARM芯片EXMC并口通信时序的FPGA实现 EXMC简介 外部存储器控制器EXMC是一个用来访问各种片外存储器.实现数据交换的独立模块.EXMC通过配置可以把内部的AM ...
- 移动端与PHP服务端接口通信流程设计(基础版)
为什么80%的码农都做不了架构师?>>> 针对 --->非开放性平台 --->公司内部产品 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司 ...
- FPGA+DSP SRIO通信(一)——DSP端参数设置(通道)
FPGA+DSP SRIO通信(一)--DSP端参数设置(通道) 原创 2017年04月19日 18:56:45 标签: SRIO-C66x 1217 经过漫长的探索之后,博主发现关于TI的板子调试和 ...
- android音频调制通讯,android音频口通信(一)——2FSK信号调制
转载请注明文章出处和作者! 作者:大熊(Xandy) 一.前言 之前一直都在博客园混(地址:http://www.cnblogs.com/xl19862005),最近才搬家至CSDN,由于前几个月刚换 ...
- C# 操作并口类,并口通信
c#已提供了串口通信组件SerialPort,但是C#并没有提供直接的并口通信组件,只好通过调用API来与并口通信 代码 1 using System; 2 using System.Runtime ...
- 自由口通信模式下计算机读写PLC存储区的程序
自由口通信模式下计算机读写PLC存储区的程序 2008-8-20 8:51:00 来源: 摘 要:本文介绍了在自由口通信模式下,用计算机读写S7-200 PLC存储区内相邻的多个字节数据的通信程序设计 ...
- cpri带宽不足的解决方法_白皮书:FPGA赋能下一代通信和网络解决方案(第四部分)...
对PCIe Gen 5的支持 除了以太网和存储控制器,Speedster7t FPGA上提供的对PCIe Gen 5的支持还能够与主机处理器紧密集成,以支持诸如sidecar智能网卡(SmartNIC ...
- 串口通信 校验码_一文读懂S7-200 SMART自由口通信!
学习S7-200 SMART时了解到,基于RS485接口可实现一下几种通信: 1)modbus RTU通信 2)PPI协议通信 3)USS协议通信 4)自由口通信 何为自由口通信呢? 前三种通信必须要 ...
- STC51-串口通信
1 并行与串行基本通信方式 随着单片机系统的广泛应用和计算机网络技术的普及,单片机的通信功能愈来愈显得重要.单片机通信是指单片机与计算机或单片机与单片机之间的信息交换,通常单片机与计算机之间的通信我们 ...
最新文章
- mac下为什么光标按方向键只能一个字一个字地蹦
- 云计算学习(1-1)云计算的定义
- java画笔覆盖在界面_Java学习笔记:swing画笔工具Graphics,刷新页面,键盘事件,随机数等【诗书画唱】...
- 漏洞:Client ReDos From Regex Injection
- 从鸿星尔克到蜂花,国货靠「卖惨」能留住年轻人吗?
- xpath修复html错误,【python】xpath解析html文件报错:lxml.etree.XPathEvalError: Invalid expression...
- JavaScript基础学习(一)—JavaScript简介
- 自动化测试——接口测试——增删改查
- data-index在react里怎样表达_对牛弹琴,在英语里该怎样地道表达?
- 字典哈希表的实现原理
- Android View框架总结(六)View布局流程之Draw过程
- 华为od与中软外包哪个更好_朋友入职中软一个月(外包华为)就离职了!
- linux下使用opengL Glad + EGL问题记录
- 一行代码实现随意编辑网页内容
- Windows开启ftp服务-使用Xlight FTP Server
- 无人机航测技术的优势有哪些?
- 富途证券 8.14
- 活动推荐丨当云计算遇到边缘计算
- 清华系一呼百应更团结 北大系不扎堆儿更江湖
- 五笔不熟输入法(用五笔、拼音、笔画来整句输入)
热门文章
- [OfficeExcel] OfficeExcel2010 第24讲 宏表函数
- 基于MATLAB的SVM的交通标志识别
- 2021年中国电动牙刷销售及发展趋势分析:国产品牌崛起[图]
- python怎么交换xy轴_如何在matplotlib中更改x和y轴?
- HTTP(浏览器访问)请求的整个过程
- .MD语法入门,教你写好readme文档
- 使用Faster-Rcnn训练自己的数据集遇见的问题
- 中国品牌如何做海外营销?
- js调用微信利用二维码扫码登录
- Laravel 5基础教程 || 1.安装与部署 - 表严肃