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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1797|回復: 0
打印 上一主題 下一主題
收起左側

CAV24C64 EEPROM底層讀寫代碼分享

[復制鏈接]
跳轉到指定樓層
樓主
ID:626239 發(fā)表于 2019-10-18 16:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
提供了單片機外部存儲芯片EEPROM的底層讀寫的代碼,不足之處請指點

單片機源程序如下:
  1. // =============================== EEPROM 說明 ===============================//
  2. /*******************************************************************************
  3.         The CAV24C64 is a 64.Kb CMOS Serial EEPROM device,
  4.         internally organized as 8192 words of 8 bits each.
  5.         It features a 32.byte page write buffer and supports the Standard
  6.         (100 kHz) and Fast (400 kHz) I2C protocol.
  7.         External address pins make it possible to address up to eight
  8.         CAV24C64 devices on the same bus.
  9. *******************************************************************************/
  10. // Page Range:0x00 - 0xFF
  11. // Page Write Buffer range:0x00 - 0x01F
  12. // 寫數據和讀數據之間需要有5ms的延時



  13. #include "Common_Hdf_Address.h"
  14. #include STD_DEFS_H
  15. #include MAIN_H
  16. #include IO_H
  17. #include HW_GPT_COMMON_H
  18. #include EEPROM_H

  19. #include DBG_MAIN_H

  20. u8 bufWrite[32];
  21. u8 bufRead[32];

  22. // 函數名稱:set_sdaDir(u8 dir)
  23. // 函數說明:設置SDA數據線方向(利用普通IO實現IIC,需要手動設置數據線的方向)

  24. void set_sdaDir(u8 dir)
  25. {
  26.         switch(dir)
  27.         {
  28.                 case output: sdaDir |= 0x00C0; break;
  29.                 case input:         sdaDir &= 0xFF7F; break;
  30.                 default:
  31.                         break;
  32.         }
  33. }
  34. // 函數名稱:EEPROM_I2C_Start_v()
  35. // 函數說明:IIC start

  36. void EEPROM_I2C_Start_v()
  37. {
  38.         FUN_HW_Time_Delayus(1);       
  39.         set_sdaDir(output);                                // 設置SDA數據線方向為輸出
  40.         eepromSDA_OUT = 1;                                // 設置SDA為高電平
  41.         eepromSCL = 1;                                        // 設置SCL為高電平
  42.         FUN_HW_Time_Delayus(1);                        // SDA和SCL至少保持高電平4.7us
  43.         eepromSDA_OUT = 0;                            // 設置SDA為低電平,此時SCL為高電平,SDA由高電平變?yōu)榈碗娖,觸發(fā)開始條件
  44.         FUN_HW_Time_Delayus(1);                    // SDA置低后,SCL至少保持4us的高電平時間
  45.         eepromSCL = 0;                                        // 設置SCL為低電平,防止數據誤入;I2C總線空閑時,SDA和SCL均為高電平
  46. }                                               

  47. // 函數名稱:eeprom_I2C_Stop_v()
  48. // 函數說明:IIC stop

  49. void EEPROM_I2C_Stop_v()
  50. {
  51.         FUN_HW_Time_Delayus(1);
  52.         set_sdaDir(output);                                // 設置SDA數據線方向為輸出
  53.         eepromSDA_OUT = 0;                                // 設置SDA為高電平
  54.         eepromSCL = 1;                                        // 設置SCL為高電平
  55.         FUN_HW_Time_Delayus(1);       
  56.         eepromSDA_OUT = 1;                            // 設置SDA為高電平,此時SCL為高電平,SDA由低電平變?yōu)楦唠娖,觸發(fā)停止條件
  57.         FUN_HW_Time_Delayus(1);       
  58.         eepromSCL = 0;
  59. }

  60. // 函數名稱:EEPROM_I2C_readASK()
  61. // 函數說明:I2C讀取ACK信號(主設備寫數據時使用)

  62. void EEPROM_I2C_readASK()
  63. {
  64.         FUN_HW_Time_Delayus(1);
  65.         set_sdaDir(input);
  66.         eepromSCL = 0;                                // 設置SCL為低電平
  67.         FUN_HW_Time_Delayus(1);
  68.         eepromSCL = 1;                                // 設置SCL為高電平
  69.         FUN_HW_Time_Delayus(1);
  70.         eepromSCL = 0;
  71. }

  72. // 函數名稱:eeprom_I2C_sendASK()
  73. // 函數說明:I2C寫入ACK信號(主設備讀數據時使用)

  74. void EEPROM_I2C_sendASK()
  75. {
  76.         FUN_HW_Time_Delayus(1);
  77.         set_sdaDir(output);                        // 設置SDA數據線方向為輸出
  78.         eepromSCL = 0;                                // 設置SCL為低電平
  79.         eepromSDA_OUT = 0;
  80.         FUN_HW_Time_Delayus(1);               
  81.         eepromSCL = 1;
  82. }

  83. // 函數名稱:EEPROM_I2C_writeByte(u8 byte)
  84. // 函數說明:寫數據
  85. void EEPROM_I2C_writeByte(u8 byte)
  86. {
  87.         u8 i;
  88.         FUN_HW_Time_Delayus(1);
  89.         eepromSCL = 0;
  90.         set_sdaDir(output);                        // 設置SDA數據線方向為輸出
  91.         for (i = 0; i < 8; i ++)
  92.         {
  93.                 if (byte & 0x80) eepromSDA_OUT = 1;
  94.                 else eepromSDA_OUT = 0;
  95.                 eepromSCL = 1;
  96.                 FUN_HW_Time_Delayus(1);
  97.                 eepromSCL = 0;
  98.                 FUN_HW_Time_Delayus(1);               
  99.                 byte <<= 1;
  100.         }
  101.         EEPROM_I2C_readASK();
  102. }


  103. // 函數名稱:EEPROM_I2C_readByte()
  104. // 函數說明:讀數據
  105. u8 EEPROM_I2C_readByte(u8 ask)
  106. {
  107.         u8 i;
  108.         u8 tempSDA_Read = 0;
  109.         FUN_HW_Time_Delayus(1);
  110.         set_sdaDir(input);                        // 設置SDA數據線方向為輸入
  111.         for (i = 0; i < 8; i ++)
  112.         {
  113.                 tempSDA_Read <<= 1;
  114.                 FUN_HW_Time_Delayus(1);
  115.                 eepromSCL = 1;                        // 設置SCL為高電平
  116.                 FUN_HW_Time_Delayus(1);
  117.                 tempSDA_Read |= (u8)eepromSDA_IN;
  118.                 eepromSCL = 0;                        // 設置SCL為低電平

  119.                
  120.         }
  121.         set_sdaDir(output);
  122.         eepromSDA_OUT = ask;
  123.         FUN_HW_Time_Delayus(1);
  124.         eepromSCL = 1;
  125.         FUN_HW_Time_Delayus(1);
  126.         eepromSCL = 0;
  127.         eepromSDA_OUT = 1;
  128.         return tempSDA_Read;
  129. }

  130. // 函數名稱:void EEPROM_I2C_write_oneByte(u8 addrH, u8 addrL, u8 One_ByteData)
  131. // 函數說明:寫單字節(jié)數據
  132. void EEPROM_I2C_write_oneByte(u8 addrH, u8 addrL, u8 One_ByteData)
  133. {
  134.         EEPROM_I2C_Start_v();
  135.         EEPROM_I2C_writeByte(0xA0);
  136.         EEPROM_I2C_writeByte(addrH);
  137.         EEPROM_I2C_writeByte(addrL);
  138.         EEPROM_I2C_writeByte(One_ByteData);
  139.         EEPROM_I2C_Stop_v();
  140. }
  141. // 函數名稱:u8 eeprom_I2C_read_oneByte(u8 addrH, u8 addrL)
  142. // 函數說明:讀單字節(jié)數據
  143. u8 EEPROM_I2C_read_oneByte(u8 addrH, u8 addrL)
  144. {
  145.         u8 receiveData;
  146.         EEPROM_I2C_Start_v();
  147.         EEPROM_I2C_writeByte(0xA0);
  148.         EEPROM_I2C_writeByte(addrH);
  149.         EEPROM_I2C_writeByte(addrL);
  150.         EEPROM_I2C_Stop_v();
  151.         EEPROM_I2C_Start_v();
  152.         EEPROM_I2C_writeByte(0xA1);
  153.         receiveData = EEPROM_I2C_readByte(1);
  154.         return (receiveData);
  155. }


  156. // 函數名稱:void EEPROM_I2C_write_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufWrite, u8 length)
  157. // 函數說明:寫多字節(jié)數據
  158. //                          pageAddr:頁地址;byteAddr:字節(jié)地址;buf:寫緩沖區(qū);length:字節(jié)長度
  159. void EEPROM_I2C_write_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufWrite, u8 length)
  160. {
  161.         u8 i;
  162.         u8 addrH = 0;
  163.         u8 addrL = 0;
  164.         addrH = (pageAddr >> 3);
  165.         addrL = (pageAddr << 5);
  166.         addrL |=  byteAddr;
  167.         EEPROM_I2C_Start_v();
  168.         EEPROM_I2C_writeByte(0xA0);
  169.         EEPROM_I2C_writeByte(addrH);
  170.         EEPROM_I2C_writeByte(addrL);
  171.         if(length > 32) length = 32;
  172.         for (i = 0; i < length; i ++)
  173.         {
  174.                 EEPROM_I2C_writeByte(bufWrite[i]);
  175.                 FUN_HW_Time_Delayus(1);                       
  176.         }
  177.         EEPROM_I2C_Stop_v();
  178.        
  179. //        p_tx[0] = (u8)(pageAddr);
  180. //        p_tx[1] = (u8)(byteAddr);
  181. //        p_tx[2] = (u8)(length);
  182. //        p_tx[3] = (u8)(*bufWrite);
  183. //        p_tx[4] = (u8)(*(bufWrite+1));
  184. //        p_tx[5] = (u8)(*(bufWrite+2));
  185. //        p_tx[6] = (u8)(*(bufWrite+3));
  186. //        p_tx[7] = (u8)(*(bufWrite+4));

  187. //        FUN_CAN_DBG_send_OBJ_i(21,p_tx);

  188. }


  189. // 函數名稱:EEPROM_I2C_read_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufRead, u8 length)
  190. // 函數說明:讀多字節(jié)數據
  191. //                          pageAddr:頁地址;byteAddr:字節(jié)地址;buf:讀緩沖區(qū);length:字節(jié)長度
  192. void EEPROM_I2C_read_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufRead, u8 length)
  193. {
  194.         u8 i;
  195.         u8 addrH = 0;
  196.         u8 addrL = 0;

  197.         addrH = (pageAddr >> 3);
  198.         addrL = (pageAddr << 5);
  199.         addrL |=  byteAddr;
  200.         EEPROM_I2C_Start_v();
  201.         EEPROM_I2C_writeByte(0xA0);
  202.         EEPROM_I2C_writeByte(addrH);
  203.         EEPROM_I2C_writeByte(addrL);
  204.         EEPROM_I2C_Stop_v();
  205.         EEPROM_I2C_Start_v();
  206.         EEPROM_I2C_writeByte(0xA1);
  207.         if(length > 32) length = 32;
  208.         for (i = 0; i < length - 1; i ++)
  209.         {
  210.                 bufRead[i] = (~ EEPROM_I2C_readByte(0));
  211.         }
  212.         bufRead[i] = (~ EEPROM_I2C_readByte(1));
  213.         EEPROM_I2C_Stop_v();

  214. //        p_tx[0] = (u8)(pageAddr);
  215. //        p_tx[1] = (u8)(byteAddr);
  216. //        p_tx[2] = (u8)(length);
  217. //        p_tx[3] = (u8)(*bufRead);
  218. //        p_tx[4] = (u8)(*(bufRead+1));
  219. //        p_tx[5] = (u8)(*(bufRead+2));
  220. //        p_tx[6] = (u8)(*(bufRead+3));
  221. //        p_tx[7] = (u8)(*(bufRead+4));

  222. //        FUN_CAN_DBG_send_OBJ_i(21,p_tx);

  223. }
  224. // 函數名稱:EEPROM_vEraseDataBlock(void)
  225. // 函數說明:擦除數據,一共256頁,從第0頁到第255頁,每頁32個字節(jié),從第0個字節(jié)到第31個字節(jié)
  226. //                           pageAddr: 頁地址; byteAddr: 字節(jié)地址; byteNum: 從byteAddr開始,擦除的字節(jié)數
  227. void EEPROM_vEraseDataBlock(u8 pageAddr, u8 byteAddr, u8 byteNum)
  228. {
  229.         u8 i;
  230.         u8 addrH = 0;
  231.         u8 addrL = 0;
  232.         addrH = (pageAddr >> 3);
  233.         addrL = (pageAddr << 5);
  234.         addrL |=  byteAddr;
  235.         EEPROM_I2C_Start_v();
  236.         EEPROM_I2C_writeByte(0xA0);
  237.         EEPROM_I2C_writeByte(addrH);
  238.         EEPROM_I2C_writeByte(addrL);
  239.         if(byteNum > 32) byteNum = 32;
  240.         for (i = 0; i < byteNum; i ++)
  241.         {
  242.                 EEPROM_I2C_writeByte(0xFF);
  243.                 FUN_HW_Time_Delayus(10);                       
  244.         }
  245.         EEPROM_I2C_Stop_v();
  246. }
復制代碼

所有資料51hei提供下載:
EEPROM——CAV24C64讀寫代碼.zip (2.39 KB, 下載次數: 9)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区网站 | 国产精品久久欧美久久一区 | 亚洲一区中文字幕在线观看 | 久久久久久久97 | www.99re| 天天操天天天 | 四虎影院新地址 | 一区二区不卡高清 | 国产精品久久久久久亚洲调教 | 国产va | 黄色男女网站 | 亚洲国产精品日本 | 欧美日韩在线一区二区三区 | 久久人人爽人人爽人人片av免费 | 毛片免费观看 | 黄色网址在线播放 | 国产精品视频一二三区 | 天天爽夜夜骑 | 免费观看黄a一级视频 | 精品久久久久久久久亚洲 | 中文久久 | 在线观看亚洲专区 | 97高清国语自产拍 | 久久久蜜臀国产一区二区 | 欧美 日本 国产 | 欧美久久久久久 | 日韩午夜在线播放 | 一区二区高清不卡 | 国产伦精品一区二区三区四区视频 | 国产一级片久久久 | 日韩在线视频观看 | 亚洲高清一区二区三区 | 9久久精品 | 一区二区视频在线 | 国产高清精品一区二区三区 | 亚洲一二三区在线观看 | 亚洲一区高清 | 视频一二三区 | 四虎在线观看 | 人人操日日干 | 国产精品成人一区二区 |