首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

spi flash 调试总结(2)

spi flash 调试总结(2)

// 读之前,得设置一下模式




NST_SPI->SSIENR= 0x00;


NST_SPI->CTRLR0=
(SPI_TMOD_EPROMREAD << SPI_TMOD_OFFSET) | (SPI_FRF_SPI << SPI_FRF_OFFSET) |(SPI_FRM_SIZE - 1) |( SPI_MODE_3 << 6);


NST_SPI->CTRLR1= MAX_FLASH_RD_SIZE - 1;
/*
连续读数据个数*/


NST_SPI->SSIENR= 0x01;




BSP_SpiWriteByte(FLASH_CMD_CARLF);


BSP_SpiWriteByte((FlashAdr>>16) & 0xFF);


BSP_SpiWriteByte((FlashAdr>>8) & 0xFF);


BSP_SpiWriteByte(FlashAdr & 0xFF);




BSP_SpiRead(MAX_FLASH_RD_SIZE, pRxData);




BSP_SpiWait();
//
一个读逻辑的完成




DnldByteCnt += MAX_FLASH_RD_SIZE;


ReadAddr += MAX_FLASH_RD_SIZE;




FWLen = *(UINT32*)pRxData;


pRxData += MAX_FLASH_RD_SIZE;


DBGPRINT(DEBUG_INFO, "READ FLASH BatchRdCnt =%d, pBuf=0x%x\n", ++BatchRdCnt, pBuf);


//
UsDelay(30000);




while(FWLen > DnldByteCnt)


{


UINT32 RdCnt = (FWLen - DnldByteCnt) > MAX_FLASH_RD_SIZE ? MAX_FLASH_RD_SIZE : (FWLen - DnldByteCnt);




FlashAdr = (((ReadAddr/FLASH_PAGE_SIZE) << 9) | (ReadAddr % FLASH_PAGE_SIZE));

        

//BSP_SpiFlashWaitBusy();




//
读之前,得设置一下模式




NST_SPI->SSIENR= 0x00;


NST_SPI->CTRLR0=
(SPI_TMOD_EPROMREAD << SPI_TMOD_OFFSET) | (SPI_FRF_SPI << SPI_FRF_OFFSET) |(SPI_FRM_SIZE - 1) |( SPI_MODE_3 << 6);


NST_SPI->CTRLR1= RdCnt - 1; //
连续读写数据个数


NST_SPI->SSIENR= 0x01;

        

// send cmd


BSP_SpiWriteByte(FLASH_CMD_CARLF);


BSP_SpiWriteByte((FlashAdr>>16) & 0xFF);


BSP_SpiWriteByte((FlashAdr>>8) & 0xFF);


BSP_SpiWriteByte(FlashAdr & 0xFF);




BSP_SpiRead(RdCnt, pRxData);


BSP_SpiWait();
//
一个读逻辑的完成


DnldByteCnt += RdCnt;


ReadAddr += RdCnt;


pRxData += RdCnt;




DBGPRINT(DEBUG_INFO, "READ FLASH BatchRdCnt =%d, pBuf=0x%x\n", ++BatchRdCnt, pBuf);


//
UsDelay(1000);


}

   
}
备注:
1)、BSP_SpiRead函数如下:
VOID BSP_SpiRead(UINT32 RdCnt, UINT8* pBuf)

{

UINT8 RxByte;

   

while(RdCnt > 0)


{


if(NST_SPI->SR & SR_RF_NOT_EMPT)
//SPI
状态寄存器
RFNE域的经典用法

{


*pBuf++ =
NST_SPI->DR;


RdCnt--;


}


}



// throw the redundant bytes

if(NST_SPI->SR & SR_RF_NOT_EMPT)


{


RxByte =
NST_SPI->DR;


RxByte =RxByte; // remove warning



}

}
2)、这个EEPROM Read模式不知道的不会用,知道时会吓一跳,总体感觉要理解这哥们太难了,在读之前只能发送一个命令和三个地址,如果在发送一个伪码读回来就会少一个字节,同时读回来的数据是CONTROL1来决定的(最大是64K)。

这种模式的总体感觉就是:你在被他的智能吓一跳的同时,又会觉得这个模式太苛刻了,都不知道该骂他还是赞美他了。





三、调试中的难点:
简单点就是,要在心里把一个变态看成正常人太难了。


复杂点,罗列如下:
1、
知道用
BSP_SpiWait
函数来表示一个读写逻辑的结束

2、
知道在一个读写逻辑没结束之前,要狂写和狂读,当然在每一次狂写和狂读之前要判读读写FIFO的空满情况。
3、
要去理解EEPROM Read模式
继承事业,薪火相传
返回列表