娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年04月25日(星期五)

2020年04月25日 | ARM9 mini2451裸機(jī)學(xué)習(xí)——NAND flash驅(qū)動(dòng)學(xué)習(xí) 2

發(fā)布者:advancement3 來源: eefocus關(guān)鍵字:ARM9  mini2451  NAND  flash 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

上一篇文章主要學(xué)習(xí)了NAND Falsh的基礎(chǔ)知識(shí),今天則來總結(jié)NAND Flash的初始化,以及塊擦除,頁的讀寫操作,以及芯片id號(hào)的獲取。


6. NAND FLASH 的操作接口


我們知道,函數(shù)在調(diào)用時(shí)需要使用棧,當(dāng)項(xiàng)目的函數(shù)調(diào)用關(guān)系復(fù)雜時(shí),尤其是存在多級(jí)


函數(shù)調(diào)用時(shí),容易導(dǎo)致棧溢出,此處函數(shù)調(diào)用的開銷也會(huì)逐漸加大。


為了更好的解決上述問題,一般使用宏的形式來實(shí)現(xiàn)規(guī)模較小的函數(shù),因?yàn)楹暾{(diào)用時(shí)在


預(yù)處理階段,由預(yù)處理器對(duì)源程序中的宏進(jìn)行展開,所以宏展開不占用運(yùn)行時(shí)間。


因?yàn)槊恳淮魏暾{(diào)用都需要進(jìn)行宏展開,所以會(huì)加大程序的代碼量,因此規(guī)模較大的函數(shù)


不宜使用宏的形式來實(shí)現(xiàn)


① NAND FLASH 使能函數(shù)


#define NF_Enable() {rNFCONT &=~(1<<1);} //選中芯片


② NAND FLASH 失能函數(shù)


#define NF_Disable() {rNFCONT |=(1<<1);}

③ NAND FLASH 發(fā)送命令函數(shù)


#define NF_Send_Cmd(cmd) {rNFCMD = (cmd);}


④ NAND FLASH 發(fā)送地址函數(shù)


#define NF_Send_Addr(addr) {rNFADDR =addr;}


⑤ NAND FLASH 發(fā)送數(shù)據(jù)函數(shù)


#define NF_Send_Data(data) {rNFDATA8 =(data);}


⑥ NAND FLASH 使能忙檢測(cè)函數(shù)


#define NF_Enable_RB() {rNFSTAT |= (1<< 4);}

⑦ NAND FLASH 判忙函數(shù)


#define NF_Check_Busy() {while(!(rNFSTAT& (1 << 0)));} // 0 busy ,1 ready


⑧ NAND FLASH 讀字節(jié)函數(shù)


#define NF_Read_Byte() (rNFDATA8)


7. 怎樣對(duì) NAND 進(jìn)行復(fù)位?


① 選中 NAND FLASH


② 使能 NAND 判忙檢測(cè)


③ 發(fā)送復(fù)位命令(0xff)


④ 等待復(fù)位完成


⑤ 取消選中 NAND FLASH


8. 怎樣對(duì) NAND 進(jìn)行初始化?


① 配置 GPA 相關(guān) IO 口


② 設(shè)置相關(guān)時(shí)間參數(shù)


③ 關(guān)閉 NAND 中斷,打開 NAND 控制器


④ NAND 相關(guān)狀態(tài)清零


⑤ 復(fù)位 NAND


9. 怎樣擦除一個(gè)塊?


① 復(fù)位 NAND


② 選中 NAND FLASH


③ 使能 NAND 判忙檢測(cè)


④ 發(fā)送塊擦除發(fā)起命令(0x60)


⑤ 發(fā)送塊地址


⑥ 發(fā)送塊擦除確認(rèn)命令(0xd0)


⑦ 等待擦除完成


⑧ 取消選中芯片


10. 怎樣寫一頁?


① 復(fù)位 NAND FLASH


② 選中 NAND FLASH


③ 使能 NAND 判忙檢測(cè)


④ 發(fā)送寫頁發(fā)起命令(0x80)


⑤ 發(fā)送頁地址


⑥ 發(fā)送 2048 個(gè)數(shù)據(jù)


⑦ 發(fā)送寫頁確認(rèn)命令(0x10)


⑧ 等待寫完成


⑨ 取消選中芯片


11. 怎樣讀一頁


① 復(fù)位 NAND FLASH


② 選中 NAND FLASH


③ 發(fā)送頁讀取發(fā)起命令(0x00)


④ 發(fā)送讀地址


⑤ 發(fā)送頁讀取確認(rèn)命令(0x30)


⑥ 等待命令完成


⑦ 讀取 2048 個(gè)命令


⑧ 取消選中芯片


12.NAND FLASH 的地址模式

源代碼分析(代碼編譯環(huán)境:win8,keil4):


宏定義,具體參數(shù)查DATASHEET,不再贅敘。


#define rNFCONF (*(volatile unsigned long *)(0x4e000000))

#define rNFCONT (*(volatile unsigned long *)(0x4e000004))

#define rNFCMD (*(volatile unsigned long *)(0x4e000008))

#define rNFADDR (*(volatile unsigned long *)(0x4e00000c))

#define rNFDATA8  (*(volatile unsigned char *)(0x4e000010))

#define rNFSTAT   (*(volatile unsigned long *)(0x4e000028))

#define rGPACON  (*(volatile unsigned long *)(0x56000000))


//NAND FLASH 使能函數(shù)

#define NF_Enable() {rNFCONT &= ~(1<<1);} //選中芯片

//NAND FLASH 失能函數(shù)

#define NF_Disable() {rNFCONT |= (1<<1);}

//NAND FLASH 發(fā)送命令函數(shù)

#define NF_Send_Cmd(cmd) {rNFCMD = (cmd);}

//NAND FLASH 發(fā)送地址函數(shù)

#define NF_Send_Addr(addr) {rNFADDR = addr;}

//NAND FLASH 發(fā)送數(shù)據(jù)函數(shù)

#define NF_Send_Data(data) {rNFDATA8 = (data);}

//NAND FLASH 使能忙檢測(cè)函數(shù)

#define NF_Enable_RB() {rNFSTAT |= (1 << 4);}

//NAND FLASH 判忙函數(shù)

#define NF_Check_Busy() {while(!(rNFSTAT & (1 << 0)));} // 0 busy ,1 ready

//NAND FLASH 讀字節(jié)函數(shù)

#define NF_Read_Byte() (rNFDATA8) //因?yàn)樾枰x值操作,所以不加;

一些操作命令


注意:某些命令需要發(fā)送兩次,操作前后各發(fā)送一次,成對(duì)出現(xiàn),第二次發(fā)送的是確認(rèn)命令。



NAND Flash復(fù)位函數(shù)

#define NF_CMD_RESET         0xff


void nand_reset(void) //nand復(fù)位函數(shù)

{

NF_Enable(); //選中芯片

NF_Check_RB(); //忙檢測(cè)

NF_Send_Cmd(NF_CMD_RESET); //發(fā)送復(fù)位命令

NF_Check_Busy(); //忙等待

NF_Disable(); //取消選中芯片

}


NAND Flash初始化函數(shù)


#define TACLS 1

#define TWRPH0 4

#define TAWTH1 1


#define NAND_INT_DIABLE 0

#define NAND_ENABLE 1


void nand_init(void)

{

rGPACON &= ~(0x3f<<17); //未操作將操作的位置清零

rGPACON |= (0x3f<<17); //初始化GPA

rNFCONT = (TACLS<<12)|(TWRPH0<<8)|(TAWTH1<<4);

rNFCONT = (NAND_INT_DIABLE<<12)|(NAND_ENABLE<<0);

rNFSTAT = 0x0; //NAND相關(guān)狀態(tài)清零

nand_reset(); //復(fù)位

}


擦除一塊內(nèi)容


#define NF_CMD_ERASE1        0x60

#define NF_CMD_ERASE2        0xd0


void nand_erase(unsigned int block) //塊擦除

{

unsigned int blocknum = (block<<6); //左移6位(A12-A17)到A18

nand_reset();

NF_Enable();

NF_Check_RB();

NF_Send_Cmd(NF_CMD_ERASE1); //發(fā)送塊擦除指令

NF_Send_Addr(blocknum & 0xff); //&0xff是為了擦除高百位 第一次發(fā)送實(shí)際只發(fā)送A18 A19兩位

NF_Send_Addr((blocknum>>8) & 0xff); //發(fā)送接下來的8位地址

NF_Send_Addr((blocknum>>16) & 0xff);

NF_Send_Cmd(NF_CMD_ERASE2); //發(fā)送確認(rèn)塊擦除指令

NF_Check_Busy(); //忙等待

NF_Disable(); //取消選中芯片

}

A0-A11用來頁內(nèi)尋址


A18-A28用來塊尋址


A12-A17用來表示某塊中的第幾頁

NAND尋址需要發(fā)送5次,一次發(fā)送8位數(shù)據(jù)(8個(gè)I/O口)。


block<<6,block左移6位,原本第三次(因?yàn)榘l(fā)送了指令,根據(jù)NAND內(nèi)部機(jī)制,直接從第三次開始發(fā)送)A12的數(shù)據(jù)成了A18的數(shù)據(jù),而A18-A28用來塊尋址。


blocknum>>8,blocknum右移8位,即將block左移的6位再加上第三次發(fā)送的2位地址。


向NAND寫入一頁內(nèi)容


#define NF_CMD_WRITE1        0x80

#define NF_CMD_WRITE2        0x10


void nand_write_page(unsigned int block,unsigned int page,unsigned char * str) //寫一頁

{

unsigned int pagenum = (block<<6) + page;

unsigned int i;

nand_reset(); //nand復(fù)位

NF_Enable(); //選中芯片

NF_Check_RB(); //忙檢測(cè)

NF_Send_Cmd(NF_CMD_WRITE1); //發(fā)送讀操作指令

NF_Send_Addr(0x0);

NF_Send_Addr(0x0);

NF_Send_Addr(pagenum & 0xff);

NF_Send_Addr((pagenum>>8) & 0xff);

NF_Send_Addr((pagenum>>16) & 0xff);

for(i=0; i<2048; i++)

{

NF_Send_Data(str[i]); //發(fā)送數(shù)據(jù)

}

NF_Send_Cmd(NF_CMD_WRITE2); //發(fā)送讀操作確認(rèn)命令

NF_Check_Busy(); //忙等待

NF_Disable(); //取消選中芯片

}


讀取一頁內(nèi)容


#define NF_CMD_READ1         0x00

#define NF_CMD_READ2         0x30


void nand_read_page(unsigned int block,unsigned int page,unsigned char * str) //讀一頁

{

unsigned int pagenum = (block<<6) + page;

unsigned int i;

nand_reset(); //nand復(fù)位

NF_Enable(); //選中芯片

NF_Check_RB(); //忙檢測(cè)

NF_Send_Cmd(NF_CMD_READ1); //發(fā)送讀操作指令

NF_Send_Addr(0x0);

NF_Send_Addr(0x0);

NF_Send_Addr(pagenum & 0xff);

NF_Send_Addr((pagenum>>8) & 0xff);

NF_Send_Addr((pagenum>>16) & 0xff);

NF_Send_Cmd(NF_CMD_READ2);

NF_Check_Busy(); //忙等待

for(i=0; i<2048; i++)

{

str[i] = NF_Read_Byte(); //讀字節(jié)

}

NF_Disable(); //取消選中芯片

}


讀取NAND Flash的ID號(hào)


#define NF_CMD_READ_ID  0x90


void nand_read_ID(unsigned char * str) //讀取nand flash芯片id

{

unsigned int i;

NF_Enable(); //選中nand flash

NF_Check_RB(); //忙檢測(cè)

NF_Send_Cmd(NF_CMD_READ_ID); //發(fā)送讀取芯片id命令

NF_Send_Addr(0x0);

NF_Check_Busy(); //忙等待

for(i=0; i<2048; i++)

{

str[i] = NF_Read_Byte(); //讀字節(jié)

}

NF_Disable(); //取消選中芯片

}

關(guān)鍵字:ARM9  mini2451  NAND  flash 引用地址:ARM9 mini2451裸機(jī)學(xué)習(xí)——NAND flash驅(qū)動(dòng)學(xué)習(xí) 2

上一篇:ARM異常與中斷處理
下一篇:s3c2440的LCD驅(qū)動(dòng)程序

推薦閱讀

????據(jù)IHS Markit(納斯達(dá)克股票代碼:INFO),隨著有源矩陣有機(jī)發(fā)光二極管(AMOLED)電視面板需求的不斷增長(zhǎng),預(yù)計(jì)到2024年,總體AMOLED面板出貨面積將由2017年的500萬平方米翻四番,至2240萬平方米。? ? 2017年,AMOLED電視面板的出貨量已從2016年的約80萬平方米增至160萬平方米,使得總體AMOLED面板出貨從2016年的380萬平方米增至2017年的500...
工業(yè)自動(dòng)化與人工智能息息相關(guān),也與機(jī)器視覺息息相關(guān)。機(jī)器視覺技術(shù)可說是人工智能的分支技術(shù),是全球智能化的“慧”眼圖像傳感器,影響著很多應(yīng)用的發(fā)展與增展,包括工業(yè)自動(dòng)化、機(jī)器人、安防/監(jiān)控、智能交通系統(tǒng)(ITS)、智能家居/樓宇、智能零售、虛擬實(shí)境(VR)/增強(qiáng)實(shí)境(AR)等等。全球圖像傳感器領(lǐng)袖安森美半導(dǎo)體傳承40多年的成像經(jīng)驗(yàn),擁有2000多項(xiàng)成像...
中斷是為使單片機(jī)具有對(duì)外部或內(nèi)部隨機(jī)發(fā)生的事件實(shí)時(shí)處理而設(shè)置的,中斷功能的存在,很大程度上提高了單片機(jī)處理外部或者內(nèi)部事件的能力。它也是單片機(jī)最重要的功能之一,是我們學(xué)習(xí)單片機(jī)必須要掌握。首先介紹單片機(jī)中斷技術(shù)的優(yōu)點(diǎn):解決了快速主機(jī)與慢速I/O設(shè)備的數(shù)據(jù)傳送問題;分時(shí)操作。CPU可以分時(shí)為多個(gè)I/O設(shè)備服務(wù),提高了計(jì)算機(jī)的利用率;實(shí)時(shí)響...
根據(jù) iGeneration 的說法,由于設(shè)備厚度的小幅增加,全新的 12.9 英寸 iPad Pro 將不能與老一代的妙控鍵盤兼容。報(bào)道援引給 Apple Store 的一份文件指出,新的 ?iPad Pro? 比之前的 12.9 英寸厚 0.5 毫米。由于厚度的增加,新的 iPad 將不能與老一代的妙控鍵盤一起使用。雖然厚度增加了 0.5 毫米而已,但對(duì)于新的 ?iPad Pro ?...

史海拾趣

問答坊 | AI 解惑

(求助!)基于ARM7的多屏LCD驅(qū)動(dòng)和鍵盤設(shè)計(jì)

有六個(gè)LCD,鍵盤要求按一次鍵與之相對(duì)應(yīng)一個(gè)屏幕翻動(dòng)一個(gè)畫面。求助高手?。?!…

查看全部問答∨

請(qǐng)教高人算法問題(移頻信號(hào)計(jì)算)

我在分析解調(diào)移頻信號(hào)的上下邊頻信息,可是邊頻精度總是不能達(dá)到要求,希望得到高人指點(diǎn),報(bào)酬沒有問題! 您可以直接和我聯(lián)系,郵箱:liukaihuaaaa@163.com 我是在DSP(TI的28系列)上實(shí)現(xiàn)的。…

查看全部問答∨

一款功能強(qiáng)大的STM32F103ZE開發(fā)板(第2版,功能更強(qiáng)大)原理圖和用戶手冊(cè)

http://item.taobao.com/auction/item_detail-0db2-bd07cdab392006dcd5619d61bdbff81c.jhtml 硬件資源: ■8M晶振作為MCU的時(shí)鐘,32768晶振用于RTC ■1M字節(jié)SRAM,16M字節(jié)NOR Flash,128M字節(jié)NADN Flash ■2M字節(jié)串行Flash,256字 ...…

查看全部問答∨

wince應(yīng)用程序

最近弄wince要求:按鍵按下,LCD彈出窗口, 按鍵驅(qū)動(dòng)我已經(jīng)弄好: 發(fā)送信息部分貼出來: while (1) {         __try {             we = WaitForSingleObject(pPWR- ...…

查看全部問答∨

Windows Mobile5用RIL_DIAL撥號(hào)接通后聽不到聲音

Windows Mobile5用RIL_DIAL撥號(hào),對(duì)方接通后聽不到這邊聲音,為什么? 以前曾在多普達(dá)機(jī)器上沒問題,這臺(tái)華碩P535不行。 是不是要打開聽筒?如果是的話怎么打開? 請(qǐng)賜教!…

查看全部問答∨

時(shí)間戳記數(shù)器TSC

時(shí)間戳記數(shù)器TSC 端口地址是多少? 怎樣使用? 目的是在dos下獲得準(zhǔn)確時(shí)間控制 用匯編或qb或c都行…

查看全部問答∨

系統(tǒng)是WINCE NET 5.0CORE之前發(fā)貼不能回復(fù)了,所以再發(fā)貼問下!

系統(tǒng)是WINCE NET 5.0CORE 之前問過,沒有人能幫忙,現(xiàn)在問下,這個(gè)功能能實(shí)現(xiàn)嗎? 我想我復(fù)制到導(dǎo)航儀上的SD卡的文件別人不能復(fù)制出來,或者離開我這個(gè)SD卡不能夠運(yùn)行。和我的SD卡的ID號(hào)碼或者別的什么特定的東西綁定。誰能幫忙下啊, 順便問下 ...…

查看全部問答∨

TCPMP界面設(shè)計(jì),有償求助……

各位大俠,小弟畢業(yè)設(shè)計(jì)布置了這個(gè)任務(wù),老師進(jìn)度抓地太緊,我有限的知識(shí)實(shí)在來不及了。 需要在模擬器下實(shí)現(xiàn),TCPMP的0.72RC1源碼我已經(jīng)在EVC下編譯好并能成功運(yùn)行了,下面就是界面問題。 界面設(shè)計(jì)原型和切片的圖片都有了,而且只需要實(shí)現(xiàn)音頻播 ...…

查看全部問答∨

wince 下調(diào)用動(dòng)態(tài)連接庫問題

我定制了一個(gè)wince5.0操作系統(tǒng)映像,運(yùn)行時(shí)用遠(yuǎn)程工具拷貝進(jìn)去一個(gè)應(yīng)用程序和一個(gè)動(dòng)態(tài)庫,應(yīng)用程序調(diào)用動(dòng)態(tài)庫,在別人定制的設(shè)備上運(yùn)行沒有問題,但是在我定制的設(shè)備上就不行,加載動(dòng)態(tài)庫失敗. 如果應(yīng)用不加載動(dòng)態(tài)庫就沒有問題.請(qǐng)問定制wince5.0映像時(shí) ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 南涧| 桂东县| 广南县| 合川市| 格尔木市| 贺州市| 龙海市| 界首市| 板桥市| 布拖县| 建德市| 平昌县| 乾安县| 株洲市| 河北区| 开化县| 刚察县| 大田县| 拉孜县| 沛县| 沐川县| 阿拉善左旗| 青阳县| 那曲县| 收藏| 海盐县| 祁东县| 海南省| 广南县| 潮安县| 南部县| 安陆市| 泸西县| 巩留县| 赤壁市| 尉氏县| 罗定市| 济南市| 许昌市| 浮梁县| 高青县|