本帖最后由 美好的一天 于 2019-6-26 13:13 编辑
没有直接可用的Pmod驱动? 传授你一招填坑秘籍
之前我们提到过「Pmod传感模块」,这一搭配FPGA开发板进行快速原型系统开发的利器。事实上,除了Pmod标准定义接口的专利方 —— Digilent公司所提供的近百种功能丰富的原厂Pmod传感模块之外(一般都配有免费的ip驱动供开发者直接调用),市场上存在着很多来自不同供应商所提供的可用Pmod模块。
然鹅,很多来自于不知名小厂的Pmod(以中国台湾、深圳的山寨厂商居多),往往并不提供模块驱动,需要用户自己去写驱动填坑。如果你不幸中招,聊表安慰之余,今天就传授你一招填坑秘籍,教你在没有可用驱动情况下的应对之策。
先说重点:如果没有可用的驱动,可以使用Zynq SoC PL端(可编程逻辑)的Pmod桥模块,它让我们能够在选用的开发板与Pmod端口之间建立正确的映射,然后开发我们自己的Zynq PS(处理系统)驱动。假如你仔细研究正规厂商所提供的Pmod驱动,你会发现这些驱动其实也是使用Pmod桥加上一个AXI I2C或者SPI组件所实现的。
图:Digilent PmodAD2:12位四通道模拟数字转换器的驱动组件
此文中,我们就将以Digilent(迪芝伦)PmodDA4:8通道DAC模块,以及PmodAD2:4通道ADC模块为例,我们将这两个模块整合在一起,借助Pmod桥模块自行开发驱动,用PmodDA4生成模拟信号,并用PmodAD2来接收信号。
图:用Digilent Analog Discovery口袋仪器对PmodDA4测试
Pmod桥模块允许我们定义开发板板载Pmod接口上下两排的输入类型,可以选择定义为GPIO、UART、I2C或者SPI协议接口。我们为所需驱动的板载Pmod接口上下层都进行相应的选择配置,使得Pmod传感器的管脚输出(pinout)与对应的板载接口标准一致。有兴趣的朋友,可点击「阅读原文」,下载查看Digilent Pmod传感器的接口标准文档。
对于PmodDA4,我们只需要在板载Pmod接口上层使用SPI协议。这样选择后,我们需要提供实际的SPI通信通道。由于我们使用的是Zynq SoC开发板(Digilent Arty Z7),所以这里我们有两个选择。第一个方法是在PL端使用AXI SPI IP模块与Pmod桥模块建立连接。第二个方法(也是这里我们将采用的)是使用EMIO建立Zynq PS SPI与Pmod桥中间的连接。这一方法将让我们能够在PS SPI端口与Pmod桥模块输入管脚之间建立直连。
为了实现这一点我们需要阅读官方的Pmod接口标准文档来确保SPI管脚与Pmod桥输入管脚之间正确的映射(例如哪个PS SPI信号连接到IN_0)。Pmod 桥模块的管脚代表不同的接口类型,它们的命名也是通用的。下面的框图展示了这里我们是如何实现PmodDA4管脚的映射。在这个示例中我们完成管脚映射后就可以构建工程,导出到SDK,编写软件程序驱动DA4。
我们可以使用SDK中由BSP创建的SPI驱动来驱动PmodDA4。为了实现与PmodDA4的交互,第一件事我们要做的就是初始化SPI控制器。我们设置好SPI时钟相位和主操作选项后就可以定义缓冲区,并使用轮询传输模式将所需的信息传递给PmodDA4。更复杂的驱动则将使用中断驱动方式而非轮询的方式。 下面,我们对创建好的PmodDA4驱动文件进行测试。我们驱动一个简单的谐波输出,并使用Digilent Analog Discovery口袋仪器的示波器功能来监测DAC输出。接收到的信号如下:
完成了所有设置PmodDA4以预期的方式正常工作,然后我们将PmodDA4与PmodAD2连接在一起,这样Zynq SoC才能够接收信号:
测试时我们要非常仔细,以确保PmodDA4输出的信号在PmodAD2的工作范围内,全部完成后则会显示PmodDA4能够在硬件上正常工作。
到这里,相信大家已经了解了在没有可用驱动的情况下如何自行创建Pmod驱动。当然,填坑往往是不得已而为之,人生苦短,芳华有限,尽量少碰不提供驱动的山寨小厂Pmod才是王道。
|