OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6973|回复: 4

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

[复制链接]

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-9-6
在线时间
7 小时
发表于 2015-12-15 11:32:06 | 显示全部楼层 |阅读模式
5金钱
如题,项目要用到大容量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);  
}


最佳答案

查看完整内容[请看2#楼]

不要用自带的库里面的NAND读ID函数,那个都ID的函数有问题,你要根据你所使用的NAND的型号写读ID函数,和库里面的函数FMC_NAND_ReadID()差不多
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-12-15 11:32:07 | 显示全部楼层
不要用自带的库里面的NAND读ID函数,那个都ID的函数有问题,你要根据你所使用的NAND的型号写读ID函数,和库里面的函数FMC_NAND_ReadID()差不多
开往春天的手扶拖拉机
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-9-6
在线时间
7 小时
 楼主| 发表于 2015-12-15 11:32:07 | 显示全部楼层
首先谢谢左版主要的关注和回复,,搞了我两天,真正的问题解决了!是头文件定义里出错了,
#define CMD_AREA                   (uint32_t)(1<<16)  /* A16 = CLE  high */
#define ADDR_AREA                  (uint32_t)(1<<17)  /* A17 = ALE high */
这个才是正确的,下面的是错误的,
#define CMD_AREA                   (uint32_t)(1<<17)  /* A17 = CLE  high */
#define ADDR_AREA                  (uint32_t)(1<<16)  /* A16 = ALE high */
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-9-6
在线时间
7 小时
 楼主| 发表于 2015-12-15 16:18:47 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
谢谢左哥的回复,那这个读ID的函数到底怎么写呢?还有就是,我现在的PD6脚的配置对不对?我单独设置成上拉输入模式的话,程序就无法读ID。死那读ID那了,
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-12-15 17:09:55 | 显示全部楼层
这个要看你用不用硬件等待了,如果你用了硬件等待的话PD6就配置成NWAIT就可以了,也就是复用成FMC
开往春天的手扶拖拉机
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-2 01:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表