1. STM32的FSMC接口可以控制外部的NANDFlash,因此学习下,先看下硬件电路,地址线是A16.A17,数据线D0-D7,那么映射的地址空间是多少?D0是数据/地址线,两个用途。
2. 引脚图,现在关心的是,这个NAND的地址映射的地址空间是多少?
3. 看下STM32的手册。
4. 看下代码,STM32的库基本都封装好的函数,直接调用即可,函数名字一看就明白,还是回到原来的问题,划分的地址空间是多少?代码为我们划分ZONE,Block, Page,封装了底层的地址,一块nand flash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同。
需要注意的是,对于flash的读写都是以一个page开始的,但是在读写之前必须进行flash的擦写,而擦写则是以一个block为单位的。
FSMC_NAND_Init();
/* NAND read ID command */
FSMC_NAND_ReadID(&NAND_ID);
/* Verify the NAND ID */
if((NAND_ID.Maker_ID == NAND_ST_MakerID) && (NAND_ID.Device_ID == NAND_ST_DeviceID))
{
/* NAND memory address to write to */
WriteReadAddr.Zone = 0x00;
WriteReadAddr.Block = 0x00;
WriteReadAddr.Page = 0x00;
/* Erase the NAND first Block */
status = FSMC_NAND_EraseBlock(WriteReadAddr);
/* Write data to FSMC NAND memory */
/* Fill the buffer to send */
Fill_Buffer(TxBuffer, BUFFER_SIZE , 0x66);
status = FSMC_NAND_WriteSmallPage(TxBuffer, WriteReadAddr, PageNumber);
/* Read back the written data */
status = FSMC_NAND_ReadSmallPage (RxBuffer, WriteReadAddr, PageNumber);
/* Verify the written data */
for(j = 0; j < BUFFER_SIZE; j++)
{
if(TxBuffer[j] != RxBuffer[j])
{
WriteReadStatus++;
}
}
if (WriteReadStatus == 0)
{ /* OK */
/* Turn on LD1 */
GPIO_SetBits(GPIOF, GPIO_Pin_6);
}
else
{ /* KO */
/* Turn on LD2 */
GPIO_SetBits(GPIOF, GPIO_Pin_7);
}
}
else
{
/* Turn on LD3 */
GPIO_SetBits(GPIOF, GPIO_Pin_8);
}
5. 看下芯片资料,页是512字节,Block是16K字节,不懂后面+16什么意思?
Page size – x8 device: (512 + 16 spare) Bytes
Block size – x8 device: (16K + 512 spare) Bytes
6. 问题是为啥是Bank2不是Bank3,怎么确定的?大致去推测一下,
FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;
7. 开始推测,NANDFlash的地址总线最多16位,算了,好像是FSMC_NCE2(看原理图)决定选的那个BANK,所以是BANK2