2023-05-03 05:28 AM
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
2024-03-14 03:25 AM
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; }