/** * @brief Writes block of data to the FLASH. In this function, the * number of WRITE cycles are reduced, using Page WRITE sequence. * @param pBuffer : pointer to the buffer containing the data to be * written to the FLASH. * @param WriteAddr : FLASH's internal address to write to. * @param NumByteToWrite : number of bytes to write to the FLASH. * @retval : None */ void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; Addr = WriteAddr % SPI_FLASH_PageSize; count = SPI_FLASH_PageSize - Addr; NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; if (Addr == 0) /* WriteAddr is SPI_FLASH_PageSize aligned */ { if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */ { SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); } else /* NumByteToWrite > SPI_FLASH_PageSize */ { while (NumOfPage--) { SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); WriteAddr += SPI_FLASH_PageSize; pBuffer += SPI_FLASH_PageSize; } SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); } } else /* WriteAddr is not SPI_FLASH_PageSize aligned */ { if (NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */ { if (NumOfSingle > count) /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */ { temp = NumOfSingle - count; SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); WriteAddr += count; pBuffer += count; SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp); } else { SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); } } else /* NumByteToWrite > SPI_FLASH_PageSize */ { NumByteToWrite -= count; NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); WriteAddr += count; pBuffer += count; while (NumOfPage--) { SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); WriteAddr += SPI_FLASH_PageSize; pBuffer += SPI_FLASH_PageSize; } if (NumOfSingle != 0) { SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); } } } }
/****************************************************************************************** *函数名:SPI_FLASH_BufferWrite() * 参数:uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite 数据指针,写入地址,写入的个数 * 返回值:void * 功能:SPIFLASH多个数据函数,外部调用 *********************************************************************************************/ void SPI_FLASH_BufferWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; Addr = WriteAddr % SPI_FLASH_PageSize; //计算写入的页的对应初始地址 count = SPI_FLASH_PageSize - Addr; NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; //计算总共要写的页数 NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; //计算剩余单个页写的数据个数 if (Addr == 0) /* 如果要写入的页地址为0,说明正好整页写数据,没有偏移*/ { if (NumOfPage == 0) /* 如果计算的写入页数为0,说明数据量在一个页的范围内,可直接进行页的写*/ { SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); //进行页写数据 } else /* 如果要写的页数大于0*/ { /*先将开头数据进行整页写入*/ while (NumOfPage--) { //整页写入 SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); //地址偏移 WriteAddr += SPI_FLASH_PageSize; //数据指针偏移 pBuffer += SPI_FLASH_PageSize; } //将剩余数据个数写入 SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); } } else /*如果写入的地址不在页的开头位置*/ { if (NumOfPage == 0) /*如果写入数据页的个数为0,即数据小于一页容量*/ { if (NumOfSingle > count) /*如果剩余数据大于当前页的剩余容量*/ { temp = NumOfSingle - count; //计算超出的数据个数 /*写满当前页*/ SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); /*设置地址偏移*/ WriteAddr += count; /*设置数据指针偏移*/ pBuffer += count; /*将剩余量写入新的页*/ SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp); } else /*如果剩余数据小于当前页的剩余容量*/ { /*直接写入当前页*/ SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite); } } else /*如果写入数据页的个数大于0,即数据大于一页容量*/ { NumByteToWrite -= count; //总数据减去当前页剩余的容量 NumOfPage = NumByteToWrite / SPI_FLASH_PageSize; //计算要写的整页个数 NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize; //计算剩余数据个数 /*将开头数据写入当前页剩余字节个数*/ SPI_FLASH_PageWrite(pBuffer, WriteAddr, count); /*设置地址偏移*/ WriteAddr += count; /*设置数据指针偏移*/ pBuffer += count; /*开始剩下数据的整页写入*/ while (NumOfPage--) { /*写入一个页的字节数*/ SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize); /*设置地址偏移*/ WriteAddr += SPI_FLASH_PageSize; /*设置指针偏移*/ pBuffer += SPI_FLASH_PageSize; } /*如果剩余数据大于0,将剩余的个数写入下一个页*/ if (NumOfSingle != 0) { SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle); } } } }