在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一文詮釋NandFlash ECC校驗原理與實現

strongerHuang ? 來源:nhczp ? 作者:nhczp ? 2021-07-27 16:15 ? 次閱讀

大家應該都在用U盤,而U盤中的存儲芯片就是NandFlash,你買的64G的U盤,實際并沒有64G,其中一個原因就是存在壞塊。

因為工藝和其他方面的原因,不能保證NandFlash不存在壞塊,因此就需要“挑選出壞塊”。

本文就為大家講述一下用于NandFlash的ECC校驗原理與實現。

ECC簡介

由于NAND Flash的工藝不能保證NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生產中及使用過程中會產生壞塊。為了檢測數據的可靠性,在應用NAND Flash的系統中一般都會采用一定的壞區管理策略,而管理壞區的前提是能比較可靠的進行壞區檢測。

如果操作時序和電路穩定性不存在問題的話,NAND Flash出錯的時候一般不會造成整個Block或是Page不能讀取或是全部出錯,而是整個Page(例如512Bytes)中只有一個或幾個bit出錯。

對數據的校驗常用的有奇偶校驗、CRC校驗等,而在NAND Flash處理中,一般使用一種比較專用的校驗——ECC。ECC能糾正單比特錯誤和檢測雙比特錯誤,而且計算速度很快,但對1比特以上的錯誤無法糾正,對2比特以上的錯誤不保證能檢測。

ECC原理

ECC一般每256字節原始數據生成3字節ECC校驗數據,這三字節共24比特分成兩部分:6比特的列校驗和16比特的行校驗,多余的兩個比特置1,如下圖所示:

a3ff8f4a-eb95-11eb-a97a-12bb97331649.png

ECC的列校驗和生成規則如下圖所示:

a41627c8-eb95-11eb-a97a-12bb97331649.png

用數學表達式表示為:

P4=D7(+)D6(+)D5(+)D4P4`=D3(+)D2(+)D1(+)D0P2=D7(+)D6(+)D3(+)D2P2`=D5(+)D4(+)D1(+)D0P1=D7(+)D5(+)D3(+)D1P1`=D6(+)D4(+)D2(+)D0

備注:這里(+)表示“位異或”操作

ECC的行校驗和生成規則如下圖所示:

a423029a-eb95-11eb-a97a-12bb97331649.png

用數學表達式表示為:

P8 = bit7(+)bit6(+)bit5(+)bit4(+)bit3(+)bit2(+)bit1(+)bit0(+)P8

備注:這里(+)表示“位異或”操作

當往NAND Flash的page中寫入數據的時候,每256字節我們生成一個ECC校驗和,稱之為原ECC校驗和,保存到PAGE的OOB(out-of-band)數據區中。

當從NAND Flash中讀取數據的時候,每256字節我們生成一個ECC校驗和,稱之為新ECC校驗和。

校驗的時候,根據上述ECC生成原理不難推斷:將從OOB區中讀出的原ECC校驗和新ECC校驗和按位異或,若結果為0,則表示不存在錯(或是出現了ECC無法檢測的錯誤);若3個字節異或結果中存在11個比特位為1,表示存在一個比特錯誤,且可糾正;若3個字節異或結果中只存在1個比特位為1,表示OOB區出錯;其他情況均表示出現了無法糾正的錯誤。

ECC算法的實現

這里附上算法代碼:

static const u_char nand_ecc_precalc_table[] ={0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00,0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30, 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55, 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56, 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33, 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59, 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c, 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f, 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a, 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00};

//Creates non-inverted ECC code from line paritystatic void nand_trans_result(u_char reg2, u_char reg3,u_char *ecc_code){u_char a, b, i, tmp1, tmp2;

/* Initialize variables */a = b = 0x80;tmp1 = tmp2 = 0;

/* Calculate first ECC byte */for (i = 0; i 《 4; i++){if (reg3 & a) /* LP15,13,11,9 --》 ecc_code[0] */tmp1 |= b;b 》》= 1;if (reg2 & a) /* LP14,12,10,8 --》 ecc_code[0] */tmp1 |= b;b 》》= 1;a 》》= 1;}

/* Calculate second ECC byte */b = 0x80;for (i = 0; i 《 4; i++){if (reg3 & a) /* LP7,5,3,1 --》 ecc_code[1] */tmp2 |= b;b 》》= 1;if (reg2 & a) /* LP6,4,2,0 --》 ecc_code[1] */tmp2 |= b;b 》》= 1;a 》》= 1;}

/* Store two of the ECC bytes */ecc_code[0] = tmp1;ecc_code[1] = tmp2;}

//Calculate 3 byte ECC code for 256 byte blockvoid nand_calculate_ecc (const u_char *dat, u_char *ecc_code){u_char idx, reg1, reg2, reg3;int j;

/* Initialize variables */reg1 = reg2 = reg3 = 0;ecc_code[0] = ecc_code[1] = ecc_code[2] = 0;

/* Build up column parity */for(j = 0; j 《 256; j++){/* Get CP0 - CP5 from table */idx = nand_ecc_precalc_table[dat[j]];reg1 ^= (idx & 0x3f);

/* All bit XOR = 1 ? */if (idx & 0x40) {reg3 ^= (u_char) j;reg2 ^= ~((u_char) j);}}

/* Create non-inverted ECC code from line parity */nand_trans_result(reg2, reg3, ecc_code);

/* Calculate final ECC code */ecc_code[0] = ~ecc_code[0];ecc_code[1] = ~ecc_code[1];ecc_code[2] = ((~reg1) 《《 2) | 0x03;}

//Detect and correct a 1 bit error for 256 byte blockint nand_correct_data (u_char *dat, u_char *read_ecc, u_char *calc_ecc){u_char a, b, c, d1, d2, d3, add, bit, i;

/* Do error detection */d1 = calc_ecc[0] ^ read_ecc[0];d2 = calc_ecc[1] ^ read_ecc[1];d3 = calc_ecc[2] ^ read_ecc[2];

if ((d1 | d2 | d3) == 0){/* No errors */return 0;}else{a = (d1 ^ (d1 》》 1)) & 0x55;b = (d2 ^ (d2 》》 1)) & 0x55;c = (d3 ^ (d3 》》 1)) & 0x54;

/* Found and will correct single bit error in the data */if ((a == 0x55) && (b == 0x55) && (c == 0x54)){c = 0x80;add = 0;a = 0x80;for (i=0; i《4; i++){if (d1 & c)add |= a;c 》》= 2;a 》》= 1;}c = 0x80;for (i=0; i《4; i++){if (d2 & c)add |= a;c 》》= 2;a 》》= 1;}bit = 0;b = 0x04;c = 0x80;for (i=0; i《3; i++){if (d3 & c)bit |= b;c 》》= 2;b 》》= 1;}b = 0x01;a = dat[add];a ^= (b 《《 bit);dat[add] = a;return 1;}else{i = 0;while (d1){if (d1 & 0x01)++i;d1 》》= 1;}while (d2){if (d2 & 0x01)++i;d2 》》= 1;}while (d3){if (d3 & 0x01)++i;d3 》》= 1;}if (i == 1){/* ECC Code Error Correction */read_ecc[0] = calc_ecc[0];read_ecc[1] = calc_ecc[1];read_ecc[2] = calc_ecc[2];return 2;}else{/* Uncorrectable Error */return -1;}}}

/* Should never happen */return -1;}

參考文檔:

http://blogimg.chinaunix.net/blog/upfile2/080702112233.pdf

免責聲明:本文素材來源網絡,版權歸原作者所有。如涉及作品版權問題,請與我聯系刪除。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ECC
    ECC
    +關注

    關注

    0

    文章

    97

    瀏覽量

    20927

原文標題:NandFlash ECC校驗原理與實現

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    S32K311如何在Flash上測試ECC

    我有些與目標 S32K311 上的 Flash ECC 相關的問題 - ERM 是否負責 Code Flash 和 Data Flash ECC 中斷通知? - 我們如何在 Flash 上測試
    發表于 04-14 08:47

    基于Verilog語言實現CRC校驗

    CRC即循環冗余校驗碼:是數據通信領域中最常用的種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是種數
    的頭像 發表于 03-24 10:36 ?1048次閱讀
    基于Verilog語言<b class='flag-5'>實現</b>CRC<b class='flag-5'>校驗</b>

    求助,關于STM32H7系列芯片下的ECC功能的疑問求解

    無法關閉ECC就無法測對于單bit錯誤。特別是位錯誤下,原始數據,讀出數據,以及ECC碼無法同時看到。 1.想問下STM32官網工程師,是否存在關閉ECC,嚴格實現單bit和雙bit錯
    發表于 03-11 07:43

    請問ECC功能開啟后如何驗證這個功能是否正常開啟呢?

    各位大佬,現在我這邊個項目,代碼層面開啟ECC監控和中斷后,如何驗證當真實應用環境下,Ram區或者Flash區某個位被打翻后,會正常觸發中斷,實現讀和回寫的功能呢?
    發表于 03-11 06:19

    ECC204 mikroBUS?評估板用戶指南

    電子發燒友網站提供《ECC204 mikroBUS?評估板用戶指南.pdf》資料免費下載
    發表于 01-22 16:55 ?0次下載
    <b class='flag-5'>ECC</b>204 mikroBUS?評估板用戶指南

    ECC608-TMNGTLS CryptoAuthentication?數據手冊

    電子發燒友網站提供《ECC608-TMNGTLS CryptoAuthentication?數據手冊.pdf》資料免費下載
    發表于 01-22 15:46 ?0次下載
    <b class='flag-5'>ECC</b>608-TMNGTLS CryptoAuthentication?數據手冊

    ECC206概要數據手冊

    電子發燒友網站提供《ECC206概要數據手冊.pdf》資料免費下載
    發表于 01-21 14:05 ?0次下載
    <b class='flag-5'>ECC</b>206概要數據手冊

    TDAxx上的ECC/EDC

    電子發燒友網站提供《TDAxx上的ECC/EDC.pdf》資料免費下載
    發表于 10-11 10:19 ?0次下載
    TDAxx上的<b class='flag-5'>ECC</b>/EDC

    DDR Inline ECC在Jacinto7 SoC中的應用

    電子發燒友網站提供《DDR Inline ECC在Jacinto7 SoC中的應用.pdf》資料免費下載
    發表于 09-27 11:04 ?0次下載
    DDR Inline <b class='flag-5'>ECC</b>在Jacinto7 SoC中的應用

    rtthread支持nandflash掛載fatfs文件系統嗎?

    rtthread支持nandflash掛載fatfs文件系統嗎
    發表于 09-27 09:45

    SF6氣體密度繼電器校驗裝置的操作使用——每日了解電力知識

    今天武漢摩恩智能電氣有限公司帶大家了解下MEMD-5000 SF6氣體密度繼電器校驗裝置 MEMD-5000 SF6氣體密度繼電器校驗裝置的操作使用: 功能選擇界面 可以直接觸摸各選擇框實現
    的頭像 發表于 07-26 10:38 ?728次閱讀
    SF6氣體密度繼電器<b class='flag-5'>校驗</b>裝置的操作使用——每日了解電力知識

    電流互感器極性校驗的方法

    測量和保護系統的準確性和可靠性至關重要。本文將詳細介紹電流互感器極性校驗的方法,包括原理、步驟、注意事項和實際應用。 、電流互感器極性校驗的原理 電流互感器的工作原理是利用電磁感應原理,將
    的頭像 發表于 06-24 10:41 ?2787次閱讀

    Traveo T2G SRAM不是32位的嗎?如何得到個64位的?

    11010100_01000010_00100101_10000100_01001011_10100110_01011100_10110111; 如圖所示,CODEWORD_SW[127:0] 與各自 ECC 常量的 AND 結果的 Reduction XOR 將給出
    發表于 06-03 08:49

    PSoC5LP:ECC總是返回失敗的原因?

    我正在做個項目,需要在啟動時檢查閃存的完整性。 PSoC 是 CY8C5667AXI-LP040,我使用的是 Creator 4.3(ARM GCC 5.4-2016-q2-update) 啟用
    發表于 05-30 08:15

    CYT4BF的監管區 (SFlash) 是否支持 ECC

    CYT4BF 的監管區 (SFlash) 是否支持 ECC? 如果支持 ECC, 控制 ECC 的寄存器是否與 FLASHC/FLASHC1_FLASH_CTL.MAIN_ECC_EN
    發表于 05-23 07:26
    主站蜘蛛池模板: 亚洲va久久久久综合 | 五月天婷婷在线免费观看 | 国产免费成人在线视频 | 国产一区在线播放 | 免费看美女禁处爆涌视频 | 手机看福利片 | 最近高清免费观看视频 | 亚洲色图欧美在线 | 婷婷久久综合 | 插插插操操操 | 日韩一级欧美一级在线观看 | 欧美高清另类 | 五月天婷婷在线播放 | 天堂8资源8在线 | 婷婷激情综合五月天 | 天天做天天爽爽快快 | 天堂网2014 | 色综合久久一区二区三区 | 久久狠狠色噜噜狠狠狠狠97 | 可以免费播放的在线视频 | 久久全国免费久久青青小草 | 欧美日韩一卡2卡三卡4卡新区 | 色一乱一伦一区一直爽 | 欧美一级视频免费观看 | 久操视频网 | 亚洲高清一区二区三区 | 天天鲁天天爽天天视频 | 激情在线网站 | 午夜无遮挡怕怕怕免费视频 | 国产一区二区三区四卡 | 久久精品国产夜色 | 免费看一级特黄a大片 | 伊人丁香婷婷综合一区二区 | 色中文字幕在线 | 国产日韩欧美综合色视频在线 | 色五五月五月开 | 在线免费成人网 | 国产成人亚洲综合a∨婷婷 国产成人一区二区三中文 国产成人一区二区在线不卡 | 在线观看色视频 | 亚洲一区免费看 | 天堂资源在线官网资源 |