引用自 2楼 584471964 的回复: 稍微修改了下,终于可以多块写了,附上修改后的代码:
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count)
{
u8 r1;
u16 i;
u16 retry;
//SPIx_SetSpeed(SPI_SPEED_HIGH);//设置为高速模式
if(SD_Type != SD_TYPE_V2HC)sector = sector<<9;//如果不是SDHC,给定的是sector地址,将其转换成byte地址
if(SD_Type != SD_TYPE_MMC) r1 = SD_SendCommand(ACMD23, count, 0x00);//如果目标卡不是MMC卡,启用ACMD23指令使能预擦除
r1 = SD_SendCommand(CMD25, sector, 0x00);//发多块写入指令
if(r1 != 0x00)return r1; //应答不正确,直接返回
SD_CS=0;//开始准备数据传输
SPIx_ReadWriteByte(0xff);//先放3个空数据,等待SD卡准备好
SPIx_ReadWriteByte(0xff);
//--------下面是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卡应答
while( SPIx_ReadWriteByte(0xff)!=0xff)
{
retry++;
if(retry==0xfffe) break;
}
// 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
}
引用自 2楼 584471964 的回复: 稍微修改了下,终于可以多块写了,附上修改后的代码:
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count)
{
u8 r1;
u16 i;
u16 retry;
//SPIx_SetSpeed(SPI_SPEED_HIGH);//设置为高速模式
if(SD_Type != SD_TYPE_V2HC)sector = sector<<9;//如果不是SDHC,给定的是sector地址,将其转换成byte地址
if(SD_Type != SD_TYPE_MMC) r1 = SD_SendCommand(ACMD23, count, 0x00);//如果目标卡不是MMC卡,启用ACMD23指令使能预擦除
r1 = SD_SendCommand(CMD25, sector, 0x00);//发多块写入指令
if(r1 != 0x00)return r1; //应答不正确,直接返回
SD_CS=0;//开始准备数据传输
SPIx_ReadWriteByte(0xff);//先放3个空数据,等待SD卡准备好
SPIx_ReadWriteByte(0xff);
//--------下面是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卡应答
while( SPIx_ReadWriteByte(0xff)!=0xff)
{
retry++;
if(retry==0xfffe) break;
}
// 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
}
举报