|
大神好,有个问题想请教下:
关于这个 Q25Q64BV 的芯片,页面大小貌似是 256字节,而你们的现在的定义是 4096 字节,是不是你们的
这个 sf_WriteBuffer 函数是按照 4096 的大小进行写入的啊 ?????????????????
case W25Q64BV_ID:
strcpy(g_tSF.ChipName, "W25Q64BV");
g_tSF.TotalSize = 8 * 1024 * 1024; /* 总容量 = 8M */
g_tSF.PageSize = 4 * 1024; /* 页面大小 = 4K */
break;
/*
*********************************************************************************************************
* 函 数 名: sf_WriteBuffer
* 功能说明: 写1个扇区并校验,如果不正确则再重写两次。本函数自动完成擦除操作。
* 形 参: _pBuf : 数据源缓冲区;
* _uiWrAddr :目标区域首地址
* _usSize :数据个数,不能超过页面大小
* 返 回 值: 1 : 成功, 0 : 失败
*********************************************************************************************************
*/
uint8_t sf_WriteBuffer(uint8_t* _pBuf, uint32_t _uiWriteAddr, uint16_t _usWriteSize)
{
uint16_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;
Addr = _uiWriteAddr % g_tSF.PageSize;
count = g_tSF.PageSize - Addr;
NumOfPage = _usWriteSize / g_tSF.PageSize;
NumOfSingle = _usWriteSize % g_tSF.PageSize;
if (Addr == 0) /* 起始地址是页面首地址 */
{
if (NumOfPage == 0) /* 数据长度小于页面大小 */
{
if (sf_AutoWritePage(_pBuf, _uiWriteAddr, _usWriteSize) == 0)
{
return 0;
}
}
else /* 数据长度大于等于页面大小 */
{
while (NumOfPage--)
{
if (sf_AutoWritePage(_pBuf, _uiWriteAddr, g_tSF.PageSize) == 0)
{
return 0;
}
_uiWriteAddr += g_tSF.PageSize;
_pBuf += g_tSF.PageSize;
}
if (sf_AutoWritePage(_pBuf, _uiWriteAddr, NumOfSingle) == 0)
{
return 0;
}
}
}
else /* 起始地址不是页面首地址 */
{
if (NumOfPage == 0) /* 数据长度小于页面大小 */
{
if (NumOfSingle > count) /* (_usWriteSize + _uiWriteAddr) > SPI_FLASH_PAGESIZE */
{
temp = NumOfSingle - count;
if (sf_AutoWritePage(_pBuf, _uiWriteAddr, count) == 0)
{
return 0;
}
_uiWriteAddr += count;
_pBuf += count;
if (sf_AutoWritePage(_pBuf, _uiWriteAddr, temp) == 0)
{
return 0;
}
}
else
{
if (sf_AutoWritePage(_pBuf, _uiWriteAddr, _usWriteSize) == 0)
{
return 0;
}
}
}
else /* 数据长度大于等于页面大小 */
{
_usWriteSize -= count;
NumOfPage = _usWriteSize / g_tSF.PageSize;
NumOfSingle = _usWriteSize % g_tSF.PageSize;
if (sf_AutoWritePage(_pBuf, _uiWriteAddr, count) == 0)
{
return 0;
}
_uiWriteAddr += count;
_pBuf += count;
while (NumOfPage--)
{
if (sf_AutoWritePage(_pBuf, _uiWriteAddr, g_tSF.PageSize) == 0)
{
return 0;
}
_uiWriteAddr += g_tSF.PageSize;
_pBuf += g_tSF.PageSize;
}
if (NumOfSingle != 0)
{
if (sf_AutoWritePage(_pBuf, _uiWriteAddr, NumOfSingle) == 0)
{
return 0;
}
}
}
}
return 1; /* 成功 */
} |
|