目前需要优化项目上 EEPROM M95256 的驱动函数,所以看 ST 官方发布的扩展包存在一些疑惑。手里没有 EEPROM 和相应 MCU 板子,想请教一下大佬们。
扩展包下载网址:X-CUBE-EEPRMA1 | Product - 意法半导体STMicroelectronics
在 M95xxx 的代码里 EEPRMA2_M95_ReadPage() 我认为存在问题。
函数路径:en.x-cube-eeprma1\Drivers\BSP\EEPRMA2\eeprma2_m95.c
EEPRMA2_M95_ReadPage() 的参数 TarAddr 如果理解成为 EEPROM 地址,但是在读取操作的时候又乘以页的大小,我认为在这里是有问题的。
- M95PageSize 是 EEPROM 每一页的总字节值
- 看了 M95Drv[Instance]->ReadPage() 函数内部逻辑,填充的参数 iPageAddress 应该是 EEPROM 地址
[C] 纯文本查看 复制代码 /**
* @brief Reads complete page from the memory at page start address
* @param Instance : SPI EEPROMs instance to be used
* @param pData : pointer to the data to read
* @param TarAddr : starting page address to read
* @param Size : Size in bytes of the value to be Read
* @retval BSP status
*/
int32_t EEPRMA2_M95_ReadPage(uint32_t Instance, uint8_t * pData, const uint32_t TarAddr, const uint16_t Size)
{
int32_t ret = BSP_ERROR_NONE;
EEPRMA2_M95MemorySizeLocator(Instance);
if ((((uint64_t)TarAddr + (uint64_t)Size) > M95MemorySize) || (M95PageSize == 0U))
{
return BSP_ERROR_WRONG_PARAM;
}
uint32_t iNumberOfPage = (TarAddr + Size) / M95PageSize;
uint32_t iRemainder = (TarAddr + Size) % M95PageSize;
uint32_t PageAddress = TarAddr * M95PageSize;
uint32_t iPageNumber = TarAddr;
if (iRemainder !=0U)
{
iNumberOfPage += 1U;
}
if (iNumberOfPage <= 1U)
{
if (M95Drv[Instance]->ReadPage(M95CompObj[Instance], pData, PageAddress, M95PageSize) != BSP_ERROR_NONE)
{
ret = BSP_ERROR_COMPONENT_FAILURE;
}
else
{
ret = BSP_ERROR_NONE;
}
}
else
{
for (uint32_t iCounter=0; iCounter<iNumberOfPage; iCounter++)
{
uint32_t iPageAddress = iPageNumber * M95PageSize;
ret = M95Drv[Instance]->ReadPage(M95CompObj[Instance], &pData[0U + (iCounter*M95PageSize)], iPageAddress,M95PageSize);
iPageNumber++;
HAL_Delay(5);
}
}
return ret;
}
|