大学生
最后登录1970-1-1
在线时间 小时
注册时间2016-4-24
|
在学习火哥的SPI-FLASH实验时, 感觉火哥的SPI _ FLASH _ BufferWrite函数写的着实不好理解。 在费了一番功夫以后, 自己换了个思路重新将
此函数写了一遍。
我的基本思路是根本没有必要考虑对齐的问题, 因为对齐是不对齐的特例, 如此一来, 思路就非常明朗了, 只需要考虑要写的数据的个数和要写
的地址所在页的剩余空间大小的比较即可。 即: 当要写的数据个数小于等于要写的地址所在页的剩余空间大小时, 则直接将要写的数据在要写的
地址开始一次性写完就OVER了; 当要写的数据个数大于要写的地址所在页的剩余空间大小时, 则首先将要写的地址所在页的剩余空间大小写完,
其次, 再分析剩下的数据: 即 要写的数据个数 - 上一步写的地址所在页的剩余空间大小 后, 数据还有几页要写, 然后分别写完。
感觉自己说的让人更不好理解了, 直接看代码吧
/*******************************************************************************
* Function Name : SPI_FLASH_BufferWrite
* Description : Writes block of data to the FLASH. In this function, the
* number of WRITE cycles are reduced, using Page WRITE sequence.
* Input : - pBuffer : pointer to the buffer containing the data to be
* written to the FLASH.
* - WriteAddr : FLASH's internal address to write to.
* - NumByteToWrite : number of bytes to write to the FLASH.
* Output : None
* Return : None
*******************************************************************************/
void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
{
u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;
Addr = WriteAddr % SPI_FLASH_PageSize;
count = SPI_FLASH_PageSize - Addr;//计算一页的剩余空间
if(NumByteToWrite<=count)//要写的数据小于等于一页的剩余空间
{
SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
}
else//要写的数据大于一页的剩余空间
{
NumByteToWrite -= count;
NumOfPage = NumByteToWrite / SPI_FLASH_PageSize;
NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;
if(count)//先写一页的剩余空间
{
SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
WriteAddr += count;
pBuffer += count;
}
while (NumOfPage)//NumOfPage页数据
{
SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
WriteAddr += SPI_FLASH_PageSize;
pBuffer += SPI_FLASH_PageSize;
NumOfPage--;
}
if (NumOfSingle)//不足一页数据
{
SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
}
}
}
FLASH_buffer_write.pdf
(51.68 KB, 下载次数: 89)
|
|