TI中文支持网
TI专业的中文技术问题搜集分享网站

GPMC与FPGA通信问题 ——有问题,望专家给出指导意见

通过GPMC来访问FPGA,FPGA作为norflash。Linux内核版本2.6.32,ARM为DM3730.

采用同步方式读写,需要配置的时序是Synchronous Single Read模式。
参考各方资料,对于ARM向FPGA的写已经调通,但是读功能却一直未能如意。
现象:ARM已控制FPGA将数据送出,通过示波器测量和FPGA内部抓数,已发现数据线上数据正常,但是从ARM端读出的数据为0.

为减小篇幅贴上部分代码:
1、CONFIG寄存器设置
#define FPGA_GPMC_CONFIG1        0xA9001001
#define FPGA_GPMC_CONFIG2        0x001E1404        //CSontime = 4 fclk, CSRDofftime = 20 fclk
#define FPGA_GPMC_CONFIG3        0x000E0E02
#define FPGA_GPMC_CONFIG4        0x1D0C1484        //OEontime = 4 fclk, OEofftime = 20 fclk,
#define FPGA_GPMC_CONFIG5        0x01041F1F        //RDaccesstime = 2 fclk, RDcycletime = 31
#define FPGA_GPMC_CONFIG6        0x80000F0F
#define FPGA_GPMC_CONFIG7        0x00000F00
其中读写操作时读寄存器config7值为0x00000F41
2、读操作
if (down_interruptible(&fpga_dev.sem))
        return -ERESTARTSYS;
if (copy_from_user(&fpga_rwdata, (fpga_data*)arg, sizeof(fpga_rwdata))) {                        status = -EFAULT;
        goto fpga_read_done;
}
printk("\n*********fpga_read add = 0x%x\n",fpga_rwdata.fpga_add);
fpga_rwdata.fpga_val = readw(fpga_base + fpga_rwdata.fpga_add);
printk("******GPMC_CS_CONFIG7 value 0x%x\n", gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7));
if (copy_to_user((fpga_data*)arg, &fpga_rwdata, sizeof(fpga_rwdata))) {                        status = -EFAULT;
        goto fpga_read_done;
}
printk("*********read add = 0x%p\n",fpga_base + fpga_rwdata.fpga_add);
printk("*********read val = 0x%x\n",fpga_rwdata.fpga_val);
fpga_read_done:
up(&fpga_dev.sem);
}
3、应用层通过ioctl传输结构体指针
typedef struct {
        unsigned int fpga_add;
        unsigned int fpga_val;
}fpga_data;
fpga_data fpga_rwdata;

lei ding1:

不见回复?各位工程师给把把脉吧!!

lei ding1:

看来专家们都很忙,还望,抽空给点意见!

kooking:

一般是这种方式,FPGA准备好数据后给DM3730发中断,收到中断后驱动层就去读。

先确认下是3730是否收到中断,发的数据量也别太大

lei ding1:

回复 kooking:

谢谢回复!

我这边做的机制是这样的:首先,ARM是需要主动来读取FPGA中的数据(这个时机由ARM来随机确定),FPGA接收ARM发送的片选、读/写使能、地址来确定自己的工作状态,如果收到的是读使能,那么FPGA将自己的数据送至数据线。ARM此时来读取数据线上的数据,整个读取的过程仅读取一个word,即16根数据线的状态。

现在的读操作是在驱动层做的,FPGA在相应地址上数据是确定的,整个读的操作仅是在一个readw内完成,FPGA通过中断来触发和ARM主动读取,整个操作应该都是一样的。

现在ARM端readw后,硬件数据线上已经有响应的数据了,但是readw获得的值却一直是0. 其中readaccesstime已经调试过,仍没效果。

不知道问题在哪儿,谢谢!

kooking:

回复 lei ding1:

CONFIG1-CONFIG7这七个配置寄存器配置比较重要,不过相信你们应该注意这点了。

既然写已经OK,可不可以做个测试,写完了后,马上读取刚才写的数据,看这种情况下可不可以正确读取到数据

lei ding1:

回复 kooking:

感谢你的无私回复!

CONFIG这几个寄存器已经尝试配过很多种形式了,方向是依照datasheet上的Figure 10-16. Synchronous Single Read (GPMCFCLKDIVIDER = 1)来配置的。

参考你的建议通过测试发现:仍然不能读到数据,readw的返回值永远都是0. 即使我强制的将外部的数据线置成高位(直接上拉1.8V),仍然返回的是0。

谢谢!

Yue Woo:

回复 lei ding1:

您好!

        我在最近的开发中也遇到了同样的问题,写逻辑没问题,读的时候数据总线上数据不为零,但读上来的却始终是零。不知道楼主的问题是否已经解决?如已解决希望楼主能指点一下小弟,感激不尽!

lei ding1:

回复 Yue Woo:

首先请一定确保在IO口初始化时GPMC_CLK设置为允许输入,一般是在Uboot的平台初始化里,默认的初始化是仅输出型的。

Yue Woo:

回复 lei ding1:

万分感谢兄台的指点!刚才将CONTROL_PADCONF_GPMC_NCS7寄存器的第24bit配置为1,问题即得到解决,多谢兄台!

赞(0)
未经允许不得转载:TI中文支持网 » GPMC与FPGA通信问题 ——有问题,望专家给出指导意见
分享到: 更多 (0)