久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4320|回復: 9
打印 上一主題 下一主題
收起左側(cè)

STC15W單片機EEPROM怎么讀寫?

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:608872 發(fā)表于 2021-5-20 18:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
學單片機時間不長,現(xiàn)在需要用到掉電保存參數(shù)的功能,看了官方手冊測試程序,有很多不懂的地方。比如怎么一次寫入5個變量,然后在一次性讀出來。還有扇區(qū)的高位和低位地址怎么寫

單片機源程序如下:
  1.     /*----------------------------
  2.     關(guān)閉IAP功能
  3.     ----------------------------*/
  4.     void IapIdle()
  5.     {
  6.     IAP_CONTR = 0; //關(guān)閉IAP功能
  7.     IAP_CMD = 0; //清除命令寄存器
  8.     IAP_TRIG = 0; //清除觸發(fā)寄存器
  9.     IAP_ADDRH = 0x80; //將地址設(shè)置到非IAP區(qū)域
  10.     IAP_ADDRL = 0;
  11.     }
  12.     /*----------------------------
  13.     從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
  14.     ----------------------------*/
  15.     char IapRead(int addr)
  16.     {
  17.     char dat;
  18.     IAP_CONTR = WT_12M; //使能IAP
  19.     IAP_CMD = 1; //設(shè)置IAP讀命令
  20.     IAP_ADDRL = addr; //設(shè)置IAP低地址
  21.     IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
  22.     IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
  23.     IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
  24.     _nop_();
  25.     dat = IAP_DATA; //讀IAP數(shù)據(jù)
  26.     IapIdle(); //關(guān)閉IAP功能
  27.     return dat;
  28.     }
  29.     /*-------------------------------
  30.     寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
  31.     -------------------------------*/
  32.     void IapProgram(int addr, char dat)
  33.     {
  34.     IAP_CONTR = WT_12M; //使能IAP
  35.     IAP_CMD = 2; //設(shè)置IAP寫命令
  36.     IAP_ADDRL = addr; //設(shè)置IAP低地址
  37.     IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
  38.     IAP_DATA = dat; //寫IAP數(shù)據(jù)
  39.     IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
  40.     IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
  41.     _nop_();
  42.     IapIdle(); //關(guān)閉IAP功能
  43.     }
  44.     /*----------------------------
  45.     ISP/IAP/EEPROM扇區(qū)擦除
  46.     ----------------------------*/
  47.     void IapErase(int addr)
  48.     {
  49.     IAP_CONTR = WT_12M; //使能IAP
  50.     IAP_CMD = 3; //設(shè)置IAP擦除命令
  51.     IAP_ADDRL = addr; //設(shè)置IAP低地址
  52.     IAP_ADDRH = addr >> 8; //設(shè)置IAP高地址
  53.     IAP_TRIG = 0x5a; //寫觸發(fā)命令(0x5a)
  54.     IAP_TRIG = 0xa5; //寫觸發(fā)命令(0xa5)
  55.     _nop_(); //
  56.     IapIdle(); //關(guān)閉IAP功能
  57.     }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 2021-5-20 20:59 | 只看該作者
給你寫一個一看就能明白的示例
  1. #include <STC15F2K60S2.H>    //通用頭文件
  2. #include <intrins.h>                                //庫頭文件
  3. #define uint unsigned int                         //宏定義數(shù)據(jù)類型uint
  4. #define uchar unsigned char                 //宏定義數(shù)據(jù)類型uchar
  5. //宏定義ISP的操作命令
  6. #define CMD_IDLE    0               //空閑模式
  7. #define CMD_READ    1               //IAP字節(jié)讀命令
  8. #define CMD_PROGRAM 2               //IAP字節(jié)編程命令
  9. #define CMD_ERASE   3               //IAP扇區(qū)擦除命令
  10. #define ENABLE_IAP  0x82            //CPU的等待時間
  11. #define IAP_ADDRESS 0x0000                        //測試地址

  12. /*----------------------------
  13.         關(guān)閉IAP功能
  14. ----------------------------*/
  15. void IapIdle()
  16. {
  17.     IAP_CONTR = 0;                  //關(guān)閉IAP功能
  18.     IAP_CMD = 0;                    //清除命令寄存器
  19.     IAP_TRIG = 0;                   //清除觸發(fā)寄存器
  20.     IAP_ADDRH = 0x80;               //將地址設(shè)置到非IAP區(qū)域
  21.     IAP_ADDRL = 0;
  22. }
  23. /*----------------------------
  24. 從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
  25. ----------------------------*/
  26. uchar IapReadByte(uint addr)
  27. {
  28.     uchar dat;                       //數(shù)據(jù)緩沖區(qū)
  29.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  30.     IAP_CMD = CMD_READ;             //設(shè)置IAP命令
  31.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  32.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  33.     IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
  34.     IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
  35.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  36.     dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
  37.     IapIdle();                      //關(guān)閉IAP功能
  38.     return dat;                     //返回
  39. }
  40. /*-------------------------------
  41. 寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
  42. --------------------------------*/
  43. void IapProgramByte(uint addr, uchar dat)
  44. {
  45.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  46.     IAP_CMD = CMD_PROGRAM;          //設(shè)置IAP命令
  47.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  48.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  49.     IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數(shù)據(jù)
  50.     IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
  51.     IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
  52.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  53.     IapIdle();                      //關(guān)閉IAP功能
  54. }
  55. /*----------------------------
  56. ISP/IAP/EEPROM扇區(qū)擦除
  57. ----------------------------*/
  58. void IapEraseSector(uint addr)
  59. {
  60.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  61.     IAP_CMD = CMD_ERASE;            //設(shè)置IAP命令
  62.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  63.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  64.     IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
  65.     IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
  66.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  67.     IapIdle();                      //關(guān)閉IAP功能
  68. }

  69. /**ms延時子程序(11.0592MHz 1T)****/
  70. void delayms(uint k)
  71. {
  72.         uint i,j;
  73.         for(i=k;i>0;i--)
  74.                 for(j=829;j>0;j--);
  75. }

  76. void main()                                                       
  77. {
  78.         uchar i;
  79.         uchar a[5]={0x01,0x02,0x04,0x08,0x10};
  80.         uchar b[5];
  81.         //寫EEPROM前不管多少字節(jié)(最多512字節(jié))要先擦除整個扇區(qū)
  82.         IapEraseSector(IAP_ADDRESS);//擦除EEPROM整個扇區(qū),一個扇區(qū)512個字節(jié)
  83.         for(i=0;i<5;i++)
  84.         {
  85.                 IapProgramByte(IAP_ADDRESS+i,a[i]);//連續(xù)寫入5個字節(jié)
  86.         }

  87.         for(i=0;i<5;i++)
  88.         {
  89.                 b[i]=IapReadByte(IAP_ADDRESS+i);//連續(xù)讀取EEPROM中數(shù)據(jù)另存到b[]
  90.         }
  91.                        
  92.         while(1)
  93.         {
  94.                 for(i=0;i<5;i++)
  95.                 {
  96.                         P1=b[i];//驗證b[]中保存的數(shù)據(jù)
  97.                         delayms(1000);
  98.                 }               
  99.         }
  100. }
復制代碼
回復

使用道具 舉報

板凳
ID:390416 發(fā)表于 2021-5-21 18:18 | 只看該作者
volatile u8 code EEPROM_Flash[512] _at_ 0x4000;

void EEPROM_Wipe512_Drive(u8 AddrH)
{
        IAP_ADDRH=AddrH;
        IAP_CMD=0x03;
        IAP_CONTR|=0x82;
        IAP_TRIG=0x5a;
        IAP_TRIG=0xa5;
}

void EEPROM_Write_Byte_Drive(u8 AddrH,u8 AddrL,u8 Dat)
{
        IAP_ADDRH=AddrH;
        IAP_ADDRL=AddrL;
        IAP_DATA=Dat;
        IAP_CMD=0x02;
        IAP_CONTR|=0x82;
        IAP_TRIG=0x5a;
        IAP_TRIG=0xa5;
}

u8 EEPROM_Read_Byte_Drive(u8 AddrH,u8 AddrL)
{
        u8 Dat;
        IAP_ADDRH=AddrH;
        IAP_ADDRL=AddrL;
        IAP_CMD=0x01;
        IAP_CONTR|=0x82;
        IAP_TRIG=0x5a;
        IAP_TRIG=0xa5;
        Dat=IAP_DATA;
        return Dat;
}
回復

使用道具 舉報

地板
ID:451718 發(fā)表于 2021-5-22 13:38 | 只看該作者
最初的時候,我用char類型數(shù)組來存,后來嫌int類型轉(zhuǎn)換太麻煩, 用了結(jié)構(gòu)體。

void Put_Val(int addr,char number,unsigned char *buf)
{
          unsigned char i;
          Delay10ms();                      //延時
    for (i=0; i<number; i++)         
    {
        IapProgramByte(addr+i, *buf++);
    }
}
//----------------數(shù)組的方式---------------------
unsigned char Val[6]={0};
Put_Val(IAP_ADDRESS,8,Val);

//----------------結(jié)構(gòu)體的方式------------------
typedef struct
{
        unsigned char MiniuteP1;
        unsigned char SecondP1;       
        unsigned int  TempP1;
        unsigned long SysTickSec;
}GERVAL;
GERVAL GVal;

Put_Val(IAP_ADDRESS,sizeof(GVal),(unsigned char *)&GVal);

回復

使用道具 舉報

5#
ID:858964 發(fā)表于 2021-5-22 13:56 | 只看該作者
wulin 發(fā)表于 2021-5-20 20:59
給你寫一個一看就能明白的示例

請教:有讀寫MCP4725_EEPROM 的示例代碼否?
回復

使用道具 舉報

6#
ID:925350 發(fā)表于 2021-5-22 14:12 | 只看該作者
和樓主一樣的問題,求解
回復

使用道具 舉報

7#
ID:608872 發(fā)表于 2021-5-25 10:51 | 只看該作者
wulin 發(fā)表于 2021-5-20 20:59
給你寫一個一看就能明白的示例

寫字節(jié)的時候,比如第一扇區(qū)起始地址0000f,結(jié)束地址1ffh,
    IAP_ADDRL = addr;               //設(shè)置IAP低地址,addr是不是改成1ffh呢
    IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址,addr是不是改成0000f呢

回復

使用道具 舉報

8#
ID:136485 發(fā)表于 2021-5-25 11:16 | 只看該作者
給你一段上電讀出和寫入的代碼
d  =IapRead(0x0000);
sum=IapRead(0x0001);
num=IapRead(0x0002);
num=num<<8|IapRead(0x0003);
//speed=IapRead(0x0004);
while (1)
  {
   mode();
   RST();
   if((up)&&(down))
    {
     speed=0;
        }
   if(1==d)
    {
         mode();
     RST();
     //key();
         if(d==0)break;
         if(add)
          {
           count3++;
           //key1=1;
           if(d==0)break;
           if(count3>40000)
            {
                 count3=0;
         num=num-150;
                 if((0==num)||(num>900)){num=150;}
                 _nop_();
             _nop_();
             IapErase(0x0000);//擦除扇區(qū)
         IapProgram(0x0000,d);
         IapProgram(0x0001,sum);
         IapProgram(0x0002,num>>8);
         IapProgram(0x0003,num);
回復

使用道具 舉報

9#
ID:213173 發(fā)表于 2021-5-25 13:32 | 只看該作者
yinnan128 發(fā)表于 2021-5-25 10:51
寫字節(jié)的時候,比如第一扇區(qū)起始地址0000f,結(jié)束地址1ffh,
    IAP_ADDRL = addr;               //設(shè) ...

以STC15W408AS為例,其EEPROM為5K,分10個扇區(qū)。第一扇區(qū)地址范圍0x0000~0x01ff,第二扇區(qū)地址范圍0x0200~0x02ff,.......以此類推。各扇區(qū)首地址為:0x0000,0x0200,0x0400,0x0800.......。

寫數(shù)據(jù)時,只要不越界,可以指定某扇區(qū)的任意地址。操作中通常以首地址+x(x=0~511)的方法。

        寫字節(jié)的時候,比如第一扇區(qū)最后一個地址01ffh

        IAP_ADDRL = addr;               //低8位0xff
        IAP_ADDRH = addr >> 8;          //高8位0x01
回復

使用道具 舉報

10#
ID:883031 發(fā)表于 2021-5-25 16:48 | 只看該作者
擦除扇區(qū)給出起始地址即可,在擦除時地址是自動增加的,知道一個扇區(qū)擦完。
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 香蕉视频91| 羞羞视频免费观看 | 久久亚洲一区 | 欧美videosex性极品hd | 成人在线一区二区三区 | 一级欧美 | 男人电影天堂 | 免费毛片网站在线观看 | 精品国产一区二区三区久久久蜜月 | 91影片 | 日韩一区不卡 | 国产精品美女久久久av超清 | 午夜免费看 | 色网站入口 | 人人干免费 | 亚洲精品久久区二区三区蜜桃臀 | 一道本不卡视频 | 密乳av| 久国久产久精永久网页 | 成人精品一区二区 | 毛片在线免费 | 亚洲成人精品在线 | 久久精品国产99国产精品 | 黄色网络在线观看 | 久久久精品一区二区三区 | 99久久精品免费看国产小宝寻花 | 国内自拍偷拍 | 天堂资源最新在线 | 日韩最新网址 | 久久只有精品 | 你懂的在线视频播放 | 亚洲一区视频在线 | 久久久久久国产精品三区 | 91视频在线 | 久久久久久91香蕉国产 | 亚洲第一天堂 | 国产在线中文 | 中文字幕国产日韩 | 在线成人av| 久久天天躁狠狠躁夜夜躁2014 | 免费啪啪|