标题:
spi flash 调试总结(2)
[打印本页]
作者:
yuyang911220
时间:
2015-2-27 09:04
标题:
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
模式
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0