|
我的写单块程序如下:时序我仔细看过了,都没问题,crc16校验也正确,就是写不进去。求高手路过
指点迷津。。。。
bool SD_write_block(alt_u32 block_num , alt_u8 *buff)
{
int i,j;
alt_u8 rsp,data,crc_status=0;
alt_16 crc,crc0;
alt_u32 addr;
SD_DAT_OUT;
Ncc();
addr = block_num * 512;
cmd_buffer[0] = cmd24[0]; // CMD24: Read Single Block
cmd_buffer[1] = (addr >> 24 ) & 0xFF; // MSB
cmd_buffer[2] = (addr >> 16 ) & 0xFF;
cmd_buffer[3] = (addr >> 8 ) & 0xFF;
cmd_buffer[4] = addr & 0xFF; // LSB
send_cmd(cmd_buffer);
Ncr();
rsp = response_R(1);
if(rsp > 1)
{ printf("rsp fail !\n");
return FALSE;
}
else
printf("rsp right !\n");
Ncc();
SD_CLK_LOW; //start bit = 0
SD_DAT_LOW;
SD_CLK_HIGH;
for(i=0;i<512;i++)
{
data = buff[i];
for(j=0;j<8;j++)
{
SD_CLK_LOW;
if(data & 0x80)
SD_DAT_HIGH;
else
SD_DAT_LOW;
SD_CLK_HIGH;
data <<= 1;
}
}
crc = cal_crc(buff , 512);
printf("crc :: %x \n",crc);
crc0 = 0;
for(i=0;i<16;i++)
{
SD_CLK_LOW;
crc0 <<=1;
if(crc & 0x8000)
{
SD_DAT_HIGH;
crc0 |= 0x0001;
}
else
SD_DAT_LOW;
SD_CLK_HIGH;
crc <<= 1;
}
printf(" crc0 : %x \n" , crc0);
SD_CLK_LOW;
SD_DAT_HIGH;
SD_CLK_HIGH;
Ncc();
SD_DAT_IN;
i = 0;
while(1)
{
SD_CLK_LOW;
SD_CLK_HIGH;
if((SD_TEST_DAT & 0x01)== 0)
break;
i++;
if(i>500)
{
printf(" there is not data rsp!\n");
break;
}
}
for(i=0;i<8;i++)
{
SD_CLK_LOW;
SD_CLK_HIGH;
crc_status <<= 1;
if((SD_TEST_DAT & 0x01))
crc_status |= 0x01;
}
printf("crc_status : %d \n" , crc_status);
for(i=0;i<16;i++)
{
SD_CLK_LOW;
SD_CLK_HIGH;
}
return TRUE;
} |
|