/******************************************************************************* * Function Name : MSD_WriteMultiBlock * Description : None * Input : - sector: * - buffer: * - NbrOfSector: * Output : None * Return : None * Attention : None *******************************************************************************/ uint8 AppSdWriteBytesInBlk(uint32 BlkAddr, uint32 OffsetAddr, uint32 InBlkByteNum, uint8 *DataBuf) { uint32 sector = BlkAddr; if((OffsetAddr + InBlkByteNum) > MSD_BLOCKSIZE) //写范围不能垮块 { while(1); } if(OffsetAddr == 0 && InBlkByteNum == MSD_BLOCKSIZE) //写一整块 { if(MSD_WriteSingleBlock(sector, DataBuf) != 0) { return FALSE; } } else //写块的一部分 { if(MSD_ReadSingleBlock(sector, gSdRWBuf) != 0) { return FALSE; } memcpy(&gSdRWBuf[OffsetAddr], DataBuf, InBlkByteNum); if(MSD_WriteSingleBlock(sector, gSdRWBuf) != 0) { return FALSE; } } return TRUE; }
DRESULT disk_write ( BYTE drv, /* Physical drive nmuber (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to write (1..255) */ ) { int Status; if( !count ) { return RES_PARERR; /* count不能等于0,否则返回参数错误 */ } switch (drv) { case 0: if(count==1) /* 1个sector的写操作 */ { Status = MSD_WriteSingleBlock( sector , (uint8_t *)(&buff[0]) ); } else /* 多个sector的写操作 */ { Status = MSD_WriteMultiBlock( sector , (uint8_t *)(&buff[0]) , count ); } if(Status == 0) { return RES_OK; } else { return RES_ERROR; } case 2: break; default : break; } return RES_ERROR; }