原:读W25Q64数据就可以跨页读
void W25Q64_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count)
{
MySPI_Start();
MySPI_SwapByte(0x03);
MySPI_SwapByte(Address>>16);
MySPI_SwapByte(Address>>8);
MySPI_SwapByte(Address);
for(uint64_t i =0;i<Count;i++)
{
DataArray[i] = MySPI_SwapByte(0x00);
}
MySPI_Stop();
}
原:W25Q64页编程只能写一页,超过该页尾的内容会在该页头上继续写,一次不能超过256个字节
void W25Q64_PageProgram(uint32_t Address, uint8_t *DataArray, uint32_t Count)
{
W25Q64_WriteEnable();
MySPI_Start();
MySPI_SwapByte(0x02);
MySPI_SwapByte(Address>>16);
MySPI_SwapByte(Address>>8);
MySPI_SwapByte(Address);
for(uint16_t i=0;i<Count;i++)
{
MySPI_SwapByte(DataArray[i]);
}
MySPI_Stop();
W25Q64_WaitBusy();
}
改:在原页编程的基础上判断是否需要跨页写,需要跨页写就通过不断写完一页就加地址(地址偏移)和数据偏移续上页编程(不断地从新的地址进行原页编程)实现多字节跨页写的功能
void W25Q64_xPageProgram(uint32_t address,uint8_t* DataArray,uint16_t Count)
{
uint16_t remain;
uint8_t span = (address%256)+Count -256;//是否跨页
if(span>1)//跨页
{
while(Count>0)//通过剩下要写的字节数判断是否继续循环
{
remain = 256 - (address%256);//当前地址在当页可以写入的字节数
if(Count>=remain)//写一页或刚好写完一页结束页编程
{
W25Q64_PageProgram(address,DataArray,remain);
address = address + remain; //新页头的地址
DataArray = DataArray + remain; //数组索引偏移
Count = Count - remain; //剩下要写的字节数
}
else //最后的
{
W25Q64_PageProgram(address,DataArray,Count);
Count = Count-Count;//结束页编程
}
}
}
else //不需要跨页
{
W25Q64_PageProgram(address,DataArray,Count);//原页编程
}
}