硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5871|回复: 5
收起左侧

[FMC] 关于NAND的NWAIT信号的问题。。

[复制链接]

50

主题

68

回帖

218

积分

高级会员

积分
218
发表于 2021-2-18 10:51:33 | 显示全部楼层 |阅读模式
NAND-FLASH具有NWAIT信号,在CUBEMX中也可以配置使能这个信号,但为什么我看给的例程中,都是把它当成普通输入IO,软件判断呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2021-2-18 11:27:20 | 显示全部楼层
可以的,只是我们从F1开始一直做手动判断了,所以这个驱动方案一直延续下来了。
QQ截图20210218112246.png
回复

使用道具 举报

50

主题

68

回帖

218

积分

高级会员

积分
218
 楼主| 发表于 2021-2-18 23:55:55 | 显示全部楼层
eric2013 发表于 2021-2-18 11:27
可以的,只是我们从F1开始一直做手动判断了,所以这个驱动方案一直延续下来了。

我实验了,如果CUBEMX中开启NWAIT功能,那么RGB屏就黑屏,不显示了。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2021-2-19 00:43:08 | 显示全部楼层
perfect_co 发表于 2021-2-18 23:55
我实验了,如果CUBEMX中开启NWAIT功能,那么RGB屏就黑屏,不显示了。。。


当前我们H7板子配套的例子是开启的NWAIT

详情你看此贴的例子即可:

基于V7的新版RL-USB和RL-FlashFS的NAND完整解决方案,实现更简单,用户仅需初始化FMC

http://www.armbbs.cn/forum.php?mod=viewthread&tid=94277

/*
*********************************************************************************************************
*        函 数 名: bsp_FMC_NAND_Init
*        功能说明: 配置FSMC和GPIO用于NAND Flash接口。这个函数必须在读写nand flash前被调用一次。
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
#define BUSY_GPIO        GPIOD
#define BUSY_PIN        GPIO_PIN_6


static void bsp_FMC_NAND_Init(void)
{
        /* --NAND Flash GPIOs 配置  ------*/
        {
                /*
                        PD0/FMC_D2
                        PD1/FMC_D3
                        PD4/FMC_NOE
                        PD5/FMC_NWE
               
                                PD7/FMC_NCE2  --替换为 PG9/FMC_NCE3
               
                        PD11/FMC_A16/FMC_CLE
                        PD12/FMC_A17/FMC_ALE
                        PD14/FMC_D0
                        PD15/FMC_D1

                        PE7/FMC_D4
                        PE8/FMC_D5
                        PE9/FMC_D6
                        PE10/FMC_D7

                        PD6/FMC_NWAIT        (本例程用查询方式判忙,此口线作为普通GPIO输入功能使用)
                */
                GPIO_InitTypeDef gpio_init_structure;

                /* 使能 GPIO时钟 */
                __HAL_RCC_GPIOD_CLK_ENABLE();
                __HAL_RCC_GPIOE_CLK_ENABLE();

                /* 使能FMC时钟 */
                __HAL_RCC_FMC_CLK_ENABLE();

                /* 设置 GPIOD 相关的IO为复用推挽输出 */
                gpio_init_structure.Mode = GPIO_MODE_AF_PP;
                gpio_init_structure.Pull = GPIO_PULLUP;
                gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
                gpio_init_structure.Alternate = GPIO_AF12_FMC;
               
                /* 配置GPIOD */
                gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 |
                                                                        GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 |
                                                                        GPIO_PIN_15;
                HAL_GPIO_Init(GPIOD, &gpio_init_structure);

                /* 配置GPIOE */
                gpio_init_structure.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
                HAL_GPIO_Init(GPIOE, &gpio_init_structure);
               
                /* 配置GPIOG NAND 片选 */
                gpio_init_structure.Pin = GPIO_PIN_9;
                HAL_GPIO_Init(GPIOG, &gpio_init_structure);               

                /* busy R/B 设置为输入 */
                gpio_init_structure.Mode = GPIO_MODE_INPUT;                        /* 设置输入 */
                gpio_init_structure.Pull = GPIO_NOPULL;                                /* 上下拉电阻不使能 */
                gpio_init_structure.Speed = GPIO_SPEED_FREQ_MEDIUM;          /* GPIO速度等级 */
                gpio_init_structure.Pin = BUSY_PIN;       
                HAL_GPIO_Init(BUSY_GPIO, &gpio_init_structure);       
        }

        {
                NAND_HandleTypeDef hNand = {0};
               
                FMC_NAND_PCC_TimingTypeDef CommonSpaceTiming;
                FMC_NAND_PCC_TimingTypeDef AttributeSpaceTiming;
               
                hNand.Instance = FMC_NAND_DEVICE;                                                                       
                hNand.Init.NandBank = FMC_NAND_BANK3;                                                /* 定义FSMC NAND BANK 号 */
                hNand.Init.Waitfeature = FMC_NAND_PCC_WAIT_FEATURE_DISABLE;        /* 插入等待时序使能, 禁止 */
                hNand.Init.MemoryDataWidth = FMC_NAND_PCC_MEM_BUS_WIDTH_8;        /* 数据宽度 8bit */
                hNand.Init.EccComputation = FMC_NAND_ECC_DISABLE;                        /* ECC错误检查和纠正功能 - 禁止 */
                hNand.Init.ECCPageSize = FMC_NAND_ECC_PAGE_SIZE_2048BYTE;        /* ECC 页面大小 */
                hNand.Init.TCLRSetupTime = 0x03;                                                        /* CLE低和RE低之间的延迟,HCLK周期数 */       
                hNand.Init.TARSetupTime = 0x03;                             /* ALE低和RE低之间的延迟,HCLK周期数 */
   
                /* 2-5-3-1 V6 OK   4-10-6-2 异常 */
                CommonSpaceTiming.SetupTime = 3;
                CommonSpaceTiming.WaitSetupTime = 5;
                CommonSpaceTiming.HoldSetupTime = 3;
                CommonSpaceTiming.HiZSetupTime = 3;
   
                AttributeSpaceTiming.SetupTime = 3;
                AttributeSpaceTiming.WaitSetupTime = 5;
                AttributeSpaceTiming.HoldSetupTime = 3;
                AttributeSpaceTiming.HiZSetupTime = 3;

                HAL_NAND_Init(&hNand, &CommonSpaceTiming, &AttributeSpaceTiming);
        }
}

虽然开头加了这个,RL-FlashFS并没有调用:

  1. /* 必须等待,否则读出数据异常, 此处应该判断超时*/
  2. #define WAIT_BUSY()        {        \
  3.         uint16_t k;         \
  4.         for (k = 0; k < 200; k++)        \
  5.         {        \
  6.                 if ((BUSY_GPIO->IDR & BUSY_PIN) == 0) break;        \
  7.         }        \
  8.         for (k = 0; k < 2000; k++)        \
  9.         {        \
  10.                 if ((BUSY_GPIO->IDR & BUSY_PIN) != 0) break;        \
  11.         }        \
  12. }

  13. /**
  14.   \fn          int32_t Driver_NANDx_GetDeviceBusy (uint32_t dev_num)
  15.   \brief       NAND Driver GetDeviceBusy callback.
  16.                Needs to be implemented by user.
  17.   \param[in]   dev_num   Device number
  18.   \return      1=busy, 0=not busy, or error
  19. */
  20. int32_t Driver_NAND0_GetDeviceBusy (uint32_t dev_num)
  21. {
  22.         WAIT_BUSY();
  23.        
  24.         return 0;
  25. }
复制代码



回复

使用道具 举报

50

主题

68

回帖

218

积分

高级会员

积分
218
 楼主| 发表于 2021-2-20 20:55:44 | 显示全部楼层
eric2013 发表于 2021-2-19 00:43
当前我们H7板子配套的例子是开启的NWAIT

详情你看此贴的例子即可:

硬汉兄,我看了“V7-FreeRTOS + RL-FlashFS + RL-USB + NAND”工程。
在nand_membus_config.h中开启了ready/busy pin的检测,也就是说Driver_NAND0_GetDeviceBusy 应该会被调用吧??而且NWAIT是D口的6脚吧,上面的配置代码,把这个脚也配置成了普通输入IO,并没有开启它的复用功能:
                /* busy R/B 设置为输入 */
                gpio_init_structure.Mode = GPIO_MODE_INPUT;                        /* 设置输入 */
                gpio_init_structure.Pull = GPIO_NOPULL;                                /* 上下拉电阻不使能 */
                gpio_init_structure.Speed = GPIO_SPEED_FREQ_MEDIUM;          /* GPIO速度等级 */
                gpio_init_structure.Pin = BUSY_PIN;      
                HAL_GPIO_Init(BUSY_GPIO, &gpio_init_structure);   
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2021-2-20 21:42:17 | 显示全部楼层
perfect_co 发表于 2021-2-20 20:55
硬汉兄,我看了“V7-FreeRTOS + RL-FlashFS + RL-USB + NAND”工程。
在nand_membus_config.h中开启了re ...

还是你看的仔细,帮你也测试了下,用我们V7板子,正常
1.png
5.png
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 23:18 , Processed in 0.172276 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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