开发板的接了4片 64M x 16bit的内存,两片按数据线的高低16bit的模式组成了两组,一组挂在DMC0的CS0,另外一组挂在DMC1的CS0。然后相应的配置了DMC0和DMC1。
因为两个控制器上都是只使用了CS0,MEMCONTROL 的num_chip我就选了1 chip。
然后两个的MEMCONFIG0对应的地址应该是0x2xxx_xxxx和0x3xxx_xxxx。因为没有使用CS1,MEMCONFIG1就不应该配置了。
然后配置如下:
#define DMC0_MEMCONFIG0 0x20f00323 // 0x2000_0000~0x2fff_ffff 256M
#define DMC0_MEMCONFIG1 0x00f00323 // 应该没用啊???
#define DMC1_MEMCONFIG0 0x30f00323 // 0x3000_0000~0x3fff_ffff 256M
#define DMC1_MEMCONFIG1 0x00f00323 // 应该没用啊???
结果低256M内存是OK的。访问高256M就会死机。
要是设成
#define DMC0_MEMCONFIG0 0x20e00323 // 0x2000_0000~0x3fff_ffff 512M
#define DMC0_MEMCONFIG1 0x00f00323 // 应该没用啊???
#define DMC1_MEMCONFIG0 0x40e00323 // 0x4000_0000~0x5fff_ffff 512M
#define DMC1_MEMCONFIG1 0x00f00323 // 应该没用啊???
这个从0x2000_0000到0x5xxx_xxxx都能访问。但修改0x21000000的值,0x23000000的值也会相应修改。
感觉从这点看,DCM1应该还是跑起来了。但是这个MEMCONFIG到底应该怎么配啊?
另外,在时钟配置里面有DMC0的source和Divider配置(CLK_SRC6和CLK_DIV6),但DMC1的呢?DMC1的时钟是从哪来的?
------解决方案--------------------
该回复于2012-03-22 14:11:31被版主删除
------解决方案--------------------
前面写的"修改0x21000000的值,0x23000000的值",发现是Row Address弄错了。内存的是A0 ~ A12,我给配成0x2 = 14 bits了。开发板的也是错的。
但是
#define DMC0_MEMCONFIG0 0x20f00313 // 0x2000_0000~0x2fff_ffff 256M
#define DMC1_MEMCONFIG0 0x30f00313 // 0x3000_0000~0x3fff_ffff 256M
配置还是一访问0x3xxx_xxxx的就死机。
------解决方案--------------------
看一下和DMC1的相关配置
------解决方案--------------------
试了各种配置。发现一个现象:
#define DMC0_MEMCONFIG0 0x20f00313 // 0x2000_0000~0x2fff_ffff 256M
#define DMC1_MEMCONFIG0 0x30f00313 // 0x3000_0000~0x3fff_ffff 256M
访问0x3xxx_xxxx会死机。
要是
#define DMC0_MEMCONFIG0 0x20f00313 // 0x2000_0000~0x2fff_ffff 256M
#define DMC1_MEMCONFIG0 0x40f00313 // 0x3000_0000~0x3fff_ffff 256M
访问0x4xxx_xxxx是正常的。0x50也是正常。
说明0x3xxx_xxxx的地址就不能用于DMC1。
看了一下芯片手册,memory map里面
DMC0 0x2000_0000 ~ 0x3FFF_FFFF
DMC1 0x4000_0000 ~ 0x7FFF_FFFF
可能DMC0,DMC1不论如何配置都只能使用自己对应的地址空间了。
------解决方案--------------------
上面的问题会导致内存空间的不连续,0x2000_0000~0x2fff_ffff和0x4000_0000~0x4fff_ffff
要想内存空间连续,可以将DMC0的地址配置到0x3xxx_xxxx。就变成0x3000_0000~0x4fff_ffff。
最终的配置
#define DMC0_MEMCONFIG0 0x30f00313 // 0x3000_0000~0x3fff_ffff 256M
#define DMC1_MEMCONFIG0 0x40f00313 // 0x4000_0000~0x4fff_ffff 256M
再改一下相应的配置,测试通过。
结贴了。每次都是自己结的贴。
------解决方案--------------------
SetReg32(rDMC0_MEM_CONTROL, ((2<<20)
------解决方案--------------------
(0<<16)
------解决方案--------------------
(2<<12)
------解决方案--------------------
(MEM_TYPE<<8)
------解决方案--------------------