大家好,我手上有个beagle bone black 开发板, 想通过 GPMC的 与 FPGA进行 DMA读写,访问 FPGA内部寄存器时需要等待不同的 时钟周期。
因此,我需要吧 GPMC配成 带 WAIT的 NOR 同步模式,软件使用 AM335X_StarterWare 套件的驱动,以及 IAR开发工具编译裸机系统,JTAG下载运行。
程序跑起来后只要一读写 CS2的 地址空间,AM335X就会卡死等待,JTAG都连不上了,必须要掉电重来。
我手动 将FPGA 输出的 WAIT 线拉高拉低都不管用,只能将 GPMC_CONFIG Register (0x50000054)中的 WAIT0PINPOLARITY 改成 1h = WAIT0 active high,才不会卡死。将 GPMC_CONFIG1(2) 寄存器配置禁止 WAIT时,读写正常。
我现在觉得是 WAIT0 管脚没有配对,导致内部GPMC没有收到 WAIT0的 回应。 附初始化代码如下:请各位 专家帮忙看下,哪里有问题?谢谢~
int main() {BSPInit();UARTPuts("\n", -1);UARTPuts("*** cldr's am335x boot ***\n", -1);GPIO1ModuleClkConfig();GPIO0ModuleClkConfig();HWREG(SOC_CM_PER_REGS + CM_PER_GPIO2_CLKCTRL) |=CM_PER_GPIO2_CLKCTRL_MODULEMODE_ENABLE;HWREG(SOC_CM_PER_REGS + CM_PER_GPIO2_CLKCTRL) |=CM_PER_GPIO2_CLKCTRL_OPTFCLKEN_GPIO_2_GDBCLK;GPIOModuleEnable(SOC_GPIO_0_REGS);GPIOModuleReset(SOC_GPIO_0_REGS);GPIOModuleEnable(SOC_GPIO_1_REGS);GPIOModuleReset(SOC_GPIO_1_REGS);GPIOModuleEnable(SOC_GPIO_2_REGS);GPIOModuleReset(SOC_GPIO_2_REGS);HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_A(7)) = CONTROL_CONF_MUXMODE(0x7);GPIODirModeSet(SOC_GPIO_1_REGS, GPIO_LED_PIN_NUM, GPIO_DIR_OUTPUT);HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_CSN(3)) = CONTROL_CONF_MUXMODE(0x3);GPIO_PMUX_OFFADDR_VALUE(2, 0, PAD_FS_RXE_PU_PUPDE(7));GPIODirModeSet(SOC_GPIO_2_REGS, 0, GPIO_DIR_INPUT);HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_CSN(1)) = CONTROL_CONF_MUXMODE(0x7);GPIODirModeSet(SOC_GPIO_1_REGS, 30, GPIO_DIR_OUTPUT);GPIOPinWrite(SOC_GPIO_1_REGS, 30, GPIO_PIN_LOW);// Disable eMMC, output clk and command to 0.
HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_A(3)) = PIN_MODE(0) | ((PIN_PULL_UD_EN) & (~PIN_PULL_TYPE_SEL & ~PIN_RX_ACTIVE));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_A(2)) = PIN_MODE(0) | ((PIN_PULL_UD_EN) & (~PIN_PULL_TYPE_SEL & ~PIN_RX_ACTIVE));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_A(1)) = PIN_MODE(0) | ((PIN_PULL_UD_EN) & (~PIN_PULL_TYPE_SEL & ~PIN_RX_ACTIVE));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_A(0)) = PIN_MODE(0) | ((PIN_PULL_UD_EN) & (~PIN_PULL_TYPE_SEL & ~PIN_RX_ACTIVE));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(7)) = PIN_MODE(0) | ((PIN_PULL_UD_EN | PIN_RX_ACTIVE) & (~PIN_PULL_TYPE_SEL));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(6)) = PIN_MODE(0) | ((PIN_PULL_UD_EN | PIN_RX_ACTIVE) & (~PIN_PULL_TYPE_SEL));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(5)) = PIN_MODE(0) | ((PIN_PULL_UD_EN | PIN_RX_ACTIVE) & (~PIN_PULL_TYPE_SEL));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(4)) = PIN_MODE(0) | ((PIN_PULL_UD_EN | PIN_RX_ACTIVE) & (~PIN_PULL_TYPE_SEL));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(3)) = PIN_MODE(0) | ((PIN_PULL_UD_EN | PIN_RX_ACTIVE) & (~PIN_PULL_TYPE_SEL));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(2)) = PIN_MODE(0) | ((PIN_PULL_UD_EN | PIN_RX_ACTIVE) & (~PIN_PULL_TYPE_SEL));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(1)) = PIN_MODE(0) | ((PIN_PULL_UD_EN | PIN_RX_ACTIVE) & (~PIN_PULL_TYPE_SEL));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_AD(0)) = PIN_MODE(0) | ((PIN_PULL_UD_EN | PIN_RX_ACTIVE) & (~PIN_PULL_TYPE_SEL));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_WAIT0) = PIN_MODE(0) | PIN_PULL_UD_EN | PIN_RX_ACTIVE;HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_CSN(0)) = PIN_MODE(0) | ((PIN_PULL_UD_EN) & (~PIN_PULL_TYPE_SEL & ~PIN_RX_ACTIVE));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_CSN(2)) = PIN_MODE(0) | ((PIN_PULL_UD_EN) & (~PIN_PULL_TYPE_SEL & ~PIN_RX_ACTIVE));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_CLK) = PIN_MODE(0) | ((PIN_PULL_UD_EN | PIN_RX_ACTIVE) & (~PIN_PULL_TYPE_SEL));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_OEN_REN) = PIN_MODE(0) | ((PIN_PULL_UD_EN) & (~PIN_PULL_TYPE_SEL & ~PIN_RX_ACTIVE));HWREG(SOC_CONTROL_REGS + CONTROL_CONF_GPMC_WEN) = PIN_MODE(0) | ((PIN_PULL_UD_EN) & (~PIN_PULL_TYPE_SEL & ~PIN_RX_ACTIVE));GPMCClkConfig();EDMAModuleClkConfig();HWREG(0x50000000 + 0x10) = 0x00000008;//SYSCONFIGHWREG(0x50000000 + 0x1C) = 0x00000000;HWREG(0x50000000 + 0x40) = 0x00001FF0;HWREG(0x50000000 + 0x44) = 0x00000000;HWREG(0x50000000 + 0x48) = 0x00000000;HWREG(0x50000000 + 0x50) = 0x00000002;//GPMC_CONFIG//CS0HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG1(0)) = 0x28000003;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG2(0)) = 0x00040404;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG3(0)) = 0x00000000;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG4(0)) = 0x04040444;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG5(0)) = 0x04040404;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG6(0)) = 0x04040404;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG7(0)) = 0x00000F41;//CS2HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG1(2)) = 0x28600003;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG2(2)) = 0x00040404;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG3(2)) = 0x00000000;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG4(2)) = 0x04040444;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG5(2)) = 0x04040404;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG6(2)) = 0x04040404;HWREG(SOC_GPMC_0_REGS + GPMC_CONFIG7(2)) = 0x00000F42;shell(); }
Shine:
请问是否有参考过下面的帖子?https://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/20564.aspx
pc cldr:
回复 Shine:
我查看过这个帖子,我的情况和最后一位回帖 的一样,即便是手动将WAIT 置0或 置1 均不行。
论坛上也搜索过相关GPMC WAIT的帖子,暂时还没解决。
Jian Zhou:
回复 pc cldr:
你用的FPGA的数据线控制线以及wait大概是一个什么时序?有和GPMC的时序图对比过么?
pc cldr:
回复 Jian Zhou:
FPGA 逻辑代码是根据GPMC时序做的,FPGA有两个 CS分别接到 AM335X的 CS0,CS2。
其中 CS0是不需要等待的,AM335X配置CS0为: GPMC_CONFIG1(0) = 0x28000003; 禁用 WAIT。
而 CS2是需要 等待,AM335X配置CS2为: GPMC_CONFIG1(2) = 0x28600003; 使能 读和写的 WAIT。
AM335X读写 CS0均没有问题,就是 读写CS2 卡死,应该是GPMC硬件一直在等待 WAIT信号。
是不是我哪里配置有问题?谢谢
Steven Liu1:
回复 pc cldr:
建议做一个小测试,你把当前的模式设置成为不管wait的模式,然后对FPGA进行写操作,看一下,这样出来的片选和时序是和你设计的是一样的吗?
因为这一块出问题的东西相对可能较多,比如时序的配置,比如地址区间的划分等等。通过disuse wait,可以排除一下除了wait信号之前其他的部分有没问题。