cancel
Showing results for 
Search instead for 
Did you mean: 

EEPRMA2 M95 writedata bug?

CBras
Associate

Hi,

I'm using the latest EEPRMA2 drivers for the M95M04 EEPROM.

I'm trying to store data in EEPROM on a specific address.

In the following example, I expect one byte to be written to address 5.

uint8_t a = 10;

uint32_t targetAddr = 5;

EEPRMA2_M95_WriteData(EEPRMA2_M95M04_0, &a, targetAddr , sizeof(a));

Stepping into EEPRMA2_M95_WriteData, we go into M95_spi_WriteData which still has the size of 1, but moving to the step where EEPRMA2_SPI_SendBuffer is called, the size has changed to 6 bytes to be written. It looks like the size is defined from the remainder, which is based on the following equation: ( targetAddress + Size ) % PageSize

I don't see how this can be correct implementation?

Edit: I seems like this person has the same problem https://github.com/STMicroelectronics/X-CUBE-EEPRMA1/issues/4

1 REPLY 1
SikandarLF
Associate III
int32_t M95_spi_WriteData(M95_Object_t *pObj, uint8_t * pData, const uint32_t TarAddr ,
                          const uint16_t PageSize, const uint16_t Size )
{
  int32_t status = M95_OK;
  
  uint32_t targetAddress = TarAddr;
  uint16_t remainingSize = Size;
  
  // Calculate the starting page and offset
  uint16_t startOffset = TarAddr % PageSize;
  uint16_t offset = startOffset;
  
  
  // Check for invalid inputs
  if (pObj == NULL || pData == NULL || PageSize == 0 || remainingSize == 0) {
    return M95_ERROR;  // Return an error code indicating invalid inputs
  } 
  
  if (pObj->IO.IsReady( pObj->IO.Address ) !=M95_OK)
  {
    return M95_ERROR;
  } 
  
  // Iterate over the pages and write the data
  while (remainingSize > 0) 
  {
    uint16_t bytesToWrite = (remainingSize < PageSize - offset) ? remainingSize : (PageSize - offset);
    
    /* Condition Matters only for 4Kb SPI ie M95040, for others EEPROMEX_WRITE & EEPROMEX_UPWRITE are same */
    if (pObj->IO.Address == 0xC6) 
    {          
      if (targetAddress < 256)
      {
        status = pObj->IO.WriteBuffer( pData, targetAddress, pObj->IO.Address, bytesToWrite ,EEPROMEX_WRITE);
      }
      else
      {
        status = pObj->IO.WriteBuffer( pData, targetAddress, pObj->IO.Address, bytesToWrite ,EEPROMEX_UPWRITE);
      }
    }
    else
    {
      status = pObj->IO.WriteBuffer( pData, targetAddress, pObj->IO.Address, bytesToWrite ,EEPROMEX_WRITE);
    }
    
    pObj->IO.Delay(6);
    
    // Update the pointers and sizes for the next page
    pData += bytesToWrite;
    targetAddress += bytesToWrite;
    remainingSize -= bytesToWrite;
    offset = targetAddress % PageSize;
    
    // Wait for the SPI interface to be ready before proceeding to the next page
    while( pObj->IO.IsReady( pObj->IO.Address ) != M95_OK ) {};
  }
  return status;     
}