新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 治標治本,徹底解決AVR單片機EEPROM數據丟失問題

        治標治本,徹底解決AVR單片機EEPROM數據丟失問題

        作者: 時間:2016-12-01 來源:網絡 收藏
        /*******************************************************************
        *函數名稱:EepromWriteBlock()
        *函數功能:將緩沖區中的n個數據寫進EEPROM
        *輸入參數:address:地址;data:數據
        *返回參數:
        *編寫作者:my_avr
        *編寫時間:2007年8月13日
        *相關說明:
        ********************************************************************/
        void EepromWriteBlock(unsigned char *buff,unsigned char *address,unsigned char n)
        {
        unsigned char i;
        for (i = 0; i < n; i++)
        {
        EepromWriteByte((unsigned char *)(address + i),*buff);
        buff++;
        }
        }
        /******************************************************************
        *函數名稱:unsigned char EepromCheck(unsigned char *pdata,unsigned char packsize)
        *函數功能:檢查EEPROM的數據是否有效,采用CRC16校驗技術。
        一次校驗默認最后兩個字節為校驗碼,
        需要注意,packsize包括數據長度和校驗碼字節
        *輸入參數:pdata:數組指針;packsize:數據長度
        *返回參數:數據是否有效,有效:VALID,無效:INVALID
        *編寫作者:my_avr
        *編寫時間:2007年8月21日
        *相關說明:
        ********************************************************************/
        unsigned char EepromCheck(unsigned char *pdata,unsigned char packsize)
        {
        unsigned char i,j;
        unsigned int crc,ref_crc;
        crc = 0;
        ref_crc = 0;
        for (i = 0; i < (packsize - 2); i ++)
        {
        crc = crc ^ ((uint16_t) EepromReadByte(pdata) << 8);
        for (j = 0; j < 8; j++)
        {
        if (crc & 0x8000)
        {
        crc = (crc << 1) ^ 0x1021;
        }
        else
        {
        crc = crc << 1;
        }
        }
        pdata ++;
        }
        ref_crc = (uint16_t) EepromReadByte(pdata);
        ref_crc = ref_crc<<8;
        pdata ++;
        ref_crc |= (uint16_t) EepromReadByte(pdata);
        if (crc == ref_crc)
        {
        return VALID;
        }
        else
        {
        return INVALID;
        }
        }
        /*******************************************************************
        *函數名稱:unsigned char CheckWriteCRC(unsigned char *pdata,unsigned char packsize)
        *函數功能:為EEPROM數據寫CRC校驗碼
        *輸入參數:pdata:數組指針;packsize:數據長度
        *返回參數:操作成功否?,成功:VALID,失敗:INVALID
        *編寫作者:my_avr
        *編寫時間:2007年8月21日
        *相關說明:
        ********************************************************************/
        unsigned char CheckWriteCRC(unsigned char *pdata,unsigned char packsize)
        {
        unsigned char i,j;
        unsigned int crc;
        crc = 0;
        for (i = 0; i < (packsize - 2); i ++)
        {
        crc = crc ^ ((uint16_t) EepromReadByte(pdata) << 8);
        for (j = 0; j < 8; j++)
        {
        if (crc & 0x8000)
        {
        crc = (crc << 1) ^ 0x1021;
        }
        else
        {
        crc = crc << 1;
        }
        }
        pdata ++;
        }
        EepromWriteByte(pdata,(uint8_t) (crc>>8));
        pdata ++;
        EepromWriteByte(pdata,(uint8_t) crc);
        pdata ++;
        if (EepromCheck((pdata - packsize),packsize))
        {
        return VALID;
        }
        else
        {
        return INVALID;
        }
        }
        /********************************************************************
        *函數名稱:unsigned char CheckAllPage(void)
        *函數功能:檢查EEPROM數據是否有效,檢查三個備份
        *輸入參數:無
        *返回參數:操作成功否?,成功:VALID,失敗:INVALID
        *編寫作者:my_avr
        *編寫時間:2007年8月21日
        *相關說明:
        ********************************************************************/
        uint8_t CheckAllPage(void)
        {
        if ((EepromCheck((unsigned char *)EepromPage1Add,EepromPageSize) == VALID)
        &&(EepromCheck((unsigned char *)EepromPage2Add,EepromPageSize) == VALID)
        &&(EepromCheck((unsigned char *)EepromPage3Add,EepromPageSize) == VALID))
        {
        return VALID;
        }
        return INVALID;

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 会东县| 长治市| 大埔县| 宁河县| 贵定县| 安溪县| 凤翔县| 阿巴嘎旗| 德格县| 买车| 新乡县| 攀枝花市| 色达县| 潞西市| 镇原县| 喀什市| 千阳县| 玉门市| 南充市| 禹城市| 阿拉善右旗| 广汉市| 盐津县| 上蔡县| 文水县| 祁连县| 竹山县| 湟中县| 万山特区| 东海县| 莎车县| 兰溪市| 融水| 曲沃县| 衡山县| 镇康县| 日喀则市| 唐山市| 阜新市| 石狮市| 长宁县|