现在想通过6657的emif16接口访问cpld,但是我看到6657的emif相关寄存器中只有对配置成nand模式的相关寄存器,并没有配置成地址数据不复用的相关寄存器,于是我就按照如下的配置进行emif16的初始化:(cpld接在片选1上)
uint32_t epld_init(void)
{
hEmif16Cfg->A1CR = (0 \
| (1 << 31) /* selectStrobe */ \
| (0xf << 26) /* writeSetup 10 ns */ \
| (0x3f << 20) /* writeStrobe 40 ns */ \
| (7 << 17) /* writeHold 10 ns */ \
| (0xf << 13) /* readSetup 10 ns */ \
| (0x3f << 7) /* readStrobe 60 ns */ \
| (7 << 4) /* readHold 10 ns */ \
| (3 << 2) /* turnAround 40 ns */ \
| (0 << 0)); /* asyncSize 8-bit bus */ \
CSL_FINS(hEmif16Cfg->NANDFCTL, EMIF16_NANDFCTL_CE1NAND , CSL_EMIF16_NANDFCTL_CE1NAND_DISABLE); //非nand模式
/* Set the wait polarity */
hEmif16Cfg->AWCCR = (0x80 /* max extended wait cycle */ \
| (0 << 16) /* CS2 uses WAIT0 */ \
| (0 << 28)); /* WAIT0 polarity low */ \
hEmif16Cfg->IRR = (1 /* clear async timeout */ \
| (1 << 2)); /* clear wait rise */ \
return SUCCESS;
}
然后对epld的读操作是通过直接访问片选1的地址空间0x74000000加上寄存器偏移来是实现的:
uint8_t EPLDReadDataByte(uint32_t offset)
{
uint32_t addr = 0;
uint8_t data = 0;
addr = (offset + EPLD_DATA_ADDR);
data = *(uint8_t *)(addr);
return data;
}
按照该方法配置的话片选和读使能信号都有,但是为什么我访问的地址还是被送到了emif16的数据线上,也就是emif16还是被配置成了nand模式,
但是寄存器中并没有配置成其他模式的相关寄存器,我也将A1CR配置成了非nand模式,这是怎么回事?
Brighton Feng:
地址和数据分开是EMIF的缺省模式或者说是传统模式,不需要额外的配置。
从你的代码里没看出问题,能不能在出问题的时候把EMIF所有的寄存器导出来,确认一下是否被正确的配置了,或是否被意外修改了。