Eeprom Page Write

Başlatan robikod, 02 Temmuz 2021, 09:58:15

robikod

Herkese merhaba,
M24C64 eeprom IC'sini stm32 f4 ile birlikte kullanıyordum normalde byte byte yazıyordum ancak bu kez page yazmaya karar verdim. Biraz kafam karışmış durumda, her page benim IC'ye göre 32 byte aşağıdaki linktekine göre de 8 byte içeriyor .https://www.programmersought.com/article/11154052424/
Burada mesela page'deki adrese yazmış, page'in belirli kısmına data yazabiliyor muyuz ? Komple tamamına mı yazmamız gerekiyor bu kısmı anlayamadım. Daha önce uğraşmış olan varsa yardımcı olabilr mi?


/**
     * @brief write the data in the buffer to I2C EEPROM
  * @param   
     * @arg pBuffer: buffer pointer
     * @arg WriteAddr: write address
     * @arg NumByteToWrite: the number of bytes written
     * @retval None
  */
void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)
{
  u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;
 
  Addr = WriteAddr % I2C_PageSize;
  count = I2C_PageSize - Addr;
  NumOfPage =  NumByteToWrite / I2C_PageSize;
  NumOfSingle = NumByteToWrite % I2C_PageSize;
 
  /* If WriteAddr is I2C_PageSize aligned  */
  if(Addr == 0) 
  {
    /* If NumByteToWrite < I2C_PageSize */
    if(NumOfPage == 0) 
    {
      I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
      I2C_EE_WaitEepromStandbyState();
    }
    /* If NumByteToWrite > I2C_PageSize */
    else  
    {
      while(NumOfPage--)
      {
        I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize); 
    	I2C_EE_WaitEepromStandbyState();
        WriteAddr +=  I2C_PageSize;
        pBuffer += I2C_PageSize;
      }
 
      if(NumOfSingle!=0)
      {
        I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
        I2C_EE_WaitEepromStandbyState();
      }
    }
  }
  /* If WriteAddr is not I2C_PageSize aligned  */
  else 
  {
    /* If NumByteToWrite < I2C_PageSize */
    if(NumOfPage== 0) 
    {
      I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
      I2C_EE_WaitEepromStandbyState();
    }
    /* If NumByteToWrite > I2C_PageSize */
    else
    {
      NumByteToWrite -= count;
      NumOfPage =  NumByteToWrite / I2C_PageSize;
      NumOfSingle = NumByteToWrite % I2C_PageSize;	
      
      if(count != 0)
      {  
        I2C_EE_PageWrite(pBuffer, WriteAddr, count);
        I2C_EE_WaitEepromStandbyState();
        WriteAddr += count;
        pBuffer += count;
      } 
      
      while(NumOfPage--)
      {
        I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
        I2C_EE_WaitEepromStandbyState();
        WriteAddr +=  I2C_PageSize;
        pBuffer += I2C_PageSize;  
      }
      if(NumOfSingle != 0)
      {
        I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle); 
        I2C_EE_WaitEepromStandbyState();
      }
    }
  }  
}

Tagli

#1
Bu tür bilgiler cihaz modeline göre değişebilir. O yüzden bir yerde denk geldiğin EEPROM kodunun senin cihazın için de uygun olacağını varsayma.

İnternette M24C64 diye aratıp çıkan ilk datasheet'e tıkladım. Orada page boyutu 32 byte gözüküyor. Bir page içinde 1-32 arası herhangi bir miktarda veriyi tek seferde yazabiliyorsun. Yani mesela 10 byte da yazabilirsin tek seferde. Ancak yazacağın veriler page sınırını geçmemeli, yoksa page'in başında senin istemediğin yerlerin üzerine yazıyor. Kısaca baktığım kadarıyla bunları anladım.

Ama dediğim gibi, modele göre işleyiş değişebilir. Elindeki parçanın doğru datasheet'ini bulduğundan emin ol. Ayrıca, internette denk geldiğin kodlar kesin doğrudur diye bir şey de yok. Yazar hata yapmış da olabilir.
Gökçe Tağlıoğlu

hasankara

Alıntı yapılan: robikod - 02 Temmuz 2021, 09:58:15page'in belirli kısmına data yazabiliyor muyuz ? Komple tamamına mı yazmamız gerekiyor
belirli kısmına data yazılabiliyor ancak dikkat edilmesi gereken başka husus daha var, page kadar işlem yapmak için page ilk byte dan başlamak gerekiyor. örnek olarak ortasından başlanırsa en fazla page nin kalan yarısı okunabilir.

Tagli

Alıntı yapılan: hasankara - 02 Temmuz 2021, 13:12:03örnek olarak ortasından başlanırsa en fazla page nin kalan yarısı okunabilir.
Benim anladığım kadarıyla bu kısıtlama sadece yazarken var, okurken değil. Yanılıyor olabilirim tabi, dokümanı çok alıcı gözüyle incelemedim.
Gökçe Tağlıoğlu

robikod

Yardımlarınız için teşekkürler

hasankara

Evet okuma için gerek olmayabilir, bende hatırlayamadım. Yazdığım kodları incelediğimde ben yazmada da okumada da aynı page senaryosunu uyguladığımı görüyorum. Yeri gelmişken yine bir konudan daha bahsedeyim, yazma yaparken her page yazma işleminden sonraki page yazma işlemleri ile arasında gecikme olması gerekiyor. Yoksa önceki yazma işlemi tamamlanmamış oluyor. Ben notlarıma baktığım zaman /* sayfa boyutu kadar milisaniye cinsinden beklenmelidir*/ şeklinde yazmışım.