|
今天一来实验室,按照时序又走了一遍,一不小心,成功了,我内心的喜悦不知道该如何表达,只能是和大家共享来分享这一刻的心情。见代码(并参考注释):
//-------------------------SD_write_lba----------------------------------------
///////////利用CRC-----CCITT ---16校验码
BYTE SD_write_block(alt_u16 block_number, BYTE *buff)
{
UINT16 b = 0;
UINT16 crc=0;
BYTE temp = 0;
BYTE crc_status = 0;
///////////修改数据方式为out方式,即写方式。
SD_DAT_OUT;
UINT32 i,k,lba;
lba = block_number * 512;
Ncc();
cmd_buffer[0] = cmd24[0];
cmd_buffer[1] = (lba>>24)&0xff;
cmd_buffer[2] = (lba>>16)&0xff;
cmd_buffer[3] = (lba>>8)&0xff;
cmd_buffer[4] = lba&0xff;
send_cmd(cmd_buffer);
Ncr();
if(response_R(1)>1)
return 1;
Ncc();
////////////S bit
SD_CLK_LOW;
SD_DAT_LOW;
SD_CLK_HIGH;
/////////////content
for(i=0; i < 512; i++)
{
temp = buff [ i ];
for(k=0x80; k!=0; k=k>>1)
{
SD_CLK_LOW;
if(temp&k)
SD_DAT_HIGH;
else
SD_DAT_LOW;
SD_CLK_HIGH;
b = b*2;
if((b&0x10000))
b = b^0x11021;
if((temp&k))
b = b^(0x10000^0x11021);
}
}
crc = b;
// crc =((crc<<1)|0x01); //////////////end bit
////////////crc
for(i=0; i<16; i++)
{
SD_CLK_LOW;
if(crc&0x8000)
SD_DAT_HIGH;
else
SD_DAT_LOW;
SD_CLK_HIGH;
crc<<=1;
}
////////////////////////////////end bit
SD_CLK_LOW;
SD_DAT_HIGH;
SD_CLK_HIGH;
Ncc();
SD_DAT_IN; //////////读取CRC status,应当修改DAT的方向。
while(1) ////////////等待crc status Start 位
{
SD_CLK_LOW;
SD_CLK_HIGH;
if((SD_TEST_DAT & 0x01) == 0)
break;
}
for(i=0;i<8;i++)
{
SD_CLK_LOW;
SD_CLK_HIGH;
crc_status <<= 1;
if((SD_TEST_DAT & 0x01))
crc_status |= 0x01;
}
for(i=0;i<16;i++)
{
SD_CLK_LOW;
SD_CLK_HIGH;
}
write_status = 1;
return 0;
}
//------------------------------------------------------------------------- |
|