Example #1
0
/**
  * @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);
            }
        }
    }
}
Example #2
0
/******************************************************************************************
*函数名: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);
            }
        }
    }
}