新手上路
- 积分
- 45
- 金钱
- 45
- 注册时间
- 2016-10-27
- 在线时间
- 24 小时
|
2金钱
本帖最后由 zeroawp 于 2016-10-31 11:56 编辑
用MINISTM32 SD卡例程中的多扇区写入函数,写入结果为失败。
大家有用成功过这个函数的吗?
我的调用方式如下,另外我试了单扇区写入是成功的。
const u8 a[512]="aaa";
SD_WriteDisk((u8*)a,0,1);
函数定义:
[mw_shl_code=applescript,true]//D′èëSD¿¨μÄN¸öblock(Î′êμ¼ê2aêÔ1y)
//êäèë:u32 sector éèÇøμØÖ·£¨sectorÖ죬·ÇÎïàíμØÖ·£©
// u8 *buffer êy¾Y′æ′¢μØÖ·£¨′óD¡Öáéù512byte£©
// u8 count D′èëμÄblockêyÄ¿
//·μ»ØÖμ:0£o 3é1|
// other£oê§°ü
u8 SD_WriteDisk(u8*buf,u32 sector,u8 count)
{
u8 r1;
u16 i;
//SPIx_SetSpeed(SPI_SPEED_HIGH);//éèÖÃÎa¸ßËùÄ£ê½
if(SD_Type != SD_TYPE_V2HC)sector = sector<<9;//èç1û2»êÇSDHC£¬¸ø¶¨μÄêÇsectorμØÖ·£¬½«Æä×a»»3ébyteμØÖ·
if(SD_Type != SD_TYPE_MMC) r1 = SD_SendCommand(ACMD23, count, 0x00);//èç1ûÄ¿±ê¿¨2»êÇMMC¿¨£¬ÆôóÃACMD23Ö¸áîê1ÄüÔ¤2á3y
r1 = SD_SendCommand(CMD25, sector, 0x00);//·¢¶à¿éD′èëÖ¸áî
if(r1 != 0x00)return r1; //ó|′e2»Õyè·£¬Ö±½ó·μ»Ø
SD_CS=0;//¿aê¼×¼±¸êy¾Y′«êä
SPIx_ReadWriteByte(0xff);//Ïè·Å3¸ö¿Õêy¾Y£¬μè′ySD¿¨×¼±¸oÃ
SPIx_ReadWriteByte(0xff);
//--------ÏÂÃæêÇN¸ösectorD′èëμÄÑ-»·2¿·Ö
do
{
//·ÅÆeê¼áîÅÆ0xFC ±íÃ÷êǶà¿éD′èë
SPIx_ReadWriteByte(0xFC);
//·Åò»¸ösectorμÄêy¾Y
for(i=0;i<512;i++)
{
SPIx_ReadWriteByte(*buf++);
}
//·¢2¸öByteμÄdummy CRC
SPIx_ReadWriteByte(0xff);
SPIx_ReadWriteByte(0xff);
//μè′ySD¿¨ó|′e
r1 = SPIx_ReadWriteByte(0xff);
if((r1&0x1F)!=0x05)
{
SD_CS=1; //èç1ûó|′eÎa±¨′í£¬Ôò′ø′íÎó′úÂëÖ±½óíË3ö
return r1;
}
//μè′ySD¿¨D′èëíê3é
if(SD_WaitDataReady()==1)
{
SD_CS=1; //μè′ySD¿¨D′èëíê3é3¬ê±£¬Ö±½óíË3ö±¨′í
return 1;
}
}while(--count);//±¾sectorêy¾Y′«êäíê3é
//·¢½áêø′«êäáîÅÆ0xFD
r1 = SPIx_ReadWriteByte(0xFD);
if(r1==0x00)
{
count = 0xfe;
}
if(SD_WaitDataReady()) //μè′y×¼±¸oÃ
{
SD_CS=1;
return 1;
}
//D′èëíê3飬ƬѡÖÃ1
SD_CS=1;
SPIx_ReadWriteByte(0xff);
return count; //·μ»ØcountÖ죬èç1ûD′íêÔòcount=0£¬·ñÔòcount=1
} [/mw_shl_code]
|
|