您的位置 首页 > 数码极客

flash芯片数据如何读出数据—flash芯片数据读取!


来源:韦东山嵌入式专栏_ARM裸机加强版维基教程

作者:韦东山

本文字数:2256,阅读时长:3分钟

上节课我们讲解了NAND FLASH的初始化,这节课我们来讲解读取NAND FLASH的ID, 我们可以参考NAND FLASHh的芯片手册,如下图所示:(NAND FLASH读操作时序图)

我们一般先操作片选使能,只有片选使能之后才能进行后边的操作,代码如下:

void nand_select(void) { /*使能片选*/ NFCONT &=~(1<<1); }

有使能片选,一定有禁止片选,禁止片选的代码如下:

void nand_deselect(void) { /*禁止片选*/ NFCONT |= (1<<1); }

读ID的操作时序图,如下所示

我们按照从左往右的时间点,来分析,片选信号像一个总开关,只有使能了片选信号,后续的操作才会有意义,我们使能片选信号之后,片选引脚nCE后续一直为低电平,在前面的命令时序图中知道tCLS和tWP最小的时间参数都是12us,就表明CLE和nWE这两个信号可以同时发出,就表示要命令了,对于写什么命令,就要看数据总线上要发送的命令了,当CLE从高电平变为低电平后,表示上次的写操作已经结束了。

对于上面复杂的时序,我们可以使用2440上的NAND FLASH控制器简化操作,只需要往NFCMMD寄存器写入要传输的命令就可以了,NAND FLASH控制器默认把上面复杂的时序发出来。

发命令后,后面就需要发送地址了,当nWE和ALE有效的时候,表示写地址,上图中,要写入的地址是0x00,当ALE从高电平变为低电平的时候,表示写地址结束,我们可以简化为:往NFADDR寄存器中写值就可以了,比如:NFADDR=0x00。

下面我们写代码:发命令的函数,和发地址的函数代码如下:

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++); }

接下来就可以读取数据了,数据可以直接通过读取NFDATA寄存器里面数据来获得数据,根据时序图,是读5个字节的数据,代码如下:

unsigned char nand_data(void) { return NFDATA; }

读芯片ID之前先打开片选, 读取芯片ID函数,代码如下:

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]); }

下面我们再写一个打印菜单的函数,在菜单中调用读取芯片ID的函数,代码如下

oid 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; } } }

在主函数中调用nand flash的初始化函数,和nand flash的测试函数。

int main(void) { led_init(); //interrupt_init(); /* 初始化中断控制器 */ key_eint_init(); /* 初始化按键, 设为中断源 */ //timer_init(); puts("\n\rg_A = "); printHex(g_A); puts("\n\r"); //nor_flash_test(); nand_init(); nand_flash_test(); return 0; }

「新品首发」STM32MP157开发板火爆预售!首批仅300套

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“flash芯片数据如何读出数据,flash芯片数据读取,flash存储芯片丢失数据,如何读取flash芯片中的数据,flash芯片掉电可以保存数据不”边界阅读