STM32F103的FSMC读写NANDFlash的学习

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值