OpenEdv-开源电子网

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

读取NAND FLASH 的R/B'引脚状态,GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) 为什么一直为高

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-4-23
在线时间
10 小时
发表于 2019-5-20 15:43:12 | 显示全部楼层 |阅读模式
1金钱
在发送第二个编程控制信号之后,用示波器可以检测到R/B'有约300us的时间,变为低。但程序中为什么读不到?
void FSMC_NAND_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  FSMC_NANDInitTypeDef FSMC_NANDInitStructure;
  FSMC_NAND_PCCARDTimingInitTypeDef  p;
  
  /* Enable FSMC, GPIOD, GPIOE and AFIO clocks FSMC总线使用的GPIO组时钟使能 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);/* 开发FSMC时钟 */
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
                         RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO , ENABLE);
  
  /*-- GPIO Configuration ------------------------------------------------------*/
  /* CLE, ALE, D0->D3, NOE, NWE and NCE2  NAND pin configuration 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);
  /* D4->D7 NAND pin configuration  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);
  /* NWAIT NAND pin configuration 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);
/* INT2 NAND pin configuration FSMC INT2初始化,输入上拉*/  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;           
  GPIO_Init(GPIOG, &GPIO_InitStructure);



uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, NAND_ADDRESS Address, uint32_t NumPageToWrite)

{
//传入参数:写入数据,写入初始地址,要写几页
  uint32_t index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
  uint32_t status = NAND_READY, size = 0x00;
  while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
  {
    /* Page write command and address */
    *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM;
    *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;  
    *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0X00;  
    *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(ROW_ADDRESS);  
    *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(ROW_ADDRESS);   
    /* Calculate the size */
    size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE * numpagewritten);//统计写入数目 (写一页)
    /* Write data */
    for(; index < size; index++)
    {
      *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA) = pBuffer[index];
    }
   
    *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM_TRUE;
    /* 读忙脚 */
    while( GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_6) == 0 );
   
    /* Check status for successful operation */
    status = FSMC_NAND_GetStatus();
   
    if(status == NAND_READY)//如果操作完成
    {
      numpagewritten++;//已写入页数加一
      NumPageToWrite--;//待写入页数减一
      /* Calculate Next small page Address 计算要写入的下一个小页的地址 */
      addressstatus = FSMC_NAND_AddressIncrement(&Address);   
    }   
  }
  
  return (status | addressstatus);
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-5-20 20:12:11 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 03:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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