This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am335x通过gpmc和FPGA连接,采用同步模式,为什么FPGA端检测不到同步时钟?(可以读数据)



这是我的引脚配置,麻烦大家帮忙看下

// module pin mux for gpmc
static struct pinmux_config gpmc_pin_mux[]={
{"gpmc_a1.gpmc_a1", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
{"gpmc_a2.gpmc_a2", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
{"gpmc_a3.gpmc_a3", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
{"gpmc_a4.gpmc_a4", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
{"gpmc_a5.gpmc_a5", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
{"gpmc_a6.gpmc_a6", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
{"gpmc_a7.gpmc_a7", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},
{"gpmc_a8.gpmc_a8", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA},


{"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},


{"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_wpn.gpmc_wpn", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},

{"gpmc_clk.gpmc_wait1", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLUP},
//{"gpmc_clk.gpmc_clk", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

/*must be set as an input*/
{"gpmc_csn1.gpmc_clk", OMAP_MUX_MODE1 | AM33XX_PIN_INPUT_PULLUP},
//{"gpmc_csn1.gpmc_csn1", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},


//{"gpmc_csn2.gpmc_csn2", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
{"gpmc_csn3.gpmc_csn3", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},

{NULL, 0},
};

会不会是时钟引脚属性设置错了,多谢!

  • 你确定你量的管脚是对的么?在AM335x的U9脚上?

    如果没有clock的话,确认现在生效的模式设置是同步么?没有clock能正常读取数据?

  • 我config_7设置的是0xaa011000,第29位和第27位分别为读写类型,可以读到fpga端的数据,但是在FPG端的逻辑仪上看不到时钟

  • 你是指GPMC_CONFIG_0的寄存器吧,没错,按照这个设置是同步模式,你现在读到的FPGA端的数据是对的吗?能否用示波器量一下当前你使用的clock这个脚,有时钟出来么?对应的AM335x的管脚是哪个,确认一下

  • 你的这个设置,模式和输入的设置是对的:gpmc_csn1.gpmc_clk", OMAP_MUX_MODE1 | AM33XX_PIN_INPUT_PULLUP},

    在Linux系统启动后,登录后,在控制台使用命令“devmem2 0x44e10880”,打印下这个GPMC_CSn1的Control module寄存器,如果结果是0x00000031的话,就说明这个配置生效了,pinmux配置没问题,否则说明你对clock的pinmux的配置并没有生效。

  • 我看网上有人把时钟引脚设置成这样

    {\"gpmc_clk.gpmc_clk\", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},

    http://biancheng.dnbcw.info/linux/411804.html

    fpga端设置的初始值读过来是对的,fpga端的逻辑分析仪能看到地址有效,读允许有效,片选有效,但是就是没有时钟

  • 这个是使用GPMC_CLK引脚,V12脚,和你的配置的是不一样的,你用的是GPMC_CSn1这个脚,U9。你先搞清楚,自己的硬件连接上面到底用的是哪个。

  • 感谢您的回复!

    我的意思是他的引脚初始状态设置为:{\"gpmc_clk.gpmc_clk\", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},

    而我的引脚初始化状态为:gpmc_csn1.gpmc_clk", OMAP_MUX_MODE1 | AM33XX_PIN_INPUT_PULLUP},

    跟这个有关系吗?

  • 需要input属性,芯片上设置的上下拉是很弱的,影响不大。我之前不是建议你使用devmem2去查寄存器设置成功了没有,这个结果如何?

  • 你好!是这个结果!

    root@am335x:~# devmem2 0x44e10880
    /dev/mem opened.
    Memory mapped at address 0x4022c000.
    Read at address 0x44E10880 (0x4022c880): 0x00000037
    root@am335x:~#

  • 这说明配置没生效啊,从GPMC_CSn1上肯定得不到clock,现在的模式是7,也就是GPIO模式,没有配对,用命令测试一下:“devmem2 0x44e10880 w 0x00000031” 然后在打印一次寄存器的值,看结果。

    原理图设计上,确认你目前引出来的clock脚是U9么?

  • 按你说的做了,结果好像没写进去,还是原来的值,买的板子,引脚是他们引出来的

    root@am335x:~# devmem2 0x44e10880 w 0x00000031
    /dev/mem opened.
    Memory mapped at address 0x40275000.
    Read at address 0x44E10880 (0x40275880): 0x00000037
    Write at address 0x44E10880 (0x40275880): 0x00000031, readback 0x00000031
    root@am335x:~# devmem2 0x44e10880
    /dev/mem opened.
    Memory mapped at address 0x400a7000.
    Read at address 0x44E10880 (0x400a7880): 0x00000037
    root@am335x:~#

  • 这只是你接插件部分的原理图,要看主芯片端的原理图,确认一下GPMC_CSn1是不是连在了335的U9管脚。

    软件上查一下为什么pinmux不对,你写的是没被调用,还是调用出问题了

  • 他们没给核心板的原理图,但是我想一个正规的公司应该不会接错吧!我引脚初始化,也是把gpmc_cs1设置成模式1(即gpmc_clk,)烧写内核后,启动也没报错,但是为啥读出来的寄存器还是模式7呢,更奇怪的是其他信号都正常,就是没有时钟,但是居然也能读数据;本来gpmc_cs1引脚是被占用的,我把他注释掉了,下面是gpmc_csn1原来的设置

    #if 0
    #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
    /* pinmux for gpio based key */
    static struct pinmux_config gpio_keys_pin_mux[] = {
    {"gpmc_ad8.gpio0_22", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP}, // "SETUP" key
    {"gpmc_csn2.gpio1_31", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP}, // "MENU" key
    {"gpmc_csn1.gpio1_30", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP}, // "BACK" key
    {NULL, 0},
    };

  • 时钟不是一直都有的,只有在读写数据的时候才有,你确定一定没有?

  • 是的呀!一直没有

  • 你确定和你FPGA相连的是GPMC_CS1吧?

    你前面提到你的我config_0设置的是0xaa011000,是通过devemem2的方法读出来的吗?还是说只是个设置的值?

    使devmem2 + 地址的方法,把你读的寄存器地址和结果值,发上来一起确认一下。

  • 是我程序设置的呀@

    #define     GPMC_CONFIG1_DATA   0xaa011000

    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG1,GPMC_CONFIG1_DATA);

    我在驱动程序里设置完寄存器后,都打印了一遍

    #if 1
    printk("GPMC_CS_CONFIG1 value 0x%x\n" ,gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG1));
    printk("GPMC_CS_CONFIG2 value 0x%x\n" ,gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG2));
    printk("GPMC_CS_CONFIG3 value 0x%x\n" ,gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG3));
    printk("GPMC_CS_CONFIG4 value 0x%x\n" ,gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG4));
    printk("GPMC_CS_CONFIG5 value 0x%x\n" ,gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG5));
    printk("GPMC_CS_CONFIG6 value 0x%x\n" ,gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG6));
    printk("GPMC_CS_CONFIG7 value 0x%x\n" ,gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7));
    #endif

    config_1的值就是我设置的值

  • 建议你直接在运行时,用devmem2去打印,这样能打印出你运行时设置的状态。

    你在这个驱动里面打印,只能说明你设完的这会儿,值是设置对的,后面会不会再被修改,这不确定哦。像你前面的那个pinmux配置一样,你是设置成模式1的,结果后面还是被修改了,改回了模式7,你在程序里设置完这个pinmux就打印的话,应该能显示成模式1的,可这不代表最终的状态。

    鉴于你有这种情况在先了,还是用devmem2再次确认一下,排除一下后面误操作的可能。

  • 再次感谢回复!请问config_1的地址是多少,如果要用devmem2打印的话

  • GPMC片选0设备的config1寄存器地址是:0x50000060。

    得到方法:从TRM的第二章memory map,找到GPMC的基址,0x5000 0000;然后在GPMC章节,看GPMC_CONFIG1_0的地址,这个地址是偏移量,为0x60,加在一起就是0x5000 0060.

  • 你好!前段时间有点事,问题搁置了。还是那问题,gpmc_csn1引脚初始化的时候设置的是mode0,结果用devmem2读出来成了mode7。

    我该如何解决,再谢!!!

  • 我用

    榜眼 24950 points

    @ 发现是

    # devmem 0x44e10880
    0x00000008

    这是什么意思 望解惑谢谢