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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1774|回復: 2
收起左側

STC單片機的EEPROM問題

[復制鏈接]
ID:740383 發表于 2022-10-5 11:44 | 顯示全部樓層 |閱讀模式
  1. .C


  2. #include "eeprom.h"

  3. #include        "STC15Fxxxx.H"





  4. //========================================================================
  5. // 函數: void        ISP_Disable(void)
  6. // 描述: 禁止訪問ISP/IAP.
  7. // 參數: non.
  8. // 返回: non.
  9. // 版本: V1.0, 2022-05-28
  10. //========================================================================
  11. void        DisableEEPROM(void)
  12. {
  13.         ISP_CONTR = 0;                        //禁止ISP/IAP操作
  14.         ISP_CMD   = 0;                        //去除ISP/IAP命令
  15.         ISP_TRIG  = 0;                        //防止ISP/IAP命令誤觸發
  16.         
  17.         ISP_ADDRH = 0xff;                //清0地址高字節
  18.         ISP_ADDRL = 0xff;                //清0地址低字節,指向非EEPROM區,防止誤操作
  19. }

  20. //========================================================================
  21. // 函數: void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
  22. // 描述: 從指定EEPROM首地址讀出n個字節放指定的緩沖.
  23. // 參數: EE_address:  讀出EEPROM的首地址.
  24. //       DataAddress: 讀出數據放緩沖的首地址.
  25. //       number:      讀出的字節長度.
  26. // 返回: non.
  27. // 版本: V1.0, 2022-05-28
  28. //========================================================================

  29. void EEPROM_read_n(u16 EE_address,u8 *DataAddress,u16 number)
  30. {
  31.         ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //設置等待時間,允許ISP/IAP操作,送一次就夠
  32.         ISP_READ();                                                                                        //送字節讀命令,命令不需改變時,不需重新送命令
  33.         
  34.         do
  35.         {
  36.                 ISP_ADDRH = EE_address / 256;                          //送地址高字節(地址需要改變時才需重新送地址)
  37.                 ISP_ADDRL = EE_address % 256;                          //送地址低字節
  38.                 _ISP_TRIG();                                                                        //先送5AH,再送A5H到ISP/IAP觸發寄存器,每次都需要如此
  39.                                                                                                                 //送完A5H后,ISP/IAP命令立即被觸發啟動
  40.                                                                                                                 //CPU等待IAP完成后,才會繼續執行程序。
  41.                 _nop_();
  42.                
  43.                 *DataAddress = ISP_DATA;                                    //讀出的數據送往
  44.                
  45.                 EE_address++;
  46.                 DataAddress++;
  47.         }while(--number);
  48.         
  49.         
  50.         DisableEEPROM();
  51. }


  52. /******************** 扇區擦除函數 *****************/
  53. //========================================================================
  54. // 函數: void EEPROM_SectorErase(u16 EE_address)
  55. // 描述: 把指定地址的EEPROM扇區擦除.
  56. // 參數: EE_address:  要擦除的扇區EEPROM的地址.
  57. // 返回: non.
  58. // 版本: V1.0, 2022-05-28
  59. //========================================================================
  60. void EEPROM_SectorErase(u16 EE_address)
  61. {
  62.                                                                                                                 //只有扇區擦除,沒有字節擦除,512字節/扇區。
  63.                                                                                                                 //扇區中任意一個字節地址都是扇區地址。
  64.         ISP_ADDRH = EE_address / 256;                                  //送扇區地址高字節(地址需要改變時才需重新送地址)
  65.         ISP_ADDRL = EE_address % 256;                                  //送扇區地址低字節
  66.         
  67.         ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //設置等待時間,允許ISP/IAP操作,送一次就夠
  68.         
  69.         ISP_ERASE();                                                                          //送扇區擦除命令,命令不需改變時,不需重新送命令
  70.         
  71.         _ISP_TRIG();                                                                          //先送5AH,再送A5H到ISP/IAP觸發寄存器,每次都需要如此
  72.                                                                                                                 //送完A5H后,ISP/IAP命令立即被觸發啟動
  73.         
  74.         _nop_();
  75.         
  76.         DisableEEPROM();
  77. }

  78. //========================================================================
  79. // 函數: void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
  80. // 描述: 把緩沖的n個字節寫入指定首地址的EEPROM.
  81. // 參數: EE_address:  寫入EEPROM的首地址.
  82. //       DataAddress: 寫入源數據的緩沖的首地址.
  83. //       number:      寫入的字節長度.
  84. // 返回: non.
  85. // 版本: V1.0, 2022-05-28
  86. //========================================================================
  87. void EEPROM_write_n(u16 EE_address,u8 *DataAddress,u16 number)
  88. {
  89.         ISP_CONTR = (ISP_EN + ISP_WAIT_FREQUENCY);        //設置等待時間,允許ISP/IAP操作,送一次就夠
  90.         
  91.         ISP_WRITE();                                                                          //送字節寫命令,命令不需改變時,不需重新送命令
  92.         
  93.         do
  94.         {
  95.                 ISP_ADDRH = EE_address / 256;                          //送地址高字節(地址需要改變時才需重新送地址)
  96.                 ISP_ADDRL = EE_address % 256;                           //送地址低字節
  97.                
  98.                 ISP_DATA  = *DataAddress;                                    //送數據到ISP_DATA,只有數據改變時才需重新送
  99.                
  100.                 _ISP_TRIG();                                                                        //先送5AH,再送A5H到ISP/IAP觸發寄存器,每次都需要如此
  101.                                                                                                                 //送完A5H后,ISP/IAP命令立即被觸發啟動
  102.                
  103.                 _nop_();
  104.                
  105.                 EE_address++;
  106.                 DataAddress++;
  107.         }while(--number);

  108.         DisableEEPROM();
  109. }
復制代碼


STC芯片的IAP版本:IAP15F2K61S2

使用官方IAP示例代碼測試,如代碼所示:

IAP15F2K61S2據說整片Flash都可以模擬EEPROM,地址:0x0000-0xF3FF(測試時需要避開程序空間,測試讀寫地址:0xF200)使用官方IAP示例代碼測試

測試:部分代碼

unsigned char EPR1[20]={0x20,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

寫:

EEPROM_SectorErase(0xF200);                //擦除一個扇區
EEPROM_write_n(0xF200,EPR1,sizeof(EPR1));  //寫

讀:
EEPROM_read_n(0xF200,EPR1,sizeof(EPR1));  //讀出n字節,存放在EPR1數組內
uartWrite(EPR1,sizeof(EPR1));//串口發送


測試結果如圖:

問題:
1,代碼是使用IAP讀寫官方Demo修改,有沒有問題?

2,正常讀出來的數據為0x20,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,但是芯片運行一段時間后,Flash好像無法通過IAP程序再次讀寫了,即讀出來都是0x00,目測壞了,更換新的同型號芯片又沒有問題了(代碼均一致,只是換了新的芯片),但是或者有什么辦法修復一下?還是代碼哪里可以優化一下?又感覺沒壞,因為程序還在正常運行,只是沒辦法通過IAP讀寫Flash,來模擬EEPROM了


PS:正常與非正常的芯片,代碼運行均正常(因為串口發送0x15是用來測試IC的,由此得出芯片其實除了IAP,其他正常),讀寫次數最多也沒超過100次,地址均為0xF200,且沒有與程序區沖突,就壞了


沒有遇到過類似無法IAP讀寫的問題,分享一下!


1正常.png
2非正常.png
回復

使用道具 舉報

ID:526108 發表于 2022-10-5 15:47 | 顯示全部樓層
http://www.zg4o1577.cn/bbs/dpj-223265-1.html
用這軟件生成通用型EEPROM函數,簡單明了
回復

使用道具 舉報

ID:213173 發表于 2022-10-5 16:56 | 顯示全部樓層
所有端口初始化為準雙向口試試,以前用IAP15F4K58S4吃過苦頭。
        P0M0 = 0x00;
        P0M1 = 0x00;
        P1M0 = 0x00;
        P1M1 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
        P3M0 = 0x00;
        P3M1 = 0x00;
        P4M0 = 0x00;
        P4M1 = 0x00;
        P5M0 = 0x00;
        P5M1 = 0x00;
        P6M0 = 0x00;
        P6M1 = 0x00;
        P7M0 = 0x00;
        P7M1 = 0x00;
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区在线播放 | 精品久草 | 国产精品成人久久久久 | 亚洲导航深夜福利涩涩屋 | 特级生活片 | 中文字幕在线免费 | 一级毛片视频 | 超碰在线亚洲 | 在线观看免费av网 | 日韩一区二区福利视频 | 日韩一区二区三区在线视频 | 伊人狠狠干| 999久久久久久久 | 成人久草| 欧美日韩一区二区在线 | av三级在线观看 | 在线视频成人 | 久久久国产精品入口麻豆 | 黑人精品欧美一区二区蜜桃 | 91亚洲国产成人久久精品网站 | 中文字幕在线一区二区三区 | 成人福利网 | 久久久免费少妇高潮毛片 | 色屁屁在线观看 | 狠狠ri | 91高清在线观看 | 国产精品a久久久久 | 在线毛片网 | 国产福利资源 | 国产美女h视频 | 日韩精品一区二区三区四区视频 | 超碰在线97国产 | 激情av | 一级毛片视频在线 | www.干| 日本一区二区三区四区 | 91毛片在线看 | 欧美一级在线观看 | 色永久| 欧美成人精品一区二区三区 | 日韩在线精品视频 |