Part Number:TMS320C6748
各位好
调试nandflash,调用了startware的源码,但是有些地方看不懂,请教下。
static NandStatus_t NANDPageReadCmdSend(NandInfo_t *nandInfo, unsigned int blkNum,
unsigned int pageNum, unsigned int columnAddr)
{
NandStatus_t retVal;
unsigned int count;
unsigned int pageAddr;
NANDCommandWrite(nandInfo->cmdRegAddr, NAND_CMD_READ);
/* Write 2 bytes of column addr */
NANDAddressWrite(nandInfo->addrRegAddr,
(unsigned char)(columnAddr & 0xFF));
NANDAddressWrite(nandInfo->addrRegAddr,
(unsigned char)((columnAddr >> 8) & 0xFF));
pageAddr = ((blkNum * (nandInfo->blkSize/nandInfo->pageSize)) + pageNum);
/* Write the row address. */
for (count = 0; count < 3; count++)
{
NANDAddressWrite(nandInfo->addrRegAddr,
(unsigned char)pageAddr);
pageAddr = pageAddr >> 8u;
}
NANDCommandWrite(nandInfo->cmdRegAddr, NAND_CMD_READ_CYC2);
retVal = NANDWaitUntilReady(nandInfo);
return retVal;
}
这个发送读命令的函数,我的疑问是nandInfo->cmdRegAddr、nandInfo->addrRegAddr这两个地址是什么意思。从字面理解是命令寄存器地址、地址寄存器地址,但这个地址是怎么计算的啊,我在数据手册中也没有找到这些寄存器的地址值,所以想请大家指教下,
谢谢
Nancy Wang:
请查看 TRM 18.2.5.6.3 Driving CLE and ALE,emif的地址线与ALE/CLE相接控制这两个信号。
https://www.ti.com.cn/cn/lit/ug/spruh79c/spruh79c.pdf
,
user4835762:
我看了手册中的描述,但是还是不太懂。
NANDCommandWrite(nandInfo->cmdRegAddr, NAND_CMD_READ);
这句话是向这个寄存器写了地读指令,
nandInfo->cmdRegAddr = (SOC_EMIFA_CS3_ADDR + 0x10); 这是nandInfo->cmdRegAddr 的值,
根据手册,0x08代表向CLE的低位和ALE的高位写数?
是这个意思吗?
谢谢
,
Nancy Wang:
nand flash也是异步访问,所以要考虑EMA_BA与EMA_A结合生成内部地址,ALE/CLE高低的变化也就是A[1]/A[2]的变化。
请参考18.2.5.1 Interfacing to Asynchronous Memory
,
user4835762:
谢谢您的回答
查看资料,看到nand flash好像没有直接操作读写的,而是都有个中间层 mtd ftl,来对nand flash进行管理,请问C6748有提供相关的文件或者技术支持吗?或者有什么好的建议吗?
谢谢
,
Nancy Wang:
user4835762 说:中间层 mtd ftl,来对nand flash进行管理
mtd是linux下的。
你前面贴出的裸机程序就是通过emif对nand flash进行读写操作。
,
user4835762:
谢谢回复
是的 mtd属于linux上的,
那我想请问下,emif的代码能够像mtd那样去管理nandflash吗。或者有没有demo能够管理nandflash呢?
谢谢
,
user4835762:
如果不对nandflash进行管理,上层直接使用会很不方便。
如果调用emif对nand flash进行读写操作接口的话,上层使用会很不方便,所以是否还有其他的demo提供呢?
谢谢
,
Nancy Wang:
没有提供其它demo。
,
user4835762:
好吧 谢谢