开发平台为EVM5515,由于PC28F128P30T85已经停产,且价格很高,120RMB/PCS。
PC28F128P30T85和MT28GU256AAA2EGC是Pin to Pin兼容的,容量分别是128MB和256MB。
如果将PC28F128P30T85换成MT28GU256AAA2EGC后,驱动参数怎么修改?
EVM5515开发板的例程CSL_EMIF_NOR_CpuTransfer文件如下
csl_nor.c
CSL_NOR_CpuTransfer.c
CSL_NOR_Test.h
函数CSL_norCpuTransferTest()中用到了几个关键的宏
PC28F128P30T85_ASYNCCFG_DEFAULT
PC28F128P30T85_ASYNCWAITCFG_DEFAULT
PC28F128P30T85_NORCFG_POLLED
它们在CSL_NOR_Test.h中定义。
我现在换成MT28GU256AAA2EGC后,该怎么修改呢?
Tony Tang:
还可以用SPI flash。
Shide Lu:
回复 Tony Tang:
用SPI flash启动速度太慢了,无法满足产品要求。之前发帖说过这个问题。提高SPI flash速度到最高,启动时间还要4~5秒。
Shine:
这几个宏不是必须要改的,只是一个名称,需要到csl_nor.h里的PC28F128P30T85 参数定义都要改成MT28GU256AAA2EGC的参数
Shide Lu:
回复 Shine:
这个当然明白。我就是不知道怎么改这些参数。PC28xx和MT28xx都是intel的,Pin2Pin兼容,只是后者容量增大了一倍。
但换上之后,CSL_EMIF_NOR_CpuTransfer例程无法正确识别,输出信息为“No Device Found”。
Tony Tang:
回复 Shide Lu:
先对比一下两份手册,device id 地址是一样的 :
看了一下代码,应该跟配置没有关系。是不是硬件没焊好。
status = NOR_readId(hNor); if(CSL_SOK != status) { printf("READ ID: Bad Status\n"); } if((0xFF == hNor->deviceID[1]) || (0xFFFF == hNor->deviceID[1])) { printf("No Device Found\n"); }
CSL_Status NOR_readId(CSL_NorHandle hNor){ CSL_Status status;
status = CSL_SOK;
/* Read NOR ID */ if(CSL_NOR_INTEL_STD_CMDSET & hNor->commandSet) { *(CSL_VUint16*)hNor->CSnBASE = 0x90; } else if (CSL_NOR_AMD_STD_CMDSET & hNor->commandSet) { if(CSL_NOR_8_BIT == hNor->norWidth) { *(CSL_VUint16*)(hNor->CSnBASE+0xAAA) = 0xAA; *(CSL_VUint16*)(hNor->CSnBASE+0x555) = 0x55; *(CSL_VUint16*)(hNor->CSnBASE+0xAAA) = 0x90; } else if(CSL_NOR_16_BIT == hNor->norWidth) { *(CSL_VUint16*)(hNor->CSnBASE+0x555) = 0xAA; *(CSL_VUint16*)(hNor->CSnBASE+0x2AA) = 0x55; *(CSL_VUint16*)(hNor->CSnBASE+0x555) = 0x90; } } __asm(" NOP");/*For "A write followed by A read" pre-fetch reordering*/ __asm(" NOP"); __asm(" NOP"); if(CSL_NOR_INTEL_STD_CMDSET & hNor->commandSet) { hNor->deviceID[0] = (*(CSL_VUint16*)(hNor->CSnBASE+0x00));/*man id*/ hNor->deviceID[1] = (*(CSL_VUint16*)(hNor->CSnBASE+0x01));/*dev id*/ hNor->deviceID[2] = (*(CSL_VUint16*)(hNor->CSnBASE+0x05));/*rcr*/ } else if (CSL_NOR_AMD_STD_CMDSET & hNor->commandSet) { if(CSL_NOR_8_BIT == hNor->norWidth) { hNor->deviceID[0] = (*(CSL_VUint16*)(hNor->CSnBASE+0x00));/*man id*/ hNor->deviceID[1] = (*(CSL_VUint16*)(hNor->CSnBASE+0x02));/*dev id-1*/ hNor->deviceID[2] = (*(CSL_VUint16*)(hNor->CSnBASE+0x1C));/*dev id-2*/ hNor->deviceID[3] = (*(CSL_VUint16*)(hNor->CSnBASE+0x1E));/*dev id-3*/ } else if(CSL_NOR_16_BIT == hNor->norWidth) { hNor->deviceID[0] = (*(CSL_VUint16*)(hNor->CSnBASE+0x00));/*man id*/ hNor->deviceID[1] = (*(CSL_VUint16*)(hNor->CSnBASE+0x01));/*dev id-1*/ hNor->deviceID[2] = (*(CSL_VUint16*)(hNor->CSnBASE+0x0E));/*dev id-2*/ hNor->deviceID[3] = (*(CSL_VUint16*)(hNor->CSnBASE+0x0F));/*dev id-3*/ }
/*Reset to exit auto-select mode for AMD*/ *(CSL_VUint16*)(hNor->CSnBASE+0x0) = 0xF0; }
return status;}
你也可以跟踪看一下读回来的deviceID0~3值到底是多少?
Shide Lu:
回复 Tony Tang:
好的,我试试