本文主要是介绍S3C2440裸机------NandFlash编程_芯片id读取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1.芯片id读取时序图
2.使能芯片
3.发送命令函数
4.发送地址函数
5.读数据函数
6.完整代码
1.芯片id读取时序图
我们先看一下NandFlash芯片手册中读取id的时序图,后面我们要根据这个时序图去写代码。
2.使能芯片
从前面的时序图我们可以看出,我们首先要发出片选信号,我们通过设置下图寄存器的Reg_nCE位来进行设置,
void nand_select(void)
{/*使能片选*/NFCONT &=~(1<<1);
}void nand_deselect(void)
{/*禁止片选*/NFCONT |= (1<<1);
}
3.发送命令函数
我们从最前面的时序图可以看到,要想读取设备id,首先要向NandFlash发送90命令,然后相应的CLE和WE信号要使能,这里的时序不需要我们管,我们只需要往命令寄存器写值即可,NandFlash控制器会为我们做好相应的时序。
void nand_cmd(unsigned char cmd)
{volatile int i;NFCCMD = cmd;for(i=0; i<10; i++);
}
4.发送地址函数
void nand_addr_byte(unsigned char addr)
{volatile int i;NFADDR = addr;for(i=0; i<10; i++);
}
5.读数据函数
unsigned char nand_data(void)
{return NFDATA;
}
6.完整代码
#include "s3c2440_soc.h"
#include "my_printf.h"void nand_init(void)
{
#define TACLS 0
#define TWRPH0 1
#define TWRPH1 0/*设置NAND FLASH的时序*/NFCONF = (TACLS<<12) | (TWRPH0<<8) | (TWRPH1<<4);/*使能NAND FLASH控制器,初始化ECC,禁止片选*/NFCONT = (1<<4) | (1<<1) | (1<<0);
}void nand_select(void)
{/*使能片选*/NFCONT &=~(1<<1);
}void nand_deselect(void)
{/*禁止片选*/NFCONT |= (1<<1);
}void nand_cmd(unsigned char cmd)
{volatile int i;NFCCMD = cmd;for(i=0; i<10; i++);
}void nand_addr_byte(unsigned char addr)
{volatile int i;NFADDR = addr;for(i=0; i<10; i++);
}unsigned char nand_data(void)
{return NFDATA;
}void nand_chip_id(void)
{ unsigned char buf[5]={0};nand_select(); nand_cmd(0x90);nand_addr_byte(0x00);buf[0] = nand_data();buf[1] = nand_data(); buf[2] = nand_data();buf[3] = nand_data();buf[4] = nand_data(); nand_deselect(); printf("maker id = 0x%x\n\r",buf[0]);printf("device id = 0x%x\n\r",buf[1]); printf("3rd byte = 0x%x\n\r",buf[2]); printf("4th byte = 0x%x\n\r",buf[3]); printf("page size = %d kb\n\r",1 << (buf[3] & 0x03)); printf("block size = %d kb\n\r",64 << ((buf[3] >> 4) & 0x03)); printf("5th byte = 0x%x\n\r",buf[4]);}void nand_flash_test(void)
{char c;while (1){/* 打印菜单, 供我们选择测试内容 */printf("[s] Scan nand flash\n\r");printf("[e] Erase nand flash\n\r");printf("[w] Write nand flash\n\r");printf("[r] Read nand flash\n\r");printf("[q] quit\n\r");printf("Enter selection: ");c = getchar();printf("%c\n\r", c);/* 测试内容:* 1. 识别nand flash* 2. 擦除nand flash某个扇区* 3. 编写某个地址* 4. 读某个地址*/switch (c) {case 'q':case 'Q':return;break;case 's':case 'S':nand_chip_id();break;case 'e':case 'E':break;case 'w':case 'W':break;case 'r':case 'R':break;default:break;}}
}
这篇关于S3C2440裸机------NandFlash编程_芯片id读取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!