//--------下面是N个sector写入的循环部分 do {
//放起始令牌0xFC 表明是多块写入 SPIx_ReadWriteByte(0xFC); //放一个sector的数据 for(i=0;i<512;i++)
{
SPIx_ReadWriteByte(*data++); }
//发2个Byte的dummy CRC SPIx_ReadWriteByte(0xff); SPIx_ReadWriteByte(0xff); //等待SD卡应答
r1 = SPIx_ReadWriteByte(0xff); if((r1&0x1F)!=0x05)
{
sd_cs_1; //如果应答为报错,则带错误代码直接退出 return r1;
}
//等待SD卡写入完成
if(SD_WaitDataReady()==1) {
sd_cs_1; //等待SD卡写入完成超时,直接退出报错 return 1;
}
}while(--count);//本sector数据传输完成 //发结束传输令牌0xFD
r1 = SPIx_ReadWriteByte(0xFD); if(r1==0x00) {
count = 0xfe;
}
if(SD_WaitDataReady()) //等待准备好 {
sd_cs_1; return 1;
}
//写入完成,片选置1 sd_cs_1;
SPIx_ReadWriteByte(0xff);
return count; //返回count值,如果写完则count=0,否则count=1 }
//----------------------------------------------------------------------------- //在指定扇区,从offset开始读出bytes个字节
//输入:u32 sector 扇区地址(sector值,非物理地址) // u8 *buf 数据存储地址(大小<=512byte) // u16 offset 在扇区里面的偏移量 // u16 bytes 要读出的字节数 //返回值:0: 成功 // other:失败
u8 SD_Read_Bytes(unsigned long address,unsigned char *buf,unsigned int offset,unsigned int bytes) {
u8 r1;u16 i=0;
r1=SD_SendCommand(CMD17,address<<9,0);//发送读扇区命令 if(r1)return r1; //应答不正确,直接返回
sd_cs_0;//选中SD卡
if(SD_GetResponse(0xFE))//等待SD卡发回数据起始令牌0xFE {
sd_cs_1; //关闭SD卡 return 1;//读取失败
}
for(i=0;i for(;i