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.

GPMC_A11管脚没输出

Other Parts Discussed in Thread: AM3354, SYSCONFIG

FPGA当作RAM挂在am3354的GPMC上。数据位是16bit的,地址用的是A0到A11。片选用的CS0,异步读写。GPMC上没有NAND等其他东西,只有个FPGA。引脚如图

问题就是:读写都没问题,但是读写地址超过0x800时,地址线A11没有变化,其他地址位都会有变化。

举个例子:往0xC22的地方写0x1234,signaltag抓回来的信号如图

写入的地址显示是0x422,最高地址位A11没有输出高电平。


1.已经再三检查过管脚复用的配置,GPMC_A11管脚就是配成A11,也读取过引脚配置寄存器查看过没问题。

2.把GMPC_A11配成GPIO输出高电平,sinaltag能捕获到。也试过将GMPC_A11配成A11的地址位加上上拉输出使能,发现低地址时A11也一直是高电平,感觉就没有输出。

3.在linux阶段跟uboot阶段都试过读写,一样A11没有任何反应。

管脚配置代码如下:

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},
	{"gpmc_a0.gpmc_a0", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a1.gpmc_a1", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a2.gpmc_a2", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a3.gpmc_a3", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a4.gpmc_a4", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a5.gpmc_a5", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a6.gpmc_a6", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a7.gpmc_a7", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a8.gpmc_a8", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a9.gpmc_a9", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a10.gpmc_a10", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"gpmc_a11.gpmc_a11", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
	{"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_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},
	{NULL, 0},
};
  • GPMC_CS_CONFIG7 设成0xF41时,fpga就挂在arm地址空间的0x1000000位置。

    我读写直接用的writew(); 读写这个地址。

  • 确认几个信息,你是不是在当前片选的CONFIG0上已经配成了NOR flash类型的device,然后,16位数据线,地址数据不复用?

    在你的这个测试里面,除了GPMC_A11管脚,其他的pin脚都是正常的?

    看你原理图上面的是16位数据宽度,data线从0~15都用上了,如果找这样配置的话,地址线的最低位A0,应该是GPMC_A1这个脚,GPMC_A0这个脚在这种配置模式下应该是没有使用的,参考TRM手册的7.1.3.1 gpmc signals。但你原理图上面把GPMC_A0接出来了,确认没用错吧。

  • 确认了GPMC_CONFIG1配的是Nor flash,16bit数据,Non-multiplexed attached device。

    A0接到FPGA了,后来发现16bit数据的模式A0没有用,所以没有去理它,纯粹就是连了根线。

    除了A11管脚,其他都能用,所以觉得很奇怪。


    我看手册gpmc模块中,地址ADD[10:1]跟ADD[27:11]分成两个部分,是不是这个有什么玄机啊。

    求教,我已经把能我考虑的点都考虑过了。

  • 没什么玄机,你看下TRM手册的table 7-5,复用的16bit 模式,其中GPMC_A10之后不是连续的。所以在这里写开了。

    Pinmux通过寄存器打印的方式也核查了没问题?

    你有没有连接gpmc_a12 pin出来?你的寻址空间分了16MByte,你配成的非复用模式下,这才用到了几KB。鉴于A11是你目前用到的最高位,如果有可能的话,测一下A12,看对这里的读写是否正确?

  • 问题解决了,在配置gpmc各个寄存器之间写GPMC_SYSCONFIG 进行软复位,然后A11管脚就有输出了。

    不过现象还是蛮奇怪的,所以编程还是地按流程来。

  • 问题解决了,在配置gpmc各个寄存器之间写GPMC_SYSCONFIG 进行软复位,然后A11管脚就有输出了。

    不过现象还是蛮奇怪的,所以编程还是地按流程来。

  • 楼主的驱动是基于哪个版本的kernel写的?我现在遇到一个问题就是把你初始化的那部分修改为了dts文件,加载ko,再进行写数据的时候,数据位全部变低,但是CSN1还是高电平,麻烦楼主分享下哈.

  • 3.2.0的版本,这版本TI还没用设备树。我的驱动是基于这个改的http://bbs.eeworld.com.cn/thread-333652-1-1.html。

    你确认pinmux管脚复用设置对了,GPMC_CONFIG1i和GPMC_CONFIG7i这两个寄存器设置对了,就基本会有反应的。

  • 我的复用也是基于你说的这篇帖子做的,只是将帖子中楼主的复用配置写到DTS中去了,驱动也是帖子中的驱动,加载驱动后,写数据前,AD位和CSn1(P8-21)位都为高,写数据后,AD位都为低,但是CSn1位还是高,BTW,楼主的3.2.0的版本可以跑在beaglebone black的板子上不?我QQ:40693489,希望楼主加下,请教下!多谢!

  • 我在裸机下是可以访问高位A11,但是到linux下就不能访问,裸机和linux的代码区别就是软复位,但是linux下只要一加软复位,系统就死机了。因为linux下我有nand和和fpga,裸机只有fpga,不知什么原因?