亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

CAV24C64 EEPROM底層讀寫代碼分享

[復(fù)制鏈接]
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. // 寫數(shù)據(jù)和讀數(shù)據(jù)之間需要有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. // 函數(shù)名稱:set_sdaDir(u8 dir)
  23. // 函數(shù)說明:設(shè)置SDA數(shù)據(jù)線方向(利用普通IO實現(xiàn)IIC,需要手動設(shè)置數(shù)據(jù)線的方向)

  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. // 函數(shù)名稱:EEPROM_I2C_Start_v()
  35. // 函數(shù)說明:IIC start

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

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

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

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

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

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

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

  83. // 函數(shù)名稱:EEPROM_I2C_writeByte(u8 byte)
  84. // 函數(shù)說明:寫數(shù)據(jù)
  85. void EEPROM_I2C_writeByte(u8 byte)
  86. {
  87.         u8 i;
  88.         FUN_HW_Time_Delayus(1);
  89.         eepromSCL = 0;
  90.         set_sdaDir(output);                        // 設(shè)置SDA數(shù)據(jù)線方向為輸出
  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. // 函數(shù)名稱:EEPROM_I2C_readByte()
  104. // 函數(shù)說明:讀數(shù)據(jù)
  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);                        // 設(shè)置SDA數(shù)據(jù)線方向為輸入
  111.         for (i = 0; i < 8; i ++)
  112.         {
  113.                 tempSDA_Read <<= 1;
  114.                 FUN_HW_Time_Delayus(1);
  115.                 eepromSCL = 1;                        // 設(shè)置SCL為高電平
  116.                 FUN_HW_Time_Delayus(1);
  117.                 tempSDA_Read |= (u8)eepromSDA_IN;
  118.                 eepromSCL = 0;                        // 設(shè)置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. // 函數(shù)名稱:void EEPROM_I2C_write_oneByte(u8 addrH, u8 addrL, u8 One_ByteData)
  131. // 函數(shù)說明:寫單字節(jié)數(shù)據(jù)
  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. // 函數(shù)名稱:u8 eeprom_I2C_read_oneByte(u8 addrH, u8 addrL)
  142. // 函數(shù)說明:讀單字節(jié)數(shù)據(jù)
  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. // 函數(shù)名稱:void EEPROM_I2C_write_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufWrite, u8 length)
  157. // 函數(shù)說明:寫多字節(jié)數(shù)據(jù)
  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. // 函數(shù)名稱:EEPROM_I2C_read_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufRead, u8 length)
  190. // 函數(shù)說明:讀多字節(jié)數(shù)據(jù)
  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. // 函數(shù)名稱:EEPROM_vEraseDataBlock(void)
  225. // 函數(shù)說明:擦除數(shù)據(jù),一共256頁,從第0頁到第255頁,每頁32個字節(jié),從第0個字節(jié)到第31個字節(jié)
  226. //                           pageAddr: 頁地址; byteAddr: 字節(jié)地址; byteNum: 從byteAddr開始,擦除的字節(jié)數(shù)
  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. }
復(fù)制代碼

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


評分

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

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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