#define size sizeof(Buffer)
/*****另一个源文件的函数*******/
u8 SPI_Write_Page(u8 *string,u32 WriteToAddr,u32 Bytes)
{
u32 PagePos,PagePosRemain,i;
PagePos = WriteToAddr%256; //要写入页的起始地址
PagePosRemain = 256 - PagePos;//该页中剩余的空间
if(Bytes <= PagePosRemain)
{
PagePosRemain = Bytes;
}
SPI_Write_ENABLE();
SPI_Status();
Flash_CS_ENABLE();
SPI_Send(0x02);
SPI_Send((u8)(WriteToAddr >> 16));
SPI_Send((u8)(WriteToAddr >> 8));
SPI_Send((u8)WriteToAddr);
for(i = 0; i < PagePosRemain; i++)
{
SPI_Send(string);
}
Flash_CS_DISABLE();
SPI_Status();
if((Bytes - PagePosRemain) > 0)
{
return 0; //一页不够
}
else
{
return 1; //一页够了
}
}
u8 BufferSize[4096],finish_flag;
void SPI_Write_FLASH(u8 *string,u32 WriteToAddr,u32 Bytes)
{
u8 secpos,secpos_temp,eraser_flag = 0;
u16 sec_offset;
u16 sec_remain;
secpos = WriteToAddr / 4096;
sec_offset = WriteToAddr % 4096;
sec_remain = 4096 - sec_offset;
if(Bytes <= sec_remain)
{
sec_remain = Bytes;
}
while(1)
{
u32 i;
SPI_Read_sector(BufferSize,secpos*4096,4096);
for(i = 0; i < sec_remain; i++)
{
if(BufferSize[sec_offset + i] != 0xff)
{
eraser_flag = 1;
break;
}
else
{
eraser_flag = 0;
}
}
if(eraser_flag == 1) //如果eraser_flag == 1就要擦除该扇区
{
SPI_Eraser_Flash(secpos);
continue;
}
else if(eraser_flag == 0) //如果eraser_flag == 0,说明扇为空,可以定入内容
{
finish_flag = SPI_Write_Page(string,WriteToAddr,Bytes); //向页中写入内容
}
if(finish_flag) //如果为1,不用换页,直接跳出主循环
{
break;
}
while(!finish_flag) //如果为0,说明一页写完以后,要存的内容没写完,继续写
{
string += 256 - WriteToAddr%256; //指针指向没写入FLASH的剩余内容的起始地址
Bytes -= 256 - WriteToAddr%256; //剩余字节数
WriteToAddr += 256 - WriteToAddr%256; //开始写剩余字节在FLASH中的起始地址
secpos_temp = WriteToAddr / 4096;
if(secpos_temp == secpos) //如果没换扇区
{
finish_flag = SPI_Write_Page(string,WriteToAddr,Bytes); //再写剩余的内容
}
else
{
secpos++;
sec_offset = WriteToAddr % 4096;
sec_remain = 4096 - WriteToAddr % 4096;
break;
}
}
}
}
/******main文件********/
……
……
int main()
{
……
……
for( ; ; )
{
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4) == RESET)
{
……
SPI_Write_FLASH(Buffer,0xfe,size);
……
}
if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5) == RESET)
{
……
SPI_Read_sector(data,0xfe,size);
……
}
}
}