自己制作的处理板,使用DSP为28379D,emif外扩电路参考的是C2000Ware_2_00_00_02\boards\TIDesigns\F28379D_EMIF_DC中的电路设计,Flash选用的型号与参考设计一致,均为S29AL016J70TFI020。flash与dsp的所有电路链接都与emif_dc中的设计一致。
但使用c2000Ware提供的emif_dc_flash例程时(C:\ti\c2000\C2000Ware_2_00_00_02\device_support\f2837xd\examples\cpu1\emif_dc_flash)发现一些问题:
- 1.原始代码无法实现对flash的读写控制,运行到进入CFI代码处时就会有错误,变量error加一。
errors = 0;
EMIF_DC_enterCS2FlashCFI(EMIF_NUM);//进入CFI,向0x55(Flash地址)上写数据0x98
if( (dataBuffer[16] != 0x51) ||
(dataBuffer[17] != 0x52) ||
(dataBuffer[18] != 0x59) )
{
errors++;
ESTOP0;
}
我也根据自己的GPIO分配,将 #define EMIF_DC_F2837X_LAUNCHPAD_V1 修改为 0。
后来将函数EMIF_DC_initCS2(EMIF_NUM, EMIF_DC_FLASH);中的寄存器值进行修改(//后的值为原始代码):
if( CS2Mem == EMIF_DC_FLASH ) {
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.SS = 0;//0
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.EW = 0;//0
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.W_SETUP = 15;//0
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.W_STROBE = 0x3f;//4
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.W_HOLD = 7;//0
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.R_SETUP = 15;//3
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.R_STROBE = 0xf;//5
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.R_HOLD = 7;//0
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.TA = 3;//2
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.ASIZE = 1;//1
}
就实现了对flash的CFI序列读写。
请问各位老师,这些寄存器的值原始例程中是如何计算得到的呢?我又该如何根据flash的datasheet来修改配置?
- 2.只能对flash的低8bit进行读写操作
在后续程序 擦除flash内容代码:
//
// Erase flash and verify buffer contents
//
EMIF_DC_eraseCS2Flash(EMIF_NUM);
for(word=0; word<BUFFER_WORDS; word++)
{
if(dataBuffer[word] != 0xFFFF)
{
errors++;
ESTOP0;
break;
}
}
我发现,EMIF_DC_eraseCS2Flash(EMIF_NUM);执行完后所有数据是0xFF而非0xFFFF。
后面对flash数据进行写操作也会出现同样的只能对低8bit操作的问题(例如,对某一地址写入0x0101,但该地址内实际对应的值为0x0001):
//
// Program dataBuffer contents
//
for(word=0; word<BUFFER_WORDS; word++)
{
EMIF_DC_programCS2Flash(EMIF_NUM, (Uint32)&dataBuffer[word], word);
}
//
// Verify dataBuffer contents
//
for(word=0; word<BUFFER_WORDS; word++)
{
if(dataBuffer[word] !=( word))
{
errors++;
ESTOP0;
break;
}
}
经过查看原理图,TI给出的F28379D_EMIF_DC.pdf原理图中,flash的BYTE#与WP#两个管脚(下图中圈出来的地方),我认为是被悬空未连接的,在自己的设计中将他们悬空,不知是否是这个原因导致BYTE#将flash配置为byte状态而只能对8bit数据进行操作?请问这两个管脚设计时的连接状态应该是怎样的?
但为何进入CFI模式和擦除命令,我都按照Word模式的命令进行操作,能够有响应;而将代码修改
EMIF_DC_REGS[emifModule]->ASYNC_CS2_CR.bit.ASIZE = 0
即flash配置为byte,按照byte进行命令操作,CFI都读取不正确呢?
希望各位老师能够给予指导!万分感激!