打印
[STM32F4]

使用407 FSMC配置NAND接口8bit写无反应

[复制链接]
1652|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
阿星Ethan|  楼主 | 2017-11-6 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
你好! 是否有人使用407 FSMC配置NAND接口8bit,
访问BANK3地址0x80000000 写入0xA5,WE(PD5)输出不会变低,D[7:0]也没任何反应。
/////////////////// 配置了以下管脚及FSMC控制器
#ifdef FSMC_AS_NAND   
        GPIO_Config_FSMC(GPIOD, PD5_FSMC_nWE);
   
        /* D[4:0] : Bus Line */
        GPIO_Config_FSMC(GPIOD, PD14_FSMC_D0);
        GPIO_Config_FSMC(GPIOD, PD15_FSMC_D1);
        GPIO_Config_FSMC(GPIOD, PD0_FSMC_D2);
        GPIO_Config_FSMC(GPIOD, PD1_FSMC_D3);
        GPIO_Config_FSMC(GPIOE, PE7_FSMC_D4);
        GPIO_Config_FSMC(GPIOE, PE8_FSMC_D5);
        GPIO_Config_FSMC(GPIOE, PE9_FSMC_D6);
        GPIO_Config_FSMC(GPIOE, PE10_FSMC_D7);

    FSMC_NANDInitStructure.NandBank = FSMC_NAND_BANK3;
    FSMC_NANDInitStructure.MemoryDataWidth = FSMC_NAND_PCC_MEM_BUS_WIDTH_8;
    FSMC_NANDInitStructure.Waitfeature = FSMC_NAND_PCC_WAIT_FEATURE_DISABLE;
    FSMC_NANDInitStructure.EccComputation = FSMC_NAND_ECC_DISABLE;
    FSMC_NANDInitStructure.ECCPageSize = FSMC_NAND_ECC_PAGE_SIZE_256BYTE;
    FSMC_NANDInitStructure.TARSetupTime = 0;
    FSMC_NANDInitStructure.TCLRSetupTime = 0;
   
    FSMC_DEVICE.PageSize      = 512;
    FSMC_DEVICE.BlockNbr      = 1; // total blocks
    FSMC_DEVICE.BlockSize     = 512; // measured in number of pages
    FSMC_DEVICE.PlaneSize     = 1; // measured in number of blocks
    FSMC_DEVICE.PlaneNbr      = 1; // total planes
    FSMC_DEVICE.SpareAreaSize = 0; // no spare memory
    FSMC_DEVICE.ExtraCommandEnable = DISABLE;
   
    FSMC_Timing.SetupTime      = 0x0;
    FSMC_Timing.WaitSetupTime  = 0x2;
    FSMC_Timing.HoldSetupTime  = 0x1;
    FSMC_Timing.HiZSetupTime   = 0x0;
                              
    FSMC_Handler.Instance      = FSMC_Bank2_3;
    FSMC_Handler.Config        = FSMC_DEVICE;
    FSMC_Handler.Init          = FSMC_NANDInitStructure;
    FSMC_Handler.Lock          = HAL_UNLOCKED;
    FSMC_Handler.State         = HAL_NAND_STATE_READY;
   
    HAL_NAND_Init(&FSMC_Handler, &FSMC_Timing, &FSMC_Timing);
#endif

////////////// 执行写,不能在D[7:0]看到任何输出
  while(1)
{
       *(__IO uint8_t *)((uint32_t)(0x80000000)) = 0xA5;
  }
沙发
阿星Ethan|  楼主 | 2017-11-6 16:54 | 只看该作者
看样子帖子还是有人看的…… 坐等有大侠指点!

使用特权

评论回复
板凳
mmuuss586| | 2017-11-6 17:14 | 只看该作者

没看出来啥问题;

使用特权

评论回复
地板
阿星Ethan|  楼主 | 2017-11-6 17:29 | 只看该作者
mmuuss586 发表于 2017-11-6 17:14
没看出来啥问题;

按理写那个BANK3地址就能WE变低才对
再增加 一个读BANK3地址,就能看到高低切换
问题是怎么都 看不到啊

使用特权

评论回复
5
kingkits| | 2017-11-7 09:39 | 只看该作者
你哪里定义FSMC的接口有0x80000000这个地址了?

使用特权

评论回复
6
阿星Ethan|  楼主 | 2017-11-7 14:16 | 只看该作者
本帖最后由 阿星Ethan 于 2017-11-7 14:21 编辑
kingkits 发表于 2017-11-7 09:39
你哪里定义FSMC的接口有0x80000000这个地址了?

FSMC_NANDInitStructure.NandBank = FSMC_NAND_BANK3; // 这个在定义在STM32F4 FSMC使用BANK3就是对应0x80000000

使用特权

评论回复
7
kingkits| | 2017-11-7 15:16 | 只看该作者
  /* Send Read ID command sequence */   
  *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA))  = NAND_CMD_READID;
  *(__IO uint8_t *)((uint32_t)(deviceaddress | ADDR_AREA)) = 0x00U;
这两行代码可能对你有帮助

使用特权

评论回复
8
阿星Ethan|  楼主 | 2017-11-8 09:59 | 只看该作者
kingkits 发表于 2017-11-7 15:16
/* Send Read ID command sequence */   
  *(__IO uint8_t *)((uint32_t)(deviceaddress | CMD_AREA))   ...

这两行其实是有2次写操作,先是内存地址,再是数据。
与我测试只写一次同。

使用特权

评论回复
9
kingkits| | 2017-11-8 16:44 | 只看该作者
void NAND_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  FSMC_NAND_PCCARDTimingInitTypeDef  p;
  FSMC_NANDInitTypeDef FSMC_NANDInitStructure;
  
  /*FSMC总线使用的GPIO组时钟使能*/
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
                         RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);
  
/*FSMC CLE, ALE, D0->D3, NOE, NWE and NCE2初始化,推挽复用输出*/
  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_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  /*FSMC数据线FSMC_D[4:7]初始化,推挽复用输出*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
  /*FSMC NWAIT初始化,输入上拉*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  /*FSMC INT2初始化,输入上拉*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
  /*--------------FSMC 总线 存储器参数配置------------------------------*/
  p.FSMC_SetupTime = 0x1;         //建立时间
  p.FSMC_WaitSetupTime = 0x3;     //等待时间
  p.FSMC_HoldSetupTime = 0x2;     //保持时间
  p.FSMC_HiZSetupTime = 0x1;      //高阻建立时间
  FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND; //使用FSMC BANK2
  FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable; //使能FSMC的等待功能
  FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; //NAND Flash的数据宽度为8位
  FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;                  //使能ECC特性
  FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_2048Bytes; //ECC页大小2048
  FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;            
  FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;
  FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;
  FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;
  FSMC_NANDInit(&FSMC_NANDInitStructure);
  /*!使能FSMC BANK2 */
  FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE);
}

使用特权

评论回复
10
kingkits| | 2017-11-8 16:45 | 只看该作者
这个是人家写的一段初始化程序,你对比一下看看。你哪里缺些什么

使用特权

评论回复
11
kingkits| | 2017-11-8 16:48 | 只看该作者
感觉你对相关管脚没有配置()

使用特权

评论回复
12
阿星Ethan|  楼主 | 2017-11-14 16:13 | 只看该作者
kingkits 发表于 2017-11-8 16:48
感觉你对相关管脚没有配置()

之前帖子所用工程IO及FSMC配置是有的。

现在换了使用STM32F4CubeMX的HAL库工程,发现我之前的访问地址确实不对:
* 在使用的LQFP100封装,只有BANK1和BANK2,访问地址应该是0x70000000。
* 配置时,也就只能使用FSMC_NAND_BANK2。
但这样一改,配置后去访问对应的地址会导致程序飞掉!
访问0x60000000则不会跑飞,但总线上没有反应!!!  难道MX生成的HAL库工程有问题?!
static void HAL_FSMC_MspInit(void)
{
/* Peripheral clock enable */
  __HAL_RCC_FSMC_CLK_ENABLE();
  
  /** FSMC GPIO Configuration  
  PE7   ------> FSMC_D4
  PE8   ------> FSMC_D5
  PE9   ------> FSMC_D6
  PE10   ------> FSMC_D7
  PD11   ------> FSMC_CLE
  PD12   ------> FSMC_ALE
  PD14   ------> FSMC_D0
  PD15   ------> FSMC_D1
  PD0   ------> FSMC_D2
  PD1   ------> FSMC_D3
  PD4   ------> FSMC_NOE
  PD5   ------> FSMC_NWE
  PD7   ------> FSMC_NCE2
  */
  /* GPIO_InitStruct */
  GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /* GPIO_InitStruct */
  GPIO_InitStruct.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_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;

  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);



/* FSMC initialization function */
void MX_FSMC_Init(void)
{
  FSMC_NAND_PCC_TimingTypeDef ComSpaceTiming;
  FSMC_NAND_PCC_TimingTypeDef AttSpaceTiming;

  /** Perform the NAND1 memory initialization sequence
  */
  hnand1.Instance = FSMC_NAND_DEVICE;
  /* hnand1.Init */
  hnand1.Init.NandBank = FSMC_NAND_BANK2;
  hnand1.Init.Waitfeature = FSMC_NAND_PCC_WAIT_FEATURE_DISABLE;
  hnand1.Init.MemoryDataWidth = FSMC_NAND_PCC_MEM_BUS_WIDTH_8;
  hnand1.Init.EccComputation = FSMC_NAND_ECC_DISABLE;
  hnand1.Init.ECCPageSize = FSMC_NAND_ECC_PAGE_SIZE_256BYTE;
  hnand1.Init.TCLRSetupTime = 0;
  hnand1.Init.TARSetupTime = 0;
  /* hnand1.Config */
  hnand1.Config.PageSize = 512;
  hnand1.Config.SpareAreaSize = 0;
  hnand1.Config.BlockSize = 512;
  hnand1.Config.BlockNbr = 1;
  hnand1.Config.PlaneNbr = 1;
  hnand1.Config.PlaneSize = 0;
  hnand1.Config.ExtraCommandEnable = DISABLE;
  /* ComSpaceTiming */
  ComSpaceTiming.SetupTime = -1;
  ComSpaceTiming.WaitSetupTime = 1;
  ComSpaceTiming.HoldSetupTime = 1;
  ComSpaceTiming.HiZSetupTime = 0;
  /* AttSpaceTiming */
  AttSpaceTiming.SetupTime = 0;
  AttSpaceTiming.WaitSetupTime = 1;
  AttSpaceTiming.HoldSetupTime = 1;
  AttSpaceTiming.HiZSetupTime = 0;

  if (HAL_NAND_Init(&hnand1, &ComSpaceTiming, &AttSpaceTiming) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

使用特权

评论回复
13
阿星Ethan|  楼主 | 2017-11-14 16:25 | 只看该作者
跟了一下FSMC_NAND_Init,相关配置记了下,一会对一下手册去
BCR2 = 0x000030D2
BTR2 = 0x0FFFFFFF
PCR2 = 0x0000000C
SR2  = 0x00000040
PMEM2 = 0xFFFFFFFF
PATT2 = 0x00010100

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

12

帖子

0

粉丝