用的128M的nand flash 多页的读写都完成了,但是由于LCD显示图片的时候 ,图片数量有点多,我想先把图片代码存在flash里面,然后切换屏幕的时候 再去读,自己写了个写常量的函数- -不知道为啥感觉总和我的定义的数组读出来的不一样
[mw_shl_code=c,true]WriteReadAddr.Zone = 0x00;
WriteReadAddr.Block = 0x01;
WriteReadAddr.Page = 0x00; [/mw_shl_code]
[mw_shl_code=c,true]FSMC_NAND_Writeconst(WriteReadAddr, 75);[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true]uint32_t FSMC_NAND_Writeconst(NAND_ADDRESS Address, uint32_t NumPageToWrite)
{
uint32_t index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
uint32_t status = NAND_READY, size = 0x00;
while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
{
/* Page write command and address */
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM;
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0X00;
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
/* Calculate the size */
size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten);
/* Write data */
for(index=NAND_PAGE_SIZE * numpagewritten; index < size; index++)
{
*(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA) =index;
}
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM_TRUE;
/* 读忙脚 */
// while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0 );
/* Check status for successful operation */
status = FSMC_NAND_GetStatus();
if(status == NAND_READY)
{
numpagewritten++;
NumPageToWrite--;
/* Calculate Next small page Address */
addressstatus = FSMC_NAND_AddressIncrement(&Address);
}
}
return (status | addressstatus);
}[/mw_shl_code]
[mw_shl_code=c,true]数组能有这么大static uint8_t Rx2 [153600];[/mw_shl_code]
[mw_shl_code=c,true]然后用下面读最后一页- -读出来和数组不一样 - -不知道哪里错了[/mw_shl_code]
[mw_shl_code=c,true]WriteReadAddr.Zone = 0x00;
WriteReadAddr.Block = 0x00;
WriteReadAddr.Page = 0x4a;
/* Read back the written data */
FSMC_NAND_ReadSmallPage (RxBuffer2, WriteReadAddr, 1);[/mw_shl_code]
[mw_shl_code=c,true]uint32_t FSMC_NAND_ReadSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToRead)
{
uint32_t index = 0x00, numpageread = 0x00, addressstatus = NAND_VALID_ADDRESS;
uint32_t status = NAND_READY, size = 0x00;
while((NumPageToRead != 0x0) && (addressstatus == NAND_VALID_ADDRESS))
{
/* Page Read command and page address */
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READ_1;
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0X00;
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);
*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);
*(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READ_TRUE;
/* 读忙脚 */
//while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0 );
/* Calculate the size */
size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpageread);
for(index=0; index < 0xff; index++);//延时
/* Get Data into Buffer */
for(index=NAND_PAGE_SIZE * numpageread; index < size; index++)
{
pBuffer[index-2]= *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
}
numpageread++;
NumPageToRead--;
/* Calculate page address */
addressstatus = FSMC_NAND_AddressIncrement(&Address);
}
status = FSMC_NAND_GetStatus();
return (status | addressstatus);
}
[/mw_shl_code]
[/mw_shl_code]
|