HI3531的nand flash测试

发布时间:2023-09-06  

void NAND_Init()
{
   *(unsigned int *)(0x20030000 + 0xd0) = 7; delay_x(0X5000);
   *(unsigned int *)(0x20030000 + 0xd0) = 6; delay_x(0X5000);
   *(unsigned int *)(0x200f0000 + 0x1fc) = 0;//muxctrl_reg127 NF_DQ0 管脚复用控制寄存器
   *(unsigned int *)(0x200f0000 + 0x200) = 0;
   *(unsigned int *)(0x200f0000 + 0x204) = 0;
   *(unsigned int *)(0x200f0000 + 0x208) = 0;
   *(unsigned int *)(0x200f0000 + 0x20C) = 0;
   *(unsigned int *)(0x200f0000 + 0x210) = 0;
   *(unsigned int *)(0x200f0000 + 0x214) = 0;
   *(unsigned int *)(0x200f0000 + 0x218) = 0;//7
   *(unsigned int *)(0x200f0000 + 0x21C) = 0;
   *(unsigned int *)(0x200f0000 + 0x220) = 0;
//p626
   *(unsigned int *)(NANDC_ADDR +0X00) = 0x85;//NFC_CON
   *(unsigned int *)(NANDC_ADDR +0X04) = 0x666;//NFC_PWIDTH 为读写脉冲宽度配置寄存器。
   *(unsigned int *)(NANDC_ADDR +0X24) = 0x0;//NFC_INTEN 为中断使能寄存器
   delay_x(0X500);

}
void NAND_Read_Page()
{
    *(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 为低位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 为高位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X0c) = 0x00003000;//NFC_CMD 为命令字配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X18) = 0x800;
     delay_x(0X500);
   
                                     //地址周期 cmd1_en addr_wen data_wen  cmd2_en ready/busy data_ren  read_stus_en
    *(unsigned int *)(NANDC_ADDR +0X1c) = 5<<9 | 1<<6 | 1<<5    | 0<<4     | 1<<3  |1<<2      | 1<<1     | 0;//0xa6e;//NFC_OP 为操作寄存器。
     delay_x(0X500);
    
     retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 为状态寄存器。
     delay_x(0X5000);
}


void NAND_Read_Random()
{
    *(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 为低位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 为高位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X0c) = 0x0000e005;//NFC_CMD 为命令字配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X18) = 0x20;
     delay_x(0X500);
   
   
    //*(unsigned int *)(NANDC_ADDR +0X1c) = 0x46e;//NFC_OP 为操作寄存器。
                                     //地址周期 cmd1_en addr_wen data_wen  cmd2_en ready/busy data_ren  read_stus_en
    *(unsigned int *)(NANDC_ADDR +0X1c) = 2<<9 | 1<<6 | 1<<5    | 0<<4     | 1<<3  |1<<2      | 1<<1     | 0;////NFC_OP 为操作寄存器。
     delay_x(0X500);  
     retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 为状态寄存器。
     delay_x(0X5000);
}
void NAND_Write_Page()
{
    *(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 为低位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 为高位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X0c) = 0x00001080;//NFC_CMD 为命令字配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X18) = 8;
     delay_x(0X500);
    *(unsigned int *)(0x50000000) = 0x11223344;
     delay_x(0X500);
    *(unsigned int *)(0x50000004) = 0x55667788;
     delay_x(0X500);
   
   
 //   *(unsigned int *)(NANDC_ADDR +0X1c) = 0xa7d;//NFC_OP 为操作寄存器。
                                     //地址周期 cmd1_en addr_wen data_wen  cmd2_en ready/busy data_ren  read_stus_en
    *(unsigned int *)(NANDC_ADDR +0X1c) = 5<<9 | 1<<6 | 1<<5    | 1<<4     | 1<<3  |1<<2      | 0<<1     | 0;//NFC_OP 为操作寄存器。
     delay_x(0X500);
     retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 为状态寄存器。
     delay_x(0X5000);
}

void NAND_ReadID()
{
    *(unsigned int *)(NANDC_ADDR +0X10) = 0x20;//NFC_ADDRL 为低位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 为高位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X0c) = 0x00000090;//NFC_CMD 为命令字配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X18) = 5;
     delay_x(0X500);
   
   
    *(unsigned int *)(NANDC_ADDR +0X1c) = 0x266;//NFC_OP 为操作寄存器。
     delay_x(0X500);
     retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 为状态寄存器。
     delay_x(0X5000);
}
void NAND_Erase_Block()
{
    *(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 为低位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 为高位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X0c) = 0x0070d060;//NFC_CMD 为命令字配置寄存器。
     delay_x(0X500);
      
    //*(unsigned int *)(NANDC_ADDR +0X1c) = 0x66c;//NFC_OP 为操作寄存器。
                                     //地址周期 cmd1_en addr_wen data_wen  cmd2_en ready/busy data_ren  read_stus_en
    *(unsigned int *)(NANDC_ADDR +0X1c) = 3<<9 | 1<<6 | 1<<5    | 0<<4     | 1<<3  |1<<2      | 0<<1     | 0;//0xa6e;//NFC_OP 为操作寄存器。
     delay_x(0X500);
    retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 为状态寄存器。
    delay_x(0X5000);
}


int  NAND_test(unsigned int data)
{
     int i=0;
     UART_Init();
     NAND_Erase_Block();
     //写数据
    *(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 为低位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 为高位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X0c) = 0x00001080;//NFC_CMD 为命令字配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X18) = 0x800;
     delay_x(0X500);
     for(i=0;i     {
        *(unsigned int *)(0x50000000 + i*4) = data;
        delay_x(0X500);
     }

 //   *(unsigned int *)(NANDC_ADDR +0X1c) = 0xa7d;//NFC_OP 为操作寄存器。
                                     //地址周期 cmd1_en addr_wen data_wen  cmd2_en ready/busy data_ren  read_stus_en
    *(unsigned int *)(NANDC_ADDR +0X1c) = 5<<9 | 1<<6 | 1<<5    | 1<<4     | 1<<3  |1<<2      | 0<<1     | 0;//NFC_OP 为操作寄存器。
     delay_x(0X500);
     retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 为状态寄存器。
     //读数据
     NAND_Read_Page();
     //随即读
    *(unsigned int *)(NANDC_ADDR +0X10) = 0x0;//NFC_ADDRL 为低位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X14) = 0x0;//NFC_ADDRH 为高位地址配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X0c) = 0x0000e005;//NFC_CMD 为命令字配置寄存器。
     delay_x(0X500);
    *(unsigned int *)(NANDC_ADDR +0X18) = 0x800;
     delay_x(0X500);
   
   
    //*(unsigned int *)(NANDC_ADDR +0X1c) = 0x46e;//NFC_OP 为操作寄存器。
                                     //地址周期 cmd1_en addr_wen data_wen  cmd2_en ready/busy data_ren  read_stus_en
    *(unsigned int *)(NANDC_ADDR +0X1c) = 2<<9 | 1<<6 | 1<<5    | 0<<4     | 1<<3  |1<<2      | 1<<1     | 0;////NFC_OP 为操作寄存器。
     delay_x(0X500);  
     retu = *(unsigned int *)(NANDC_ADDR +0X20) ;//NFC_STATUS 为状态寄存器。
     //判断数据是否正确。
     for(i=0;i     {
        retu = *(unsigned int *)(0x50000000 + i*4);
        if(retu != data)
           return 1;
        delay_x(0X500);
     }
    
     return 0;
}

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    针就会留下刮痕。前一代大猩猩玻璃要到硬度 5、6 才会有伤痕,让粉丝一片哗然。 康宁在测试影片上网后 72 小时出面解释,批评 JerryRigEverything 的试验不够严谨,强调硬度 3......
    当可以拿来在运动甚至跑步时使用的 AirPods 也让人对它的防水能力感到好奇。国外影音博客 EverythingApplePro 在 YouTube 上发布了一段测试影片,模拟使用者在使用 AirPods 时可......
    iPhone 6重大缺陷导致没法用:苹果这做法太无语;著名的第三方拆解网站iFixit之前曾指出,iPhone 6、6 Plus在设计上存在严重缺陷,具体症状是触摸屏存在触控没反应或反应不灵敏,这个......
    type-c耳机插上没反应怎么办;以下内容中,小编将对Type-C耳机的相关内容进行着重介绍和阐述,希望本文能帮您增进对Type-C耳机的了解,和小编一起来看看吧。 一、Type-C耳机插上没反应......
    如果按正转和反转按钮接触器没反应(接触器不吸合),那就是控制线路有问题。我们要重点检测控制线路。首先看控制线路是否有电,比如安全变压器有无输出电压、控制线路保险丝有没有坏;其次......
    如果按正转和反转按钮接触器没反应(接触器不吸合),那就是控制线路有问题。我们要重点检测控制线路。首先看控制线路是否有电,比如安全变压器有无输出电压、控制线路保险丝有没有坏;其次......
    与施瓦茨频谱仪FSV 30 二、 报修故障:显示花屏 三、 分析、测试和判断 工程师接到这台罗德与施瓦茨频谱仪FSV 30后,立马对其分析检测,开机后发现显示花屏、单元故障,处理后显示正常。但是触摸屏没反应......
    开发环境的观察窗口看到的接收数据跟我发出去的字符大相径庭,其它2个DMA接收节点不论我发送多少数据就根本没反应。因为我设计的就是只有当接收队列即3个接收节点都正常接收后才会启动USART3的DMA发送队列。所以此时USART3也就......
    设置引脚的模式(输出、输入、中断等),后者设置引脚的电平。   但是在操作过程中,出现了主程序对,但是没有led没反应的问题。总是在延时函数那里就不工作了,经过一下午的排查,     找到了原因。原来......
    可以直接进行写操作。对NOR FLASH的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。 下载 今天提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。 今天......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>