找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4191|回復(fù): 29
打印 上一主題 下一主題
收起左側(cè)

STC15F2K60S2單片機(jī)內(nèi)部EEPROM保存數(shù)據(jù)成功率低

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
STC15F2K60S2內(nèi)部EEPROM保存數(shù)據(jù)成功率低。我只保存2個(gè)16位的數(shù)據(jù)。有時(shí)能保,有時(shí)不保。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2023-1-27 20:59 | 只看該作者
不知道你的應(yīng)用場景,無法做出判斷。如果是用于掉電保存,是需要有一定的編程技巧和硬件支持。
回復(fù)

使用道具 舉報(bào)

板凳
ID:57657 發(fā)表于 2023-1-27 21:49 | 只看該作者
保存有問題可能是供電不足、晶振頻率、寄存器配置有問題,具體提供程序源碼。
回復(fù)

使用道具 舉報(bào)

地板
ID:965189 發(fā)表于 2023-1-27 22:39 | 只看該作者
成功率最低的部分
         case 3:disp_cn_1_16x16(piad[11],4,48);            //
                   if(num==12)                                                        //確認(rèn)鍵
                        {
                          if((shui_h!=shu)&&(shu!=0))
                          {
                               shui_h=shu;
                               delay_ms(2);
                                IapErase(0x0200);                         //扇區(qū)擦除
                                IapProgram(0x0200,shui_h>>8);  //保存高水位數(shù)據(jù)高8位
                                IapProgram(0x0200+1,shui_h);    //保存高水位數(shù)據(jù)低8位
                          }
                          flas++;
                          shu=0;                                 //輸入板清0
                        }
                        if(shui_h>99)
                        {
                          disp_cn_2_8x16(pia1[h1],4,40); //h百位
                        }
                        else
                        {
                          disp_cn_2_8x16(pi0[0],4,40); //
                        }
                        if(shui_h>9)
                        {
                          disp_cn_2_8x16(pia1[h2],4,48); //h十位
                        }
                        else
                        {
                          disp_cn_2_8x16(pi0[0],4,48); //
                        }
                          disp_cn_2_8x16(pia1[h3],4,56);
                        if(num==15)flas--;
                        break;
回復(fù)

使用道具 舉報(bào)

5#
ID:965189 發(fā)表于 2023-1-27 22:41 | 只看該作者
按確認(rèn)鍵(num==12),把設(shè)定的數(shù)據(jù)保存。
回復(fù)

使用道具 舉報(bào)

6#
ID:965189 發(fā)表于 2023-1-27 22:48 | 只看該作者
這些都是STC的例程提供的
/*----------------------------
    關(guān)閉IAP
----------------------------*/
void IapIdle()
{
    IAP_CONTR = 0;                  //關(guān)閉IAP功能
    IAP_CMD = 0;                    //清除命令寄存器
    IAP_TRIG = 0;                   //清除觸發(fā)寄存器
    IAP_ADDRH = 0x80;               //將地址設(shè)置到非IAP區(qū)域
    IAP_ADDRL = 0;
        EA=1;
}

/*----------------------------
從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
----------------------------*/
char IapRead(int addr)          //讀數(shù)據(jù)
{
    BYTE dat;                       //數(shù)據(jù)緩沖區(qū)

    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_READ;             //設(shè)置IAP命令
    IAP_ADDRL = addr;               //設(shè)置IAP低地址
    IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
    EA=0;
        IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
   
        _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
    IapIdle();                      //關(guān)閉IAP功能

    return dat;                     //返回
}

/*----------------------------
寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
----------------------------*/
void IapProgram(int addr, char dat)        //寫數(shù)據(jù)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_PROGRAM;          //設(shè)置IAP命令
    IAP_ADDRL = addr;               //設(shè)置IAP低地址
    IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
    EA=0;
        IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數(shù)據(jù)
    IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}

/*----------------------------
扇區(qū)擦除
----------------------------*/
void IapErase(int addr)                //扇區(qū)擦除
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_ERASE;            //設(shè)置IAP命令
    IAP_ADDRL = addr;               //設(shè)置IAP低地址
    IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
    EA=0;
        IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}
回復(fù)

使用道具 舉報(bào)

7#
ID:965189 發(fā)表于 2023-1-27 22:55 | 只看該作者
wulin 發(fā)表于 2023-1-27 20:59
不知道你的應(yīng)用場景,無法做出判斷。如果是用于掉電保存,是需要有一定的編程技巧和硬件支持。

不是掉電,按確認(rèn)鍵保存的。之前用過8G的,掉電保存都正常成功。
回復(fù)

使用道具 舉報(bào)

8#
ID:624769 發(fā)表于 2023-1-28 00:00 來自手機(jī) | 只看該作者
檢查 iap_contr 的設(shè)置,是否和你晶振一致,
回復(fù)

使用道具 舉報(bào)

9#
ID:213173 發(fā)表于 2023-1-28 07:21 | 只看該作者
君工創(chuàng) 發(fā)表于 2023-1-27 22:55
不是掉電,按確認(rèn)鍵保存的。之前用過8G的,掉電保存都正常成功。

CPU的等待時(shí)間ENABLE_IAP設(shè)置是否得當(dāng)?芯片型號確認(rèn)是STC15xxxx,不是IAP15xxxx?后者要另行指定保存地址。
回復(fù)

使用道具 舉報(bào)

10#
ID:491577 發(fā)表于 2023-1-28 14:34 | 只看該作者
最可能是扇區(qū)擦除時(shí)間沒有設(shè)置正確,造成擦除不完全。要根據(jù)單片機(jī)使用頻率選擇。STC例程工作頻率為11.0592MHz,選擇#define ENABLE_IAP  0x82是有問題的,應(yīng)該選0x83更好。
//#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
#define ENABLE_IAP  0x82            //if SYSCLK<20MHz
//#define ENABLE_IAP 0x83           //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87           //if SYSCLK<1MHz
回復(fù)

使用道具 舉報(bào)

11#
ID:434018 發(fā)表于 2023-1-28 17:50 | 只看該作者
增加 _nop_(); 數(shù)量試試
Example
for (int i=0;i<50;i++)  _nop_();
回復(fù)

使用道具 舉報(bào)

12#
ID:1034262 發(fā)表于 2023-1-28 17:58 | 只看該作者
樓主很可能是你設(shè)置的讀寫速度和MCU的頻率對不上導(dǎo)致的。
回復(fù)

使用道具 舉報(bào)

13#
ID:965189 發(fā)表于 2023-1-28 22:10 | 只看該作者
多謝上面幾位的建議,我的CPU主頻是24MHz.
回復(fù)

使用道具 舉報(bào)

14#
ID:41656 發(fā)表于 2023-1-29 10:39 | 只看該作者
你程序問題  STC用了很多了沒有發(fā)現(xiàn)這個(gè)問題注意設(shè)置的時(shí)間控制寄存器設(shè)置是否正確
回復(fù)

使用道具 舉報(bào)

15#
ID:491577 發(fā)表于 2023-1-29 21:45 | 只看該作者
CPU主頻是24MHz,比例程快了1倍,引用例程時(shí)有些地方需要多加一個(gè)_nop_(); 比如:
_nop_();                        //等待ISP/IAP/EEPROM操作完成
要多加一個(gè)_nop_();
另外:
#define ENABLE_IAP 0x81           //if SYSCLK<24MHz

回復(fù)

使用道具 舉報(bào)

16#
ID:965189 發(fā)表于 2023-1-29 22:14 | 只看該作者
之前用0x80;對應(yīng)30MHz,現(xiàn)在用#define ENABLE_IAP  0x81,對應(yīng)24MHz,兩個(gè)都用過,沒有改變。
回復(fù)

使用道具 舉報(bào)

17#
ID:965189 發(fā)表于 2023-1-29 22:17 | 只看該作者
唯有這個(gè)增加_nop_();未試過。
回復(fù)

使用道具 舉報(bào)

18#
ID:401564 發(fā)表于 2023-1-30 09:20 | 只看該作者
不存在成功率這一說的
代碼正確了就一定行
代碼正確了,保存不了,單片機(jī)本身的問題概率小到幾乎為0
檢查一下代碼
回復(fù)

使用道具 舉報(bào)

19#
ID:213173 發(fā)表于 2023-1-30 09:56 | 只看該作者
君工創(chuàng) 發(fā)表于 2023-1-28 22:10
多謝上面幾位的建議,我的CPU主頻是24MHz.

有可能是樓主開了中斷,在讀寫EEPROM時(shí)發(fā)生中斷,破壞了正常讀寫EEPROM。從你提供的代碼看并不是STC的原例程,被你插入了EA=1;/EA=0;。正常處理中斷的寫法是:
        case 3:disp_cn_1_16x16(piad[11],4,48);//
                if(num==12)//確認(rèn)鍵
                {
                        if((shui_h!=shu)&&(shu!=0))
                        {
                                shui_h=shu;
                                delay_ms(2);
                                EA=0;
                                IapErase(0x0200);                         //扇區(qū)擦除
                                IapProgram(0x0200,shui_h>>8);  //保存高水位數(shù)據(jù)高8位
                                IapProgram(0x0200+1,shui_h);    //保存高水位數(shù)據(jù)低8位
                                EA=1;
                        }
                }
回復(fù)

使用道具 舉報(bào)

20#
ID:491577 發(fā)表于 2023-1-30 12:46 | 只看該作者
還有可能是電源濾波問題,24M需要103電容,12M需要104電容,樓主可以試試12M或6M主頻時(shí)是否正常。如果降低主頻正常,電源加一個(gè)103電容和1個(gè)22uf電容。
回復(fù)

使用道具 舉報(bào)

21#
ID:965189 發(fā)表于 2023-1-30 13:17 | 只看該作者

我試過這個(gè)方法不行才改現(xiàn)在這的。
回復(fù)

使用道具 舉報(bào)

22#
ID:965189 發(fā)表于 2023-1-30 13:19 | 只看該作者

CPU傍邊有并104電容。
回復(fù)

使用道具 舉報(bào)

23#
ID:491577 發(fā)表于 2023-1-30 15:09 | 只看該作者
24M主頻需要103電容,104不行。STC手冊有要求好好看一下。12M主頻以下要104電容。
回復(fù)

使用道具 舉報(bào)

24#
ID:1044091 發(fā)表于 2023-1-30 15:22 來自手機(jī) | 只看該作者
還有一個(gè)方法,問下STC的技術(shù)支持,就是產(chǎn)品手冊上那個(gè)電話。我還是單片機(jī)初哥的時(shí)候就問過一次,技術(shù)小妹很專業(yè),幾句話就把問題解決了。
回復(fù)

使用道具 舉報(bào)

25#
ID:382454 發(fā)表于 2023-1-30 15:29 | 只看該作者
不可能的,要這樣說的話,芯片司也要倒閉了。
回復(fù)

使用道具 舉報(bào)

26#
ID:491577 發(fā)表于 2023-1-30 16:06 | 只看該作者
STC手冊的建議,24M主頻需要103電容,12M主頻以下要104電容。大部分情況下用104都沒事,但是有部分會出問題。最好按手冊來做,要是經(jīng)常改變頻率,最好103,104電容都加上,安全一些。

無標(biāo)題.jpg (250.64 KB, 下載次數(shù): 61)

無標(biāo)題.jpg
回復(fù)

使用道具 舉報(bào)

27#
ID:213173 發(fā)表于 2023-1-30 17:34 | 只看該作者
君工創(chuàng) 發(fā)表于 2023-1-30 13:17
我試過這個(gè)方法不行才改現(xiàn)在這的。

STC的例程沒有問題,做各種應(yīng)用測試也沒有出現(xiàn)過你上述現(xiàn)象。上萬件的產(chǎn)品出去沒有發(fā)生過EEPROM出這種問題。多數(shù)是你軟件或硬件有問題。
回復(fù)

使用道具 舉報(bào)

28#
ID:965189 發(fā)表于 2023-1-30 21:33 | 只看該作者
hhh402 發(fā)表于 2023-1-30 16:06
STC手冊的建議,24M主頻需要103電容,12M主頻以下要104電容。大部分情況下用104都沒事,但是有部分會出問題 ...

謝謝你的提醒,一直沒有留意這個(gè)問題,而且我習(xí)慣用104,看來這個(gè)問題也要重視;氐綇V州再試下。
回復(fù)

使用道具 舉報(bào)

29#
ID:965189 發(fā)表于 2023-1-31 09:25 | 只看該作者
wulin 發(fā)表于 2023-1-30 17:34
STC的例程沒有問題,做各種應(yīng)用測試也沒有出現(xiàn)過你上述現(xiàn)象。上萬件的產(chǎn)品出去沒有發(fā)生過EEPROM出這種問 ...

我也認(rèn)為是我的問題,只是暫時(shí)沒找到原因。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表