在线时间247 小时
UID3135525
注册时间2015-6-8
NXP金币0
TA的每日心情 | 开心 2016-11-14 15:33 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
金牌会员
 
- 积分
- 1783
- 最后登录
- 2016-11-14
|

楼主 |
发表于 2016-4-5 18:10:49
|
显示全部楼层
本帖最后由 最后无事 于 2016-4-5 18:12 编辑
你说的直接操作SD卡的block读写这种方法我试过了,是没有问题的。
我忘txt里面写东西,是调用这个函数的 znFAT_WriteData(&fileinfo,20,buf);
UINT32 znFAT_WriteData(struct FileInfo *pfi,UINT32 len,UINT8 *pbuf)
{
UINT32 temp=0,temp1=0,len_temp=len;
UINT32 Cluster_Size=((pInit_Args->BytesPerSector)*(pInit_Args->SectorsPerClust));
printf("Cluster_Size = %d\n",Cluster_Size);
#ifdef USE_EXCHANGE_BUFFER
#ifndef USE_ALONE_EXB
UINT8 old_devno=Dev_No;
#else
pexb_buf=(pfi->exb_buf);
#endif
#endif
just_file=pfi;
#ifndef RT_UPDATE_CLUSTER_CHAIN
get_next_cluster_in_cccb=1;
#ifdef USE_ALONE_CCCB
CCCB_To_Alone();
#endif
#endif
if(0==len) return 0; //Èç¹ûҪдÈëµÄÊý¾Ý³¤¶ÈΪ0£¬ÔòÖ±½Ó·µ»Ø0
printf("aaaaaaaaaaaa\n");
if(len>(0XFFFFFFFF-pfi->File_Size)) return (UINT32)-2; //Îļþ´óСÔÚдÈëÊý¾Ýºó½«·¢ÉúÒç³ö´íÎó
znFAT_Seek(pfi,pfi->File_Size); //ÎļþÊý¾Ý¶¨Î»µ½Îļþĩ⣬ÎļþλÖÃÏà¹ØÐÅÏ¢Ëæ¼´¸Ä±ä
//¼ì²é´ÅÅÌÊ£Óà¿Õ¼äÊÇ·ñ¹»ÓÃ
printf("File_CurOffset = %d\n",pfi->File_CurOffset);
if((pfi->File_CurOffset%Cluster_Size)!=0)
{
printf("bbbbbbbbb\n");
temp=((pInit_Args->BytesPerSector)-(pfi->File_CurPos))+((LAST_SEC_OF_CLU(pfi->File_CurClust))-(pfi->File_CurSec))*(Cluster_Size);
//µ±Ç°´ØÊ£ÓàÊý¾ÝÁ¿
if(len>temp) //Èç¹ûҪдÈëµÄÊý¾ÝÁ¿´óÓÚtemp£¬Ôò˵Ã÷±ØÈ»»á³¬³öµ±Ç°´Ø£¬ÎªÆäÀ©Õ¹¿Õ´Ø
{
temp1=(len-temp)/(Cluster_Size);
if((len-temp)%(Cluster_Size)) temp1++; //¼ÆËãÐèÒª¶àÉÙ¸ö¿Õ´Ø
if(temp1>(pInit_Args->Free_nCluster)) return ((UINT32)-1); //¿Õ¼ä²»×ã
}
}
else
{
temp1=len/(Cluster_Size);
if(len%(Cluster_Size)) temp1++; //¼ÆËãÐèÒª¶àÉÙ¸ö¿Õ´Ø
if(temp1>(pInit_Args->Free_nCluster))
//return ((UINT32)-1); //¿Õ¼ä²»×ã
return (10); //¿Õ¼ä²»×ã
}
//===========================================================================================================
temp=((pInit_Args->BytesPerSector)-(pfi->File_CurPos)); //¼ÆË㸳¸øÁÙʱ±äÁ¿£¬ÒÔÃâºóÃæÖØ¸´¼ÆËã
if((pfi->File_CurOffset%Cluster_Size)!=0)
{
if(len<=temp) //ҪдÈëµÄÊý¾ÝСÓÚµÈÓÚµ±Ç°ÉÈÇøÊ£ÓàÊý¾ÝÁ¿
{
#ifndef USE_EXCHANGE_BUFFER
znFAT_Device_Read_Sector(pfi->File_CurSec,znFAT_Buffer); //¶ÁÈ¡µ±Ç°ÉÈÇøÊý¾Ý£¬ÒÔ±ã×÷ÉÈÇøÄÚÊý¾ÝÆ´½Ó
Memory_Copy(znFAT_Buffer+pfi->File_CurPos,pbuf,len); //ÉÈÇøÊý¾ÝÆ´½Ó
znFAT_Device_Write_Sector(pfi->File_CurSec,znFAT_Buffer); //»ØÐ´ÉÈÇøÊý¾Ý
#endif
if(len==temp) //Èç¹ûҪдÈëµÄÊý¾ÝÕýºÃÕ¼Âúµ±Ç°ÉÈÇø
{
#ifdef USE_EXCHANGE_BUFFER
if(0!=pfi->File_CurPos)
{
#ifndef USE_ALONE_EXB
if(Dev_No!=sexb_cur_dev) //Èç¹ûÏÖÔÚ²Ù×÷µÄÉ豸²»Êǵ±Ç°Õ¼ÓÃEXBµÄÉ豸
{
if(0!=sexb_cur_sec) //Èç¹ûEXBÕý±»Õ¼ÓÃ
{
Dev_No=sexb_cur_dev;
znFAT_Device_Write_Sector(sexb_cur_sec,pexb_buf); //Èç¹ûEXBÖл¹ÓÐÊý¾Ý£¬ÔòÏȽ«ÕâЩÊý¾Ý»ØÐ´µ½ÆäÏàÓ¦ÉÈÇøÖÐ
Dev_No=old_devno;
}
znFAT_Device_Read_Sector(pfi->File_CurSec,pexb_buf);
}
else //Èç¹ûÏÖÔÚ²Ù×÷µÄÉ豸ÕýÊǵ±Ç°Õ¼ÓÃEXBµÄÉ豸
{
if(sexb_cur_sec!=(pfi->File_CurSec)) //Õ¼ÓÃEXBµÄÉÈÇø²»Êǵ±Ç°Òª²Ù×÷µÄÉÈÇø
{
if(0!=sexb_cur_sec) //Èç¹ûEXBÕý±»Õ¼ÓÃ
{
znFAT_Device_Write_Sector(sexb_cur_sec,pexb_buf); //Èç¹ûEXBÖл¹ÓÐÊý¾Ý£¬ÔòÏȽ«ÕâЩÊý¾Ý»ØÐ´µ½ÆäÏàÓ¦ÉÈÇøÖÐ
znFAT_Device_Read_Sector(pfi->File_CurSec,pexb_buf);
}
}
}
#endif
Memory_Copy(pexb_buf+pfi->File_CurPos,pbuf,len); //ÉÈÇøÊý¾ÝÆ´½Ó
znFAT_Device_Write_Sector(pfi->File_CurSec,pexb_buf); //»ØÐ´ÉÈÇøÊý¾Ý
#ifndef USE_ALONE_EXB
sexb_cur_sec=0; //ÿ´ÎEXBÖеÄÊý¾ÝÒÔÕûÉÈÇøÊý¾Ý»ØÐ´Ö®ºó£¬ÎÒÃDZãÈÏΪËü²»ÔÙ±»Õ¼ÓÃÁË
sexb_cur_dev=(UINT8)(-1); //EXBµÄµ±Ç°É豸ºÅÖÃΪ¿Õ£¬ÕâÀïÈ¡-1È϶¨ÆäΪ¿Õ£¬ÎªÁËÓëÓÐЧÉ豸ºÅ0ÏàÇø·Ö
psexb_cur_oc=(struct FileInfo *)0; //´ËʱEXB²»¹éÈκÎÎļþËùÓÐ
#endif
}
else
{
znFAT_Device_Write_Sector(pfi->File_CurSec,pbuf); //»ØÐ´ÉÈÇøÊý¾Ý
}
#endif
if(IS_END_SEC_OF_CLU(pfi->File_CurSec,pfi->File_CurClust)) //Èç¹ûµ±Ç°ÉÈÇøÊǵ±Ç°´ØµÄ×îºóÒ»¸öÉÈÇø
{
pfi->File_CurSec=SOC(pfi->File_CurClust); //¸üе±Ç°ÉÈÇø£¬ÆäʵÎÞЧ£¬ÎªÁ˹æÕû
}
else //µ±Ç°ÉÈÇø²»Êǵ±Ç°´ØµÄ×îºóÉÈÇø
{
pfi->File_CurSec++;
}
pfi->File_CurPos=0;
pfi->File_CurOffset+=len; //¸üе±Ç°Æ«ÒÆÁ¿
pfi->File_Size+=len; //¸üÐÂÎļþ´óС
#ifdef RT_UPDATE_FILESIZE
Update_File_Size(pfi); //¸üÎļþĿ¼ÏîÖеÄÎļþ´óС×Ö¶Î
#endif
printf("qqq\n");
printf("len = %d\n",len);
return len;
}
else//lenСÓÚµ±Ç°ÉÈÇøÊ£ÓàÊý¾ÝÁ¿
{
#ifdef USE_EXCHANGE_BUFFER
#ifndef USE_ALONE_EXB
if(Dev_No!=sexb_cur_dev) //Èç¹ûÏÖÔÚ²Ù×÷µÄÉ豸²»Êǵ±Ç°Õ¼ÓÃEXBµÄÉ豸
{
if(0!=sexb_cur_sec) //Èç¹ûEXBÕý±»Õ¼ÓÃ
{
Dev_No=sexb_cur_dev;
znFAT_Device_Write_Sector(sexb_cur_sec,pexb_buf); //Èç¹ûEXBÖл¹ÓÐÊý¾Ý£¬ÔòÏȽ«ÕâЩÊý¾Ý»ØÐ´µ½ÆäÏàÓ¦ÉÈÇøÖÐ
Dev_No=old_devno;
}
znFAT_Device_Read_Sector(pfi->File_CurSec,pexb_buf);
}
else //Èç¹ûÏÖÔÚ²Ù×÷µÄÉ豸ÕýÊǵ±Ç°Õ¼ÓÃEXBµÄÉ豸
{
if(sexb_cur_sec!=(pfi->File_CurSec)) //Õ¼ÓÃEXBµÄÉÈÇø²»Êǵ±Ç°Òª²Ù×÷µÄÉÈÇø
{
if(0!=sexb_cur_sec) //Èç¹ûEXBÕý±»Õ¼ÓÃ
{
znFAT_Device_Write_Sector(sexb_cur_sec,pexb_buf); //Èç¹ûEXBÖл¹ÓÐÊý¾Ý£¬ÔòÏȽ«ÕâЩÊý¾Ý»ØÐ´µ½ÆäÏàÓ¦ÉÈÇøÖÐ
znFAT_Device_Read_Sector(pfi->File_CurSec,pexb_buf);
}
}
}
#endif
Memory_Copy(pexb_buf+pfi->File_CurPos,pbuf,len); //ÉÈÇøÊý¾ÝÆ´½Ó
#ifndef USE_ALONE_EXB
sexb_cur_dev=Dev_No;
sexb_cur_sec=pfi->File_CurSec;
psexb_cur_oc=pfi; //¼Ç¼EXBÖлº³åµÄÊý¾ÝÊôÓÚÄĸöÎļþ
#endif
#endif
//znFAT_Device_Write_Sector(pfi->File_CurSec,ex_buf); //»ØÐ´ÉÈÇøÊý¾Ý
pfi->File_CurPos+=(UINT16)len;
pfi->File_CurOffset+=len; //¸üе±Ç°Æ«ÒÆÁ¿
pfi->File_Size+=len; //¸üÐÂÎļþ´óС
#ifdef RT_UPDATE_FILESIZE
Update_File_Size(pfi); //¸üÎļþĿ¼ÏîÖеÄÎļþ´óС×Ö¶Î
#endif
printf("www\n");
printf("len = %d\n",len);
return len;
}
}
else
{
#ifndef USE_EXCHANGE_BUFFER
znFAT_Device_Read_Sector(pfi->File_CurSec,znFAT_Buffer); //¶ÁÈ¡µ±Ç°ÉÈÇø
Memory_Copy(znFAT_Buffer+pfi->File_CurPos,pbuf,temp); //ÉÈÇøÊý¾ÝÆ´½Ó
znFAT_Device_Write_Sector(pfi->File_CurSec,znFAT_Buffer); //»ØÐ´ÉÈÇø
#else
if(0!=pfi->File_CurPos)
{
#ifndef USE_ALONE_EXB
if(Dev_No!=sexb_cur_dev) //Èç¹ûÏÖÔÚ²Ù×÷µÄÉ豸²»Êǵ±Ç°Õ¼ÓÃEXBµÄÉ豸
{
if(0!=sexb_cur_sec) //Èç¹ûEXBÕý±»Õ¼ÓÃ
{
Dev_No=sexb_cur_dev;
znFAT_Device_Write_Sector(sexb_cur_sec,pexb_buf); //Èç¹ûEXBÖл¹ÓÐÊý¾Ý£¬ÔòÏȽ«ÕâЩÊý¾Ý»ØÐ´µ½ÆäÏàÓ¦ÉÈÇøÖÐ
Dev_No=old_devno;
}
znFAT_Device_Read_Sector(pfi->File_CurSec,pexb_buf);
}
else //Èç¹ûÏÖÔÚ²Ù×÷µÄÉ豸ÕýÊǵ±Ç°Õ¼ÓÃEXBµÄÉ豸
{
if(sexb_cur_sec!=(pfi->File_CurSec)) //Õ¼ÓÃEXBµÄÉÈÇø²»Êǵ±Ç°Òª²Ù×÷µÄÉÈÇø
{
if(0!=sexb_cur_sec) //Èç¹ûEXBÕý±»Õ¼ÓÃ
{
znFAT_Device_Write_Sector(sexb_cur_sec,pexb_buf); //Èç¹ûEXBÖл¹ÓÐÊý¾Ý£¬ÔòÏȽ«ÕâЩÊý¾Ý»ØÐ´µ½ÆäÏàÓ¦ÉÈÇøÖÐ
znFAT_Device_Read_Sector(pfi->File_CurSec,pexb_buf);
}
}
}
#endif
Memory_Copy(pexb_buf+pfi->File_CurPos,pbuf,temp); //ÉÈÇøÊý¾ÝÆ´½Ó
znFAT_Device_Write_Sector(pfi->File_CurSec,pexb_buf); //»ØÐ´ÉÈÇøÊý¾Ý
#ifndef USE_ALONE_EXB
sexb_cur_sec=0; //ÿ´ÎEXBÖеÄÊý¾ÝÒÔÕûÉÈÇøÊý¾Ý»ØÐ´Ö®ºó£¬ÎÒÃDZãÈÏΪËü²»ÔÙ±»Õ¼ÓÃÁË
sexb_cur_dev=(UINT8)(-1); //EXBµÄµ±Ç°É豸ºÅÖÃΪ¿Õ£¬ÕâÀïÈ¡-1È϶¨ÆäΪ¿Õ£¬ÎªÁËÓëÓÐЧÉ豸ºÅ0ÏàÇø·Ö
psexb_cur_oc=(struct FileInfo *)0;
#endif
}
else //Èç¹ûµ±Ç°Î»ÖÃÔÚ0λÖã¬ÔòÖ±½ÓдÉÈÇø
{
znFAT_Device_Write_Sector(pfi->File_CurSec,pbuf); //»ØÐ´ÉÈÇøÊý¾Ý
}
#endif
len_temp-=temp;
pbuf+=temp;
if(!(IS_END_SEC_OF_CLU(pfi->File_CurSec,pfi->File_CurClust))) //Èç¹ûµ±Ç°ÉÈÇø²»Êǵ±Ç°´ØµÄ×îºóÒ»¸öÉÈÇø
{
pfi->File_CurSec++;
pfi->File_CurPos=0;
pfi->File_CurOffset+=temp;
temp=(LAST_SEC_OF_CLU(pfi->File_CurClust)-(pfi->File_CurSec)+1)*(pInit_Args->BytesPerSector);//µ±Ç°´ØÖеÄÊ£ÓàÕûÕûÉÈÇøÊý¾ÝÁ¿
if(len_temp<=temp) //Èç¹ûҪдÈëµÄÊý¾ÝÁ¿Ð¡ÓÚµÈÓÚµ±Ç°´ØÖеÄÊ£ÓàÕûÉÈÇøÊý¾ÝÁ¿
{
temp1=len_temp/(pInit_Args->BytesPerSector); //¼ÆËãҪдÈëµÄÊý¾ÝÁ¿¹»¼¸¸öÕûÉÈÇø
znFAT_Device_Write_nSector(temp1,pfi->File_CurSec,pbuf);
pbuf+=((pInit_Args->BytesPerSector)*temp1);
if(len_temp==temp) //Èç¹ûÕýºÃдÂúµ±Ç°´Ø
{
pfi->File_CurSec=SOC(pfi->File_CurClust); //‡å´Ø
pfi->File_CurPos=0;
pfi->File_CurOffset+=len_temp;
pfi->File_Size+=len;
#ifdef RT_UPDATE_FILESIZE
Update_File_Size(pfi); //¸üÎļþĿ¼ÏîÖеÄÎļþ´óС×Ö¶Î
#endif
printf("rrr\n");
printf("len = %d\n",len);
return len;
}
else
{
pfi->File_CurSec+=temp1;
pfi->File_CurPos=(UINT16)(len_temp%(pInit_Args->BytesPerSector));
if(pfi->File_CurPos) //»¹ÓÐҪдµÄÊý¾Ý,´¦Àí×îºóµÄ×Ö½ÚÊý¾Ý
{
#ifndef USE_EXCHANGE_BUFFER
Memory_Copy(znFAT_Buffer,pbuf,pfi->File_CurPos);
znFAT_Device_Write_Sector(pfi->File_CurSec,znFAT_Buffer);
#else
#ifndef USE_ALONE_EXB
if(Dev_No!=sexb_cur_dev) //Èç¹ûÏÖÔÚ²Ù×÷µÄÉ豸²»Êǵ±Ç°Õ¼ÓÃEXBµÄÉ豸
{
if(0!=sexb_cur_sec) //Èç¹ûEXBÕý±»Õ¼ÓÃ
{
Dev_No=sexb_cur_dev;
znFAT_Device_Write_Sector(sexb_cur_sec,pexb_buf); //Èç¹ûEXBÖл¹ÓÐÊý¾Ý£¬ÔòÏȽ«ÕâЩÊý¾Ý»ØÐ´µ½ÆäÏàÓ¦ÉÈÇøÖÐ
Dev_No=old_devno;
}
}
else //Èç¹ûÏÖÔÚ²Ù×÷µÄÉ豸ÕýÊǵ±Ç°Õ¼ÓÃEXBµÄÉ豸
{
if(sexb_cur_sec!=(pfi->File_CurSec)) //Õ¼ÓÃEXBµÄÉÈÇø²»Êǵ±Ç°Òª²Ù×÷µÄÉÈÇø
{
if(0!=sexb_cur_sec) //Èç¹ûEXBÕý±»Õ¼ÓÃ
{
znFAT_Device_Write_Sector(sexb_cur_sec,pexb_buf); //Èç¹ûEXBÖл¹ÓÐÊý¾Ý£¬ÔòÏȽ«ÕâЩÊý¾Ý»ØÐ´µ½ÆäÏàÓ¦ÉÈÇøÖÐ
}
}
}
#endif
Memory_Copy(pexb_buf,pbuf,pfi->File_CurPos);
#ifndef USE_ALONE_EXB
sexb_cur_sec=pfi->File_CurSec;
sexb_cur_dev=Dev_No;
psexb_cur_oc=pfi; //¼Ç¼EXBÖлº³åµÄÊý¾ÝÊôÓÚÄĸöÎļþ
#endif
#endif
}
pfi->File_CurOffset+=len_temp;
pfi->File_Size+=len;
#ifdef RT_UPDATE_FILESIZE
Update_File_Size(pfi); //¸üÎļþĿ¼ÏîÖеÄÎļþ´óС×Ö¶Î
#endif
printf("ttt\n");
printf("len = %d\n",len);
return len;
}
}
else
{
temp1=temp/(pInit_Args->BytesPerSector);
znFAT_Device_Write_nSector(temp1,pfi->File_CurSec,pbuf);
pbuf+=temp;
len_temp-=temp;
pfi->File_CurSec=SOC(pfi->File_CurClust);
pfi->File_CurPos=0;
pfi->File_CurOffset+=temp;
}
}
else //µ±Ç°ÉÈÇøÊǵ±Ç°´Ø×îºóÒ»¸öÉÈÇø
{
pfi->File_CurSec=SOC(pfi->File_CurClust);
pfi->File_CurPos=0;
pfi->File_CurOffset+=temp;
}
}
}
//Èç¹ûÎļþµÄµ±Ç°Æ«ÒÆÁ¿ÊÇ´Ø´óСµÄÕûÊý±¶£¬Ôò
//Ö±½Ó½øÈë¿ÕÎļþ¿ªÊ¼Î»ÖûòÕû´ØÎ»ÖÃдÊý¾ÝµÄ½×¶Î
WriteData_From_nCluster(pfi,len_temp,pbuf); //´Ó¿ÕÎļþ¿ªÊ¼Î»ÖûòÕû´ØÎ»ÖÃдÊý¾Ý£¬´Ëʱ¶¼ÊÇÒ»ÖÖ¡°¾½¾³´Ø¡±µÄÇé¿ö
//ÕâÖÖÇé¿öÏ£¬Êý¾ÝÕýºÃÍ£Ö¹ÓÚÄ©´ØµÄĩβ»òÊÇ¿ÕÎļþ¶øÃ»ÓÐÊý¾Ý£¬Í¨
//³£ÎļþÐÅÏ¢¼¯ºÏÖмǼµÄÎļþλÖÃÐÅÏ¢Ó¦¸ÃÊÇÏÂÒ»´ØµÄ×ʼλÖã¬
//µ«ÊÇÕâ¸öʱºòÏÂÒ»´ØÉÐûÓб»·ÖÅ䣬¼´ÎļþÄ©´ØµÄFAT´ØÏî¼Ç¼µÄÊÇ
//0XFFFFFF0F£¨´ØÁ´½áÊø±ê¼Ç£©£¬Òò´Ë´ËʱµÄÎļþλÖÃÐÅÏ¢ÊÇÎÞЧµÄ
//znFATÖÐ×÷³öÔ¼¶¨:¡°¾½¾³´Ø¡±Çé¿öÏ£¬¿ÕÎļþµ±Ç°´ØÎª0£¬ÔÚÄ©´ØÄ©Î²
//ʱ£¬µ±Ç°´ØÎªÄ©´Ø¡£ÕâÖÖÔ¼¶¨±ãÓÚznFATµÄÊý¾ÝдÈ빦ÄÜÔÚ¡°¾½¾³´Ø¡±
//Çé¿öϵÄÕýÈ·ÐÔ
pfi->File_Size+=len;
#ifdef RT_UPDATE_FILESIZE
Update_File_Size(pfi); //¸üÎļþĿ¼ÏîÖеÄÎļþ´óС×Ö¶Î
#endif
printf("hhh\n");
printf("len = %d\n",len);
return len;
}
#endif
我调用这个函数znFAT_WriteData(&fileinfo,20,buf); 最后给我返回的是 20 ,就是写入的值~
|
|