找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3710|回復(fù): 11
收起左側(cè)

STC8G2K64S4單片機(jī)IAP讀寫問題

[復(fù)制鏈接]
ID:588737 發(fā)表于 2021-7-2 17:13 | 顯示全部樓層 |閱讀模式
最經(jīng)剛用了一款STC的單片機(jī)STC8G2K64S4 ,數(shù)量200片,目前發(fā)現(xiàn)其中有兩片的EEPROM用IAP方式讀寫時會出問題。具體數(shù)據(jù)就是到數(shù)值超過127時,存入或者讀出的數(shù)據(jù)就變了,不知道大家有沒有遇到過
回復(fù)

使用道具 舉報

ID:451718 發(fā)表于 2021-7-2 18:39 | 顯示全部樓層
8G系列的IAP讀寫和  15系列的不一樣哦。 你的底層代碼是用的8G系列專用的么?
回復(fù)

使用道具 舉報

ID:948738 發(fā)表于 2021-7-3 21:08 | 顯示全部樓層
那就是那兩片有問題唄...
回復(fù)

使用道具 舉報

ID:588737 發(fā)表于 2021-7-5 08:20 | 顯示全部樓層
robinsonlin 發(fā)表于 2021-7-2 18:39
8G系列的IAP讀寫和  15系列的不一樣哦。 你的底層代碼是用的8G系列專用的么?

是的。底層程序,就是8G的 。這個不是用8G專用的也不會有198片成功的事。
回復(fù)

使用道具 舉報

ID:588737 發(fā)表于 2021-7-5 08:22 | 顯示全部樓層
464645465465465 發(fā)表于 2021-7-3 21:08
那就是那兩片有問題唄...

我關(guān)心的問題就是,是不是那兩片一定有問題,或者說怎么通過程序來控制。我也問了我的同事,他說之前的12C5410AD就有這個問題,然后他把存入的數(shù)據(jù)控制在100以內(nèi),就行了。要是這樣的話。。
回復(fù)

使用道具 舉報

ID:588737 發(fā)表于 2021-7-5 09:06 | 顯示全部樓層
robinsonlin 發(fā)表于 2021-7-2 18:39
8G系列的IAP讀寫和  15系列的不一樣哦。 你的底層代碼是用的8G系列專用的么?

是的,不然那198片也都是不對的了。
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2021-7-5 17:04 | 顯示全部樓層
代碼全部上傳看一下就知道怎么回事了
按照你這個寫入正確率,2/200,那就是1%沒有正常讀寫
這并不代表程序就是對的,特別是延時這一塊
因為,在絕大多數(shù)的情況下,單片機(jī)本身有問題的,是很少很少0.1%,都是多的,OTP單片機(jī)除外
帶EEPROM的單片機(jī)出廠之前,人家是進(jìn)行過很多次讀寫測試的,我進(jìn)過他們車間看過的
所以,上傳代碼看一下就知道了
回復(fù)

使用道具 舉報

ID:856401 發(fā)表于 2021-7-5 19:55 來自手機(jī) | 顯示全部樓層
在寫入數(shù)據(jù)的時候斷電了
回復(fù)

使用道具 舉報

ID:588737 發(fā)表于 2021-7-6 09:31 | 顯示全部樓層
Y_G_G 發(fā)表于 2021-7-5 17:04
代碼全部上傳看一下就知道怎么回事了
按照你這個寫入正確率,2/200,那就是1%沒有正常讀寫
這并不代表程序 ...

void IapIdle()
{
                IAP_CONTR=0;                //關(guān)閉IAP功能
                IAP_CMD=0;                        //清除命令寄存器
                IAP_TRIG=0;                //清除觸發(fā)寄存器
                IAP_ADDRH=0X80;    //將地址設(shè)置到非IAP區(qū)域
                IAP_ADDRL=0;
}

char IapRead(int addr)                          //讀
{
                char dat;

                IAP_DATA=0x00;
                IAP_CONTR=0x80;                //使能IAP
                IAP_TPS = 12;                   //設(shè)置擦出等待參數(shù) 12MHz 以下               
                IAP_CMD=1;                        //設(shè)置IAP讀命令
                IAP_ADDRL=addr;                //設(shè)置IAP低地址
                IAP_ADDRH=addr>>8;        //設(shè)置IAP高地址
                IAP_TRIG=0x5a;               //寫觸發(fā)命令
                IAP_TRIG=0xa5;                //寫觸發(fā)命令
                _nop_();
                dat=IAP_DATA;                        //讀命令數(shù)據(jù)
                IapIdle();                        //關(guān)閉IAP功能

                return dat;

}

void IapProgram(int addr,char dat)           //寫
{
                IAP_CONTR=0x80;                //使能IAP
                IAP_TPS = 12;                   //設(shè)置擦出等待參數(shù) 12MHz 以下               
                IAP_CMD=2;                        //設(shè)置IAP寫命令
                IAP_ADDRL=addr;                //設(shè)置IAP低地址
                IAP_ADDRH=addr>>8;        //設(shè)置IAP高地址
                IAP_DATA=dat;                //寫IAP數(shù)據(jù)
                IAP_TRIG=0x5a;           //寫觸發(fā)命令
                IAP_TRIG=0xa5;                //寫觸發(fā)命令
                _nop_();
                IapIdle();                        //關(guān)閉IAP功能

}

void IapErase(int addr)                                 //擦除
{        
                IAP_CONTR=0x80;                //使能IAP
                IAP_TPS = 12;                   //設(shè)置擦出等待參數(shù) 12MHz 以下               
                IAP_CMD=3;                        //設(shè)置IAP擦除命令
                IAP_ADDRL=addr;                //設(shè)置IAP低地址
                IAP_ADDRH=addr>>8;        //設(shè)置IAP高地址
                IAP_TRIG=0x5a;           //寫觸發(fā)命令
                IAP_TRIG=0xa5;                //寫觸發(fā)命令
                _nop_();
                IapIdle();                        //關(guān)閉IAP功能
}
這部分是官方例程
void WriteDATA_FLASH_START_ADDRESS1()
{       
                IapErase(0x0000);
                IapProgram(0x0000,0);
                IapProgram(0x0002,128);
                delaynms(30);
               
                IapProgram(0x0010,sc/100);
                IapProgram(0x0012,sc%100);
                delaynms(30);
               
                IapProgram(0x0020,0);
                IapProgram(0x0022,127);
                delaynms(30);
}
這是我的寫入,數(shù)值我改了方便測試
void Read_dat1()
{   
                sw=IapRead(0x0000);
                sw=sw*100+IapRead(0x0002);
               
                sc=IapRead(0x0010);
                sc=sc*100+IapRead(0x0012);
               
                p =IapRead(0x0020);
                p=p*100+IapRead(0x0022);
}
這部分讀,然后再到顯示部分。這里就不放出來了。實際顯示SW讀出的值無限大,P就是正常的127
回復(fù)

使用道具 舉報

ID:588737 發(fā)表于 2021-7-9 14:43 | 顯示全部樓層
沒有大神了嗎 求幫助啊 指導(dǎo)啊
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-7-9 16:54 | 顯示全部樓層
依然猶在 發(fā)表于 2021-7-9 14:43
沒有大神了嗎 求幫助啊 指導(dǎo)啊

如果別的芯片正常,就這兩個芯片經(jīng)重復(fù)燒寫仍然是這個問題,有可能是芯片不良。否則通常是程序問題。雖然這款芯片沒有用過,但STC的其它型號用了上萬并且使用了EEPROM讀寫,沒有遇到類似問題。樓主仔細(xì)看看是不是數(shù)據(jù)類型使用不當(dāng)或者中斷干擾了EEPROM讀寫。
回復(fù)

使用道具 舉報

ID:81196 發(fā)表于 2021-7-9 17:41 | 顯示全部樓層
是不是像EEPROM芯片一樣有讀寫buf限制
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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