在线时间130 小时
UID2106909
注册时间2014-7-2
NXP金币0
该用户从未签到
高级会员

- 积分
- 747
- 最后登录
- 2023-5-24
|
我用的是官方的SDK,官方例程EEPROM写问题出现问题,怎么也写不进去。一些就死机。在线调试设置断点就好。然后在例程里面加个延时函数。可以不知道大家有没有遇到同样的问题。
/*!
* brief Write data from a user allocated buffer in address of EEPROM.
*
* Users can write any bytes data into EEPROM address by wBuf.
*
* param base EEPROM peripheral base address.
* param offset Offset from the begining address of EEPROM.
* param wBuf Data need be write.
* param size Number of bytes to write.
*/
void EEPROM_Write(EEPROM_Type *base, int offset, void *wBuf, int size)
{
uint8_t *src;
bool unalignedStart;
uint32_t memUnit = 0;
uint32_t alignSize = 0;
#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
uint16_t *dst;
alignSize = 2;
memUnit = FSL_FEATURE_EEPROM_ROW_SIZE;
#else
uint8_t i = 0;
uint32_t *dst;
uint32_t data32_Align = 0;
alignSize = 4;
memUnit = FSL_FEATURE_EEPROM_SIZE / FSL_FEATURE_EEPROM_PAGE_COUNT;
#endif /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */
/* Offset and size must be positive */
assert(offset >= 0);
assert(size > 0);
/* All bytes must be written to a valid EEPROM address */
assert((offset + size) <= FSL_FEATURE_EEPROM_SIZE);
src = wBuf;
#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
dst = &((uint16_t *)FSL_FEATURE_EEPROM_BASE_ADDRESS)[offset / alignSize];
unalignedStart = (offset % alignSize != 0);
#else
dst = &((uint32_t *)FSL_FEATURE_EEPROM_BASE_ADDRESS)[offset / alignSize];
unalignedStart = (offset % alignSize != 0);
#endif /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */
while (size > 0)
{
/* If first byte is to be copied to non aligned EEPROM byte */
if (unalignedStart)
{
/* The first byte from the buffer is not 16-bits aligned.
* Read the LSB from EEPROM to complete it.
*/
#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
*dst = (uint16_t)(((uint16_t)src[0] << 8) | (*dst & 0x00ff));
#else
/* The first byte from the buffer is not 32-bits aligned.
* Read the rest of data after position offset and realign them.
*/
for (i = 0; i < alignSize; i++)
{
data32_Align |= (uint32_t)(((uint32_t)(src[i] << (8 * ((offset % alignSize) + i)))));
}
*dst = (*dst & (0xffffffff >> (8 * (alignSize - (offset % alignSize))))) | data32_Align;
#endif /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */
src += (alignSize - (offset % alignSize)); /* Operate src to let wBuf pointer offset correct*/
size -= (alignSize - (offset % alignSize));
unalignedStart = false;
}
else if (size >= alignSize)
{
#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
/* Combine two bytes from the buffer to a 16-bits word */
*dst = (uint16_t)(((uint16_t)src[1] << 8) | src[0]);
#else
/* Combine four bytes from the buffer to a 32-bits word */
*dst = (uint32_t)(((uint32_t)(src[3] << 24 | src[2] << 16 | src[1] << 8) | src[0]));
#endif /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */
src += alignSize; /* Normal operate src to offset wBuf pointer by 4 bytes*/
size -= alignSize;
}
else
{
/* The last several bytes from the buffer is not 32-bit aligned.
* Read the rest of bytes of non 32-bit aligned data
* and realign them by 32-bit aligned */
#if (defined(FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED) && FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED)
*dst = (uint16_t)((*dst & 0xff00) | src[0]);
#else
data32_Align = 0; /* Clear data32_Align */
for (i = 0; i < (size % alignSize); i++)
{
data32_Align |= (uint32_t)(((uint32_t)(src[i] << (8 * i))));
}
*dst = (*dst & (0xffffffff << (8 * (size % alignSize)))) | data32_Align;
#endif /* FSL_FEATURE_EEPROM_TWOBYTES_ALIGNED */
size -= (size % alignSize);
}
dst++; /* EEPROM mempory pointer go ahead */
/* When memory unit size reached, have to flush. */
if ((((uint32_t)dst % memUnit) == 0) && size > 0)
{
EEPROM_Flush(base);
}
}
/* Normal need to flush after write data into eeprom */
EEPROM_Flush(base);
}
我就在dst++; /* EEPROM mempory pointer go ahead */下面加个延时函数就可以了。很郁闷。
|
|