初级会员

- 积分
- 190
- 金钱
- 190
- 注册时间
- 2016-11-30
- 在线时间
- 92 小时
|
1金钱
STM32+W25Q64,模拟了一个U盘,做了一手持设备。目前唯一的问题就是,U盘插入电脑,文件拷入速度比较慢(每秒7k),现在找到了问题,就是flash在写入的时候有读取的操作。因为支持FATFS,程序员也不知道文件的具体数据存在flash的哪个物理地址下,都是FATFS自己管理,所以写入的时候必须先读,而这个读大大的减弱了拷入速度,同样写入4096个字节,调用这个函数,一次写入4096个字节一次写4096次1个字节,那用的时间差距就大多了。具体代码参考正点原子的,见图片。不知道如何来优化这个代码,大家用SPI FLASH模拟U盘的速度怎么样呢? 谁有正点原子的开发板,帮忙测试一下速度。
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u8 * W25QXX_BUF;
W25QXX_BUF=W25QXX_BUFFER;
secpos=WriteAddr/4096;//éèÇøμØÖ·
secoff=WriteAddr%4096;//ÔúéèÇøÄúμÄÆ«òÆ
secremain=4096-secoff;//éèÇøê£óà¿Õ¼ä′óD¡
//printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//2aêÔóÃ
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//2»′óóú4096¸ö×Ö½ú
while(1)
{
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//¶á3öÕû¸öéèÇøμÄÄúèY
for(i=0;i<secremain;i++)//D£Ñéêy¾Y
{
if(W25QXX_BUF[secoff+i]!=0XFF)break;//Dèòa2á3y
}
if(i<secremain)//Dèòa2á3y
{
W25QXX_Erase_Sector(secpos); //2á3yÕa¸öéèÇø
for(i=0;i<secremain;i++) //¸′ÖÆ
{
W25QXX_BUF[i+secoff]=pBuffer[i];
}
W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//D′èëÕû¸öéèÇø
}else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//D′òѾ-2á3yáËμÄ,Ö±½óD′èëéèÇøê£óàÇø¼ä.
if(NumByteToWrite==secremain)break;//D′èë½áêøáË
else//D′èëÎ′½áêø
{
secpos++;//éèÇøμØÖ·Ôö1
secoff=0;//Æ«òÆÎ»ÖÃÎa0
pBuffer+=secremain; //Ö¸ÕëÆ«òÆ
WriteAddr+=secremain; //D′μØÖ·Æ«òÆ
NumByteToWrite-=secremain; //×Ö½úêyμY¼õ
if(NumByteToWrite>4096)secremain=4096;//ÏÂò»¸öéèÇø»1êÇD′2»íê
else secremain=NumByteToWrite; //ÏÂò»¸öéèÇø¿éòÔD′íêáË
}
};
}
|
-
|