我用fatfs文件系统的f_write函数将数据从一个数组中写文件到SD卡上,但总是写不正确,前面总是多两个字节0x10和0xBD,而且文件末尾也有问题,代码如下
int main(void)
{
int i,j,k;
char FN[13]="Newimg000.jpg";
char *p=&FN[6];
FIL file;
const char *pointer;
RCC_Configuration(); //设置内部时钟及外设时钟使能
NVIC_Configuration(); //中断源配置
Usart1_Init(); //串口1初始化
SD_TEST(); //SD卡测试函数
disk_initialize(0); //fatfs可以管理多个介质的分区, 所以把物理存储介质SST25VF016B标示为0区,相当于磁盘编号
f_mount(0, &fs); //将文件系统设置到0区
Bytes=sizeof(jpgimage) ;
k=Bytes%512;
for(i=1;i<15;i++)//写14个内容相同但文件名不同的文件
{
pointer=&jpgimage[0];//jpgimage数组存放的是图片数据
res=f_open(&file,FN,FA_WRITE|FA_CREATE_ALWAYS);
if(res==FR_OK)
{
for(j=0;j<Bytes/512;j++)
{
do
{
res=f_write(&file,pointer,512,&bw);// write 512 Bytes
}
while(bw<512);
pointer+=512;
}
do
{
res=f_write(&file,pointer-512,k,&bw);// write k Bytes
}
while(bw<k);
}
f_close(&file);
}
OutPutFile(); //串口输出文件名列表
while (1);
}
SDIO使用的是DMA模式,SDIO中断处理函数是
SD_Error SD_ProcessIRQSrc(void)
{
uint32_t count = 0, restwords = 0;
if (DeviceMode == SD_INTERRUPT_MODE)
{
if (SDIO_GetITStatus(SDIO_IT_RXFIFOHF) != RESET)
{
for (count = 0; count < SD_HALFFIFO; count++)
{
*(DestBuffer + count) = SDIO_ReadData();
}
DestBuffer += SD_HALFFIFO;
NumberOfBytes += SD_HALFFIFOBYTES;
}
else if (SDIO_GetITStatus(SDIO_IT_TXFIFOHE) != RESET)
{
if ((TotalNumberOfBytes - NumberOfBytes) < SD_HALFFIFOBYTES)
{
restwords = ((TotalNumberOfBytes - NumberOfBytes) % 4 == 0) ?
((TotalNumberOfBytes - NumberOfBytes) / 4) :
((TotalNumberOfBytes - NumberOfBytes) / 4 + 1);
for (count = 0; count < restwords; count++, SrcBuffer++, NumberOfBytes += 4)
{
SDIO_WriteData(*SrcBuffer);
}
}
else
{
for (count = 0; count < SD_HALFFIFO; count++)
{
SDIO_WriteData(*(SrcBuffer + count));
}
SrcBuffer += SD_HALFFIFO;
NumberOfBytes += SD_HALFFIFOBYTES;
}
}
}
if (SDIO_GetITStatus(SDIO_IT_DATAEND) != RESET)
{
if (DeviceMode != SD_DMA_MODE)
{
while ((SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET) && (NumberOfBytes < TotalNumberOfBytes))
{
*DestBuffer = SDIO_ReadData();
DestBuffer++;
NumberOfBytes += 4;
}
}
if (StopCondition == 1)
{
TransferError = SD_StopTransfer();
}
else
{
TransferError = SD_OK;
}
SDIO_ClearITPendingBit(SDIO_IT_DATAEND);
SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
TransferEnd = 1;
NumberOfBytes = 0;
return(TransferError);
}
if (SDIO_GetITStatus(SDIO_IT_DCRCFAIL) != RESET)
{
SDIO_ClearITPendingBit(SDIO_IT_DCRCFAIL);
SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
NumberOfBytes = 0;
TransferError = SD_DATA_CRC_FAIL;
return(SD_DATA_CRC_FAIL);
}
if (SDIO_GetITStatus(SDIO_IT_DTIMEOUT) != RESET)
{
SDIO_ClearITPendingBit(SDIO_IT_DTIMEOUT);
SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
NumberOfBytes = 0;
TransferError = SD_DATA_TIMEOUT;
return(SD_DATA_TIMEOUT);
}
if (SDIO_GetITStatus(SDIO_IT_RXOVERR) != RESET)
{
SDIO_ClearITPendingBit(SDIO_IT_RXOVERR);
SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
NumberOfBytes = 0;
TransferError = SD_RX_OVERRUN;
return(SD_RX_OVERRUN);
}
if (SDIO_GetITStatus(SDIO_IT_TXUNDERR) != RESET)
{
SDIO_ClearITPendingBit(SDIO_IT_TXUNDERR);
SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
NumberOfBytes = 0;
TransferError = SD_TX_UNDERRUN;
return(SD_TX_UNDERRUN);
}
if (SDIO_GetITStatus(SDIO_IT_STBITERR) != RESET)
{
SDIO_ClearITPendingBit(SDIO_IT_STBITERR);
SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND |
SDIO_IT_TXFIFOHE | SDIO_IT_RXFIFOHF | SDIO_IT_TXUNDERR |
SDIO_IT_RXOVERR | SDIO_IT_STBITERR, DISABLE);
NumberOfBytes = 0;
TransferError = SD_START_BIT_ERR;
return(SD_START_BIT_ERR);
}
return(SD_OK);
}
请问这是什么原因导致的,求指教。
写文件后用超文本打开后的数据:
正确的文件数据:
|