首页 » 通讯 » Nand Flash操作事理及裸机轨范分析——芯片id读取_时序_函数

Nand Flash操作事理及裸机轨范分析——芯片id读取_时序_函数

南宫静远 2024-11-12 11:23:34 0

扫一扫用手机浏览

文章目录 [+]

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

作者:韦东山

Nand Flash操作事理及裸机轨范分析——芯片id读取_时序_函数 Nand Flash操作事理及裸机轨范分析——芯片id读取_时序_函数 通讯

本笔墨数:2256,阅读时长:3分钟

Nand Flash操作事理及裸机轨范分析——芯片id读取_时序_函数 Nand Flash操作事理及裸机轨范分析——芯片id读取_时序_函数 通讯
(图片来自网络侵删)

上节课我们讲解了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){returnNFDATA;}

读芯片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套

标签:

相关文章