求助,429FMC接NAND FLASH问题,IO口如何配置?

2019-07-21 00:38发布

如题,项目要用到大容量NAND FLASH,选了,K9F1G08U0C 芯片
IO引脚按如下配置,
void FMC_NAND_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure; 
  FMC_NANDInitTypeDef FMC_NANDInitStructure;
  FMC_NAND_PCCARDTimingInitTypeDef  p;
  
  /* Enable FMC, GPIOD, GPIOE and AFIO clocks */
  
  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);
  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | 
                         RCC_AHB1Periph_GPIOG  , ENABLE);

  /*-- GPIO Configuration ------------------------------------------------------*/
  /* CLE, ALE, D0->D3, NOE, NWE and NCE2  NAND pin configuration  */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15 |  
                                 GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | 
                                 GPIO_Pin_7 | GPIO_Pin_6; 

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL; 

  GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_FMC);  
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FMC);


  GPIO_Init(GPIOD, &GPIO_InitStructure); 

  /* D4->D7 NAND pin configuration  */ 


  GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_FMC); 
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_FMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FMC);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  /* NWAIT NAND pin configuration */
 // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;    
 // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
 // GPIO_Init(GPIOD, &GPIO_InitStructure); 
  GPIO_PinAFConfig(GPIOG, GPIO_PinSource9, GPIO_AF_FMC);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
  GPIO_Init(GPIOG, &GPIO_InitStructure);
  
/* INT2 NAND pin configuration */  
 // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;    
//  GPIO_Init(GPIOG, &GPIO_InitStructure);

  /*-- FMC Configuration ------------------------------------------------------*/
  p.FMC_SetupTime = 0x1;
  p.FMC_WaitSetupTime = 0x3;
  p.FMC_HoldSetupTime = 0x2;
  p.FMC_HiZSetupTime = 0x1;

  FMC_NANDInitStructure.FMC_Bank = FMC_Bank2_NAND;
  FMC_NANDInitStructure.FMC_Waitfeature = FMC_Waitfeature_Enable;
  FMC_NANDInitStructure.FMC_MemoryDataWidth = FMC_NAND_MemoryDataWidth_8b;
  FMC_NANDInitStructure.FMC_ECC = FMC_ECC_Enable;
  FMC_NANDInitStructure.FMC_ECCPageSize = FMC_ECCPageSize_2048Bytes;
  FMC_NANDInitStructure.FMC_TCLRSetupTime = 0x00;
  FMC_NANDInitStructure.FMC_TARSetupTime = 0x00;
  FMC_NANDInitStructure.FMC_CommonSpaceTimingStruct = &p;
  FMC_NANDInitStructure.FMC_AttributeSpaceTimingStruct = &p;

  FMC_NANDInit(&FMC_NANDInitStructure);

  /* FMC NAND Bank Cmd Test */
  FMC_NANDCmd(FMC_Bank2_NAND, ENABLE);
}
运行读ID程序,读出的ID为全为0,,请问是那里出问题了?
void FMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID)
{
  uint32_t data = 0;

  /* Send Command to the command area */
  *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = 0x90;
  *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;

   /* Sequence to read ID from NAND flash */
   data = *(vu32 *)(NAND_FLASH_START_ADDR | DATA_AREA);

   NAND_ID->Maker_ID   = ADDR_1st_CYCLE (data);
   NAND_ID->Device_ID  = ADDR_2nd_CYCLE (data);
   NAND_ID->Third_ID   = ADDR_3rd_CYCLE (data);
   NAND_ID->Fourth_ID  = ADDR_4th_CYCLE (data);  
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
taizonglai
1楼-- · 2019-07-21 02:18
不要用自带的库里面的NAND读ID函数,那个都ID的函数有问题,你要根据你所使用的NAND的型号写读ID函数,和库里面的函数FMC_NAND_ReadID()差不多
ljinwei6
2楼-- · 2019-07-21 04:09
 精彩回答 2  元偷偷看……
ljinwei6
3楼-- · 2019-07-21 07:11
回复【2楼】zuozhongkai:
---------------------------------
谢谢左哥的回复,那这个读ID的函数到底怎么写呢?还有就是,我现在的PD6脚的配置对不对?我单独设置成上拉输入模式的话,程序就无法读ID。死那读ID那了,
taizonglai
4楼-- · 2019-07-21 09:35
这个要看你用不用硬件等待了,如果你用了硬件等待的话PD6就配置成NWAIT就可以了,也就是复用成FMC

一周热门 更多>