参考手册Blackfin 访问外部NandFlash 有2种基本方式:1.直接读取,适合非整页,速度大概只有DMA一半,且占用CPU时间很多,也就是会阻塞线程。
2. DMA方式,最小读取单位为page。 我在实际使用中,比如读取1个BLOCK代码如下
aNFDAddress.callbackparamter = NULL; //这里必须为空,前63次读取不会进入回调~~!!
for(n=0; n<64; n++)
{
if(n==63) aNFDAddress.callbackparamter = XX;//这里一定要把回调参数设置非空,最后1次DMA请求后,才会进去回调函数!!!
adi_dev_Control(nfc_handle, ADI_NFC_CMD_NFD_ACCESS_REQUEST, (void *) aNFDAddress);//输入block page 地址的结构体
adi_dev_Read (nfc_handle, ADI_DEV_1D, (ADI_DEV_BUFFER*)&buf); //输入接收缓冲区 并启动DMA转换
aNFDAddress的页地址++;//访问下一page
buf += Page_Size; //1维数组指针指推移1page 用于接收下一page的数据
}
/***********/
回调函数
callback()... //只有1个判断语句 而且前63次的回调参数都是NULL 不会进回调(由API内部机制实现)。
如上所述,由于访问外部Nandflash是需要时间的,而我的adi_dev_Read 后面的代码只有几条,for循环不断的在 REQUEST 和 READ 每执行完1次DMA 就会进回调。我们要求DMA去从Nandflash 速度远大于代码执行,因为page为2K,而我访问外部Nandflash的速度为 4MB/S 2K字节大约需要万分之5秒 就是0.5ms = 500ns ,CPU的主频是533MHZ。假设执行1条++指令 需要1个时钟周期,大约也就是 2ns 。
2个++指令和进入回调函数执行的代码条数 小于20条 那么就会出现前1次DMA没有结束,新的DMA请求就可能触发了,请问andy帅哥 这个Blackfin的 Nandflash 是否有FIFO机制 ,因为对于我们用户来说,我们在API手册只看到例子是 Control 接着 Read ...
推断: 我觉得Blackfin的Nandflash的这两个函数已经做了各种考虑,用户在进入回调函数里,做标记即可。这样NANDFLASH 也出于可再次访问状态。
「该帖子被 lvben5d 在 2014-04-04 11:45:28 编辑过」