单片机 > 单片机程序设计 > 详情

AT24C128 EEPROM的读写

发布时间:2024-12-12 发布时间:
|

记录AT24C128 eeprom的多字节读写

  1. #define _EEPROM_DEBUG_LEVEL 0  

  2.           

  3. #if _EEPROM_DEBUG_LEVEL == 1  

  4.          #defineEEPROM_DEBUG(fmt,args...) do{ \  

  5.                    printf(fmt,##args);\  

  6.          }while(0)  

  7. #elif _EEPROM_DEBUG_LEVEL == 2  

  8.          #defineEEPROM_DEBUG(fmt,args...) do{ \  

  9.                    printf("%s:line:%d->",__FUNCTION__,__LINE__); \  

  10.                    printf(fmt,##args);\  

  11.          }while(0)  

  12. #elif _EEPROM_DEBUG_LEVEL == 0  

  13.          #defineEEPROM_DEBUG(fmt,args...)  

  14. #else  

  15.          #defineEEPROM_DEBUG(fmt,args...)  

  16. #endif  



[cpp] view plain copy

  1. #define AT24C128_PAGE_SIZE 64  

  2. #define AT24C128_PAGE_COUNT 256  

  3. #define AT24C128_BYTE_SIZE 16*1024  

  4. #define AT24C128_WADDR 0xA0  

  5. #define AT24C128_RADDR 0xA1  


写时序:




  1. ///  

  2. //// wrtie eeprom by page  

  3. ////  

  4. int writeE2promByPage(u32 startaddr,void* data,u32 len){  

  5.       

  6.     int retry=0,pageCnt =0,i=0,j=0,k =0;  

  7.     u32 temp1=0,temp2=0,temp3=0,start=0,startPage;  

  8.     u8 * pBuf;  

  9.     pBuf = (u8*)data;  

  10.     temp1 = startaddr % AT24C128_PAGE_SIZE;  

  11.     temp2 = len % AT24C128_PAGE_SIZE;  

  12.     temp3 = len / AT24C128_PAGE_SIZE;  

  13.     startPage = startaddr / AT24C128_PAGE_SIZE;  

  14.     if(temp1 ==0){  

  15.         if(temp2 !=0) pageCnt = temp3 + 2;  

  16.         else pageCnt = temp3 + 1;  

  17.     }  

  18.     else  

  19.     {  

  20.         if(temp2 !=0) pageCnt = temp3 + 3;  

  21.         else pageCnt = temp3 + 2;  

  22.     }  

  23.       

  24.     if(pageCnt > AT24C128_PAGE_COUNT) return -1;  

  25.     EEPROM_DEBUG("pageCnt %d \r\n",pageCnt);  

  26.     for(i=0;i

  27.         //start signal !!!  

  28.         while(SCCB_Start() ==0){  

  29.             if(retry > 100) {  

  30.                 EEPROM_DEBUG("start fail \r\n");  

  31.                 return -1;  

  32.             }  

  33.             retry++;  

  34.         }  

  35.         if(i == 0){  

  36.             start = startaddr;  

  37.             temp1 = AT24C128_PAGE_SIZE - startaddr;  

  38.         }  

  39.         else{  

  40.             start = (startPage + i) * AT24C128_PAGE_SIZE;  

  41.             temp1 = AT24C128_PAGE_SIZE;  

  42.         }  

  43.         EEPROM_DEBUG("start:%d \r\n",start);  

  44.         EEPROM_DEBUG("temp1:%d \r\n",temp1);  

  45.         //write slave addr  

  46.         SCCB_writeByte(AT24C128_WADDR);  

  47.         if(SCCB_Wait_Ack() == 0){  

  48.               EEPROM_DEBUG("write addr fail \r\n");  

  49.                 SCCB_Stop();  

  50.                 goto _end;  

  51.         }  

  52.         //write page high addr  

  53.         SCCB_writeByte(start / 256 );  

  54.         if(SCCB_Wait_Ack() == 0){  

  55.               EEPROM_DEBUG("write high page addr fail \r\n");  

  56.                 SCCB_Stop();  

  57.                 goto _end;  

  58.         }  

  59.         //write page low addr  

  60.         SCCB_writeByte(start % 256 );  

  61.         if(SCCB_Wait_Ack() == 0){  

  62.                 EEPROM_DEBUG("write low page addr fail \r\n");  

  63.                 SCCB_Stop();  

  64.                 goto _end;  

  65.         }  

  66.         //write date  

  67.         for(j = 0; j 

  68.             SCCB_writeByte(pBuf[k]);  

  69.             //write operation need slave response ack  

  70.             if(SCCB_Wait_Ack() == 0){  

  71.                 EEPROM_DEBUG("write data fail \r\n");  

  72.                 SCCB_Stop();  

  73.                 goto _end;  

  74.             }  

  75.             else{  

  76.                 k++;  

  77.             }  

  78.             if( k == len){  

  79.                 SCCB_Stop();  

  80.                 goto _end;  

  81.             }  

  82.         }  

  83.         EEPROM_DEBUG("page %d write success \r\n",i);  

  84.         //stop  

  85.         SCCB_Stop();  

  86.         SCCB_Delay(SCL_TIME_US);  

  87.     }  

  88. _end:  

  89.     return k;  

  90. }  


读取时序参考:




注意:Sequential read的时序图并不是完整的,根据文档描述Sequential read时序需要加上random的头!

即start -> slave waddr ->high addr -> low addr ->startagain ->slave raddr -> read n byte -> stop

注意写时候是wait ack ,需要eeprom回复!而读取的时候master只需要发送ack即可,读取的最后一个字节要发送的是noack。


  1. /* 

  2. *SEQUENTIAL READ,can read multi byte!!! 

  3. */  

  4. int readE2promBySeq(u32 startaddr,void* data,u32 len){  

  5.         int retry=0,j=0;  

  6.         u8 * pBuf;  

  7.         pBuf = (u8*)data;  

  8.      //startc signal  

  9.       SCCB_Delay(SCL_TIME_US);  

  10.         while(SCCB_Start() ==0){  

  11.                 if(retry > 100){   

  12.                     EEPROM_DEBUG("start fail \r\n");  

  13.                     return -1;  

  14.                 }  

  15.                 retry++;  

  16.         }  

  17.             //write slave w addr  

  18.         SCCB_writeByte(AT24C128_WADDR);  

  19.         if(SCCB_Wait_Ack() == 0){  

  20.                 EEPROM_DEBUG("write slave w addr fail \r\n");  

  21.                 SCCB_Stop();  

  22.                 goto _end;  

  23.         }  

  24.         //write high addr   

  25.         SCCB_writeByte(startaddr / 256 );  

  26.         if(SCCB_Wait_Ack() == 0){  

  27.             EEPROM_DEBUG("write h addr fail \r\n");  

  28.             SCCB_Stop();  

  29.             goto _end;  

  30.         }  

  31.         //write low addr  

  32.         SCCB_writeByte(startaddr % 256 );  

  33.         if(SCCB_Wait_Ack() == 0){  

  34.             EEPROM_DEBUG("write l addr fail \r\n");  

  35.             SCCB_Stop();  

  36.             goto _end;  

  37.         }  

  38.         //start again  

  39.         retry = 0;  

  40.         while(SCCB_Start() ==0){  

  41.                 if(retry > 100){   

  42.                     EEPROM_DEBUG("start fail \r\n");  

  43.                     return -1;  

  44.                 }  

  45.                 retry++;  

  46.         }  

  47.         //write slave read addr  

  48.         SCCB_writeByte(AT24C128_RADDR);  

  49.         if(SCCB_Wait_Ack() == 0){  

  50.                     EEPROM_DEBUG("write r addr fail \r\n");  

  51.                     SCCB_Stop();  

  52.                     goto _end;  

  53.         }  

  54.       

  55.         //read data  

  56.         for(j = 0; j 

  57.             pBuf[j] = SCCB_readByte();  

  58.             if(j 

  59.                 //read operation ,master just send ack ,no response  

  60.                 SCCB_Ack();  

  61.             }  

  62.         }  

  63.         SCCB_noAck();  

  64.         SCCB_Stop();  

  65. _end:  

  66.     return j;  

  67. }  





『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32学习笔记4:外部中断