打印

BeagleBone GPMC接口读写FPGA双口RAM 高速数据采集 DDS波形发生器

[复制链接]
711|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Peonys|  楼主 | 2017-10-12 10:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
BeagleBone GPMC接口读写FPGA双口RAM 高速数据采集 DDS波形发生器



1TI GPMC 简要说明
通用存储器控制,即用来访问外部存储器的。主要参考下《AM335x ARM ® Cortex™-A8 Microprocessors(MPUs) TechnicalReferenceManual 》该文档的7.1 GPMC

支持的外部存储器说明:
存储器类型:NORFlashlike,asynchronous and synchronous devices或者NAND Flashlike devices,stream mode
数据总线宽度:8-bits或者16-bits
地址数据总线复用情况:non-multiplexed/AD/AADAAD没见过)
同步和异步区别在于:同步需要时钟信号,异步不需要时钟信号,具体自己去体会哈。
GPMC读支持single accessmultiple access(burst if synchonous,pageifasynchronous)
,写支持Single accessMultipleaccess(burstifsynchronous,considered as singleifasynchronous)
目前Multipleaccess还没弄明白。

由于需要用GPMC读写FPGA 双口RAM,所以采用synchonous single access NOR Flashlike 16bit模式。
2、试验过程
1BeagleBone通过GPMC接口读写FPGA做的双口单时钟(读写时钟共用GPMC时钟)RAM
2)高速数据采集:FPGA控制高速AD FPGA做的双口双时钟(读写时钟分开)RAM作为AD数据缓存,GPMC时钟用作RAM读时钟,FPGA PLL输出时钟作高速AD采样时钟及写RAM时钟;
3DDS波形发生器,目前DDS还没有开始做。
简单完成BeagleBone通过GPMC写双口双时钟(读写时钟分开)RAM,即将高速DA需要的数据预存在RAM里,FPGA PLL输出时钟作高速DA时钟及读RAM时钟,FPGARAM预存的数据送到高速DA实现固定频率波形产生。

3GPMC实现
1Linux板文件里初始化GPMC相关管脚
板文件路径:/root/bone-linux/arch/arm/mach-omap2
/root/bone-linux/  改成自己的ARM Linux源码目录
相关代码:
  • /* Pin mux for fpga module */
  • static struct pinmux_config fpga_pin_mux[] = {
  •         {"gpmc_ad0.gpmc_ad0",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad1.gpmc_ad1",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad2.gpmc_ad2",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad3.gpmc_ad3",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad4.gpmc_ad4",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad5.gpmc_ad5",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad6.gpmc_ad6",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad7.gpmc_ad7",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad8.gpmc_ad8",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad9.gpmc_ad9",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad10.gpmc_ad10",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad11.gpmc_ad11",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad12.gpmc_ad12",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad13.gpmc_ad13",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad14.gpmc_ad14",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         {"gpmc_ad15.gpmc_ad15",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  •         
  •         
  •         {"lcd_data0.gpmc_a0",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data1.gpmc_a1",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data2.gpmc_a2",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data3.gpmc_a3",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data4.gpmc_a4",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data5.gpmc_a5",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data6.gpmc_a6",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data7.gpmc_a7",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_vsync.gpmc_a8",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_hsync.gpmc_a9",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_pclk.gpmc_a10",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_ac_bias_en.gpmc_a11",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data8.gpmc_a12",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data9.gpmc_a13",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data10.gpmc_a14",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         {"lcd_data11.gpmc_a15",     OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
  •         
  • //        {"gpmc_wait0.gpmc_wait0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
  • //        {"gpmc_wpn.gpmc_wpn",          OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},
  • //        {"gpmc_csn0.gpmc_csn0",          OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  •         {"gpmc_csn0.gpio1_29", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
  • {"gpmc_csn1.gpmc_csn1",          OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  • //{"gpmc_csn1.gpio1_30", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
  • //        {"gpmc_csn2.gpmc_csn2",          OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  •         {"gpmc_csn2.gpio1_31", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
  • //        {"gpmc_advn_ale.gpmc_advn_ale",  OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  •         {"gpmc_oen_ren.gpmc_oen_ren",         OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  •         {"gpmc_wen.gpmc_wen",     OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  • //        {"gpmc_ben0_cle.gpmc_ben0_cle",         OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
  •         {"gpmc_clk.gpmc_clk",     OMAP_MUX_MODE0 | AM33XX_PULL_DISA | <font color="#ff0000">AM33XX_INPUT_EN</font>},
  •         {NULL, 0},
  • };

[color=rgb(51, 102, 153) !important]复制代码

特别注意GPMC_CLKAM33XX_INPUT_EN属性的配置,未知管脚需要到文件mux33xx.c下修改相关内容。csn1作片选,csn0、2作GPIO用。
2GPMC驱动设计
主要参考内核源代码里的gpmc.c以及gpmc.h文件,内核里是platform平台驱动,我改成了最基础的字符设备驱动,水平有限。
源码文件见附件:附件1:GPMC驱动源码
3)读写应用程序编写
源码文件见附件:附件2:读写应用程序源码
4FPGA端程序设计
1FPGABeagleBone的连接:

(2FPGA管脚配置TCL文件相关部分:
  • set_location_assignment PIN_118 -to GPMC_A[1]
  •         set_location_assignment PIN_113 -to GPMC_A[2]
  •         set_location_assignment PIN_114 -to GPMC_A[3]
  •         set_location_assignment PIN_104 -to GPMC_A[4]
  •         set_location_assignment PIN_112 -to GPMC_A[5]
  •         set_location_assignment PIN_101 -to GPMC_A[6]
  •         set_location_assignment PIN_103 -to GPMC_A[7]
  •         set_location_assignment PIN_87 -to GPMC_A[8]
  •         set_location_assignment PIN_81 -to GPMC_AD[0]
  •         set_location_assignment PIN_80 -to GPMC_AD[1]
  •         set_location_assignment PIN_57 -to GPMC_AD[2]
  •         set_location_assignment PIN_58 -to GPMC_AD[3]
  •         set_location_assignment PIN_79 -to GPMC_AD[4]
  •         set_location_assignment PIN_76 -to GPMC_AD[5]
  •         set_location_assignment PIN_53 -to GPMC_AD[6]
  •         set_location_assignment PIN_55 -to GPMC_AD[7]
  •         set_location_assignment PIN_73 -to GPMC_AD[8]
  •         set_location_assignment PIN_65 -to GPMC_AD[9]
  •         set_location_assignment PIN_67 -to GPMC_AD[10]
  •         set_location_assignment PIN_71 -to GPMC_AD[11]
  •         set_location_assignment PIN_64 -to GPMC_AD[12]
  •         set_location_assignment PIN_63 -to GPMC_AD[13]
  •         set_location_assignment PIN_70 -to GPMC_AD[14]
  •         set_location_assignment PIN_69 -to GPMC_AD[15]
  •         set_location_assignment PIN_72 -to GPMC_CLK
  •         set_location_assignment PIN_75 -to GPMC_CSN
  •         set_location_assignment PIN_59 -to GPMC_OEN_REN
  •         set_location_assignment PIN_60 -to GPMC_WEN


[color=rgb(51, 102, 153) !important]复制代码

5BeagleBone通过GPMC接口读写FPGA做的双口单时钟(读写时钟共用GPMC时钟)RAM SignalTapII抓图:


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

640

主题

901

帖子

5

粉丝