Board logo

标题: 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