Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: robikod - 02 Temmuz 2021, 09:58:15

Başlık: Eeprom Page Write
Gönderen: robikod - 02 Temmuz 2021, 09:58:15
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();
      }
    }
  } 
}
Başlık: Ynt: Eeprom Page Write
Gönderen: Tagli - 02 Temmuz 2021, 10:39:18
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 (https://www.st.com/resource/en/datasheet/m24c64-df.pdf)'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.
Başlık: Ynt: Eeprom Page Write
Gönderen: hasankara - 02 Temmuz 2021, 13:12:03
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.
Başlık: Ynt: Eeprom Page Write
Gönderen: Tagli - 02 Temmuz 2021, 14:25:07
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.
Başlık: Ynt: Eeprom Page Write
Gönderen: robikod - 02 Temmuz 2021, 15:22:39
Yardımlarınız için teşekkürler
Başlık: Ynt: Eeprom Page Write
Gönderen: hasankara - 03 Temmuz 2021, 20:43:10
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.