欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
請問STC單片機的eeprom 的寫入問題
[打印本頁]
作者:
laopihappy123
時間:
2020-9-21 21:11
標題:
請問STC單片機的eeprom 的寫入問題
我知道stc的eeprom是flash做出來的eeprom,不是嚴格意義上的,但是我想 它不是flash閃存嗎 必須通過擦除才能把0變成1,我想:如果我這樣:在第一個扇區寫入
00
FF
FF...........FF
然后我又對它修改一番 改成寫入
00
00
FF.....FF
,不知能不能直接寫入成功呢?
于是我編寫了程序,發現毫無反應.......無語中
不知道大家有試過嗎? 能否直接寫入(新的0數值而不先擦除) 呢
作者:
szb314
時間:
2020-9-22 08:40
必須是整個扇區擦除后都是FF....可以對任意一個字節寫數據...
作者:
wulin
時間:
2020-9-22 08:54
樓主的想法是正確的,可能是測試方法不對得不到預想結果。這是用TX-1C實驗板的測試程序,下載時勾選擦除用戶EEPROM區。
#include <reg52.h> //52系列單片機頭文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//定義ISP的操作命令
#define RdCommand 0x01 //讀命令
#define PrgCommand 0x02 //寫命令
#define EraseCommand 0x03 //擦除命令
#define WaitTime 0x01 //定義CPU的等待時間,寫入硬件延時
/*STC89系列EEPROM寄存器聲明*/
sfr ISP_DATA=0xe2; //0000,0000 EEPROM數據寄存器
sfr ISP_ADDRH=0xe3; //0000,0000 EEPROM地址高字節
sfr ISP_ADDRL=0xe4; //0000,0000 EEPROM地址第字節
sfr ISP_CMD=0xe5; //xxxx,xx00 EEPROM命令寄存器
sfr ISP_TRIG=0xe6; //0000,0000 EEPRPM命令觸發寄存器
sfr ISP_CONTR=0xe7; //0000,x000 EEPROM控制寄存器
sbit dula=P2^6; //聲明U1鎖存器的鎖存端
sbit wela=P2^7; //聲明U2鎖存器的鎖存端
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar data dis_buf[3];
uchar num,i;
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=110;j>0;j--);
}
void display() //顯示子函數
{
P0=0x00; dula=1;dula=0;
P0=~(0x01<<i);wela=1;wela=0;
P0=dis_buf[i];dula=1;dula=0;
i++;
i%=3;
}
/* ================ 打開 ISP,IAP 功能 ================= */
void ISP_IAP_enable(void)
{
EA = 0; /* 關中斷 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WaitTime; /* 寫入硬件延時 */
ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */
}
/* =============== 關閉 ISP,IAP 功能 ================== */
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */
ISP_TRIG = 0x00;
EA = 1; /* 開中斷 */
}
/* ================ 公用的觸發代碼 ==================== */
void ISPgoon(void)
{
ISP_IAP_enable(); /* 打開 ISP,IAP 功能 */
ISP_TRIG = 0x46; /* 觸發ISP_IAP命令字節1 */
ISP_TRIG = 0xb9; /* 觸發ISP_IAP命令字節2 */
_nop_();
}
/* ==================== 字節讀 ======================== */
unsigned char byte_read(unsigned int byte_addr)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址賦值 */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */
ISP_CMD = ISP_CMD | RdCommand; /* 寫入讀命令 */
ISPgoon(); /* 觸發執行 */
ISP_IAP_disable(); /* 關閉ISP,IAP功能 */
return (ISP_DATA); /* 返回讀到的數據 */
}
/* ================== 扇區擦除 ======================== */
void SectorErase(unsigned int sector_addr)
{
unsigned int iSectorAddr;
iSectorAddr = (sector_addr & 0xfe00); /* 取扇區地址 */
ISP_ADDRH = (unsigned char)(iSectorAddr >> 8);
ISP_ADDRL = 0x00;
ISP_CMD = ISP_CMD & 0xf8; /* 清空低3位 */
ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */
ISPgoon(); /* 觸發執行 */
ISP_IAP_disable(); /* 關閉ISP,IAP功能 */
}
/* ==================== 字節寫 ======================== */
void byte_write(unsigned int byte_addr, unsigned char original_data)
{
ISP_ADDRH = (unsigned char)(byte_addr >> 8); /* 取地址 */
ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff);
ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */
ISP_CMD = ISP_CMD | PrgCommand; /* 寫命令2 */
ISP_DATA = original_data; /* 寫入數據準備 */
ISPgoon(); /* 觸發執行 */
ISP_IAP_disable(); /* 關閉IAP功能 */
}
void main()
{
num=byte_read(0x2000);//讀取EEPROM中數據
byte_write(0x2000,num<<1);//從低位加0,寫入新數據。只能寫0不可寫1!
if(num==0)//上電第9次
SectorErase(0x2000);//擦除扇區重新恢復0xff
while(1)
{
dis_buf[0]=table[num/100%10];
dis_buf[1]=table[num/10%10];
dis_buf[2]=table[num%10];
display();
delayms(1);
}
}
復制代碼
作者:
aking991
時間:
2020-9-22 08:54
STC的手冊已有說了,要寫之前要把要寫入的扇區給先擦除,然后再寫就能保證寫入的萬無一失,如果不擦就先寫當然也可以,但是能否寫正確就不能保證了,按官方方法操作肯定不會有問題的
作者:
hhdsdy
時間:
2020-9-22 09:00
不應該毫無反應的,把你的程序貼出來看看唄
作者:
權威人物
時間:
2020-9-22 09:05
不按規范操作沒試過,一般都是按照官方給的操作,沒出現過問題,你不按操作來,人家都說了錯誤會操作失敗咯!還要去試。你硬是想知道,打電話去問問廠商看他怎么設計的吧!
作者:
XTXB
時間:
2020-9-22 10:08
本帖最后由 XTXB 于 2020-9-22 10:40 編輯
STC15親測可行,STC8G要加這個命令才行:ISP_TPS = 12;(12M晶振,24M晶振要改為24)
作者:
kxcuser
時間:
2020-9-22 11:28
你要重寫必須要重新擦除,而且是一擦就是一個扇區
作者:
滄興電子
時間:
2020-9-22 16:07
理論上應該可以寫入成功,只要是FF就可以寫入數據
作者:
laopihappy123
時間:
2020-9-22 23:23
XTXB 發表于 2020-9-22 10:08
STC15親測可行,STC8G要加這個命令才行:ISP_TPS = 12;(12M晶振,24M晶振要改為24)
是這樣呀! 謝謝您
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1