SD卡实验中有个u8 SD_WriteDisk(u8 *buf,u32 sector,u8 cnt)函数:
[mw_shl_code=c,true]//写SD卡
//buf:数据缓存区
//sector:起始扇区号
//cnt:扇区个数
//返回值:0,ok;其他,失败.
u8 SD_WriteDisk(u8 *buf,u32 sector,u8 cnt)
{
u8 r1;
if(SD_Type!=SD_TYPE_V2HC) sector<<=9;//转换为字节地址
if(cnt==1)
{
r1=SD_SendCmd(CMD24,sector,0X01);//读命令
if(r1==0)//指令发送成功
{
r1=SD_SendBlock(buf,0xFE);//写512个字节
}
}
else
{
if(SD_Type!=SD_TYPE_MMC)
{
SD_SendCmd(CMD55,0,0X01); //告诉SD卡下一个是特殊应用命令(ACMD)
SD_SendCmd(CMD23,cnt,0X01); //ACMD23,设置写前预擦除的数据块数,用来加速多数据块写操作
}
r1=SD_SendCmd(CMD25,sector,0X01);//连续写命令
if(r1==0)
{
do
{
r1=SD_SendBlock(buf,0xFC);//发送512个字节
buf+=512;
}
while(--cnt && r1==0);
r1=SD_SendBlock(0,0xFD);//发送512个字节
}
}
SD_DisSelect();//取消片选
return r1;//
} [/mw_shl_code]
最后一句r1=SD_SendBlock(0,0xFD);//发送512个字节 意义何在?这是SD_SendBlock函数:
[mw_shl_code=c,true]//向sd卡写入一个数据包的内容 512字节
//buf:数据缓存区
//cmd:指令
//返回值:0,成功;其他,失败;
u8 SD_SendBlock(u8 *buf,u8 cmd)
{
u16 t;
if(SD_WaitReady()) return 1;//等待上次写操作完成
SD_SPI_ReadWriteByte(cmd);
if(cmd!=0XFD)//不是结束指令
{
for(t=0;t<512;t++) SPI2_ReadWriteByte(buf[t]);//提高速度,减少函数传参时间
SD_SPI_ReadWriteByte(0xFF);//忽略crc
SD_SPI_ReadWriteByte(0xFF);
t=SD_SPI_ReadWriteByte(0xFF);//接收响应
if((t&0x1F)!=0x05) return 2;//响应错误
}
return 0;//写入成功
}[/mw_shl_code]
SD_SendBlock函数输入参数1为指针变量,这里居然输入0,这是不允许的吧?
输入参数2为发送的命令,这里为0xFD,可函数体中的if语句将0xfd给剃掉了,不会执行括号内的内容。
也就只有
if(SD_WaitReady()) return 1;//等待上次写操作完成
SD_SPI_ReadWriteByte(cmd);
不就是等待回复0xFF,再发送0XFD。这有何作用,能干嘛呢?
r1=SD_SendBlock(0,0xFD);要是按注释写的是发送512个字节,我就纳闷了,已经将cnt个扇区发送出去了,再加一个扇区(512字节)这是作何?
|