AT24C02跨頁寫數據


AT24C02

EEPROM的寫數據分為:字節寫數據模式和頁寫數據模式;字節寫就是一個地址一個數據的寫,頁寫是連續寫數據,一個地址多個數據的寫,但是頁寫不能自動跨頁,如果超出一頁長度,超出的數據會覆蓋原先寫入的數據。

跨頁寫數據實現方法:通過IIC讀寫AT24C02,百度上面有一大堆例程。但向AT24C02寫一個字符串時,例程上基本上都是以頁寫的形式呈現。頁寫入的方式只能寫滿一頁,不能跨頁繼續寫。

 在此補充一個實現跨頁寫的函數,希望可以幫助到大家:

 

#define Page_Byte 8 //頁字節8個

 #define Max_Addr 0xff   //最大可訪問地址

 unsigned char AT24C02_Write(unsigned char WriteAddr,unsigned char* buffer) 

{ 

  unsigned short int BufSize = strlen(buffer); //獲取要寫入的字符串長度

   if((Max_Addr-WriteAddr) < BufSize) //空間不足返回0 

   return 0; 

  I2C_Start(); //發I2C起始信號

  I2C_Send_Byte(0XA0); //寫器件地址

  I2C_Wait_Ack(); //等待應答信號

  I2C_Send_Byte(WriteAddr); //發送地址

  I2C_Wait_Ack(); //等待應答信號

  while(*buffer++ != 0) 

  { 

    I2C_Send_Byte(*buffer); //發送數據

    I2C_Wait_Ack(); //等待應答信號

    WriteAddr++; //寫入地址加1 

    if(WriteAddr % Page_Byte == 0) //新的一頁

    { 

      I2C_Stop(); 

      delay_24c02();// AT24C02的寫入周期是5ms,延時一定要大於或者等於5ms 

      I2C_Start(); 

      I2C_Send_Byte(0XA0); 

      I2C_Wait_Ack(); //等待應答信號

      I2C_Send_Byte(WriteAddr); //發送地址

      I2C_Wait_Ack(); //等待應答信號

    } 

  } 

    I2C_Stop(); 

    delay_24c02(); 

    return 1; 

} 

 

在上面的代碼中,有兩個宏定義,第一個是一頁可以寫入的字節。在進行頁寫入的時候,比如寫到了地址0x08,那么我們就要對這個地址進行判斷,因為0x08已經是新的一頁,所以 我們就要給一個停止信號,重新開始一次IIC通信,如何判斷一個地址是否是新的一頁,就是通過if(WriteAddr % Page_Byte == 0)這條語句實現的。

第二個宏定義是最大可寫入地址,當寫入的字節數大於剩余的可寫入空間時,就可以通過if((Max_Addr-WriteAddr) < BufSize)這條語句實現,這樣的代碼更加規范、安全。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM