📄 sd_drv.c
字号:
}
if( i == 500 )
{
// ABORT: invalid response for read single block command
//aos_printf(MPE_DRV," sd write cmd status=0x%x",status);
AOS_ASSERT(0);
result = AOS_FAIL;
goto done;
}
// BLOCK 0xFC 2-513 CRC16 (515Bytes)
// Now for the "Start Block" token (0xFC) "End Blcok" token (0xFD)
for( i=0; i< len/BLOCK_SIZE; i++)
{
status = 0xFC;
spi_write(&status,1);
spi_write(buf,BLOCK_SIZE);
status=0xFF;
// write two CRC bytes
spi_write(&status,1);
spi_write(&status,1);
hw_delay(100);
status = sd_wait_for_r1();
if (!(((status&0x0F)==0x5)||(status==0)))
{
AOS_ASSERT(0);
// aos_printf(MPE_DRV,"multi write fail response=0x%x,the %d block",status,i);
}
buf += BLOCK_SIZE;
// 等待 busy 结束
j=0;
do
{
status = spi_read();
j++;
if (j==1000)
break;
} while(status==0);
}
// stop multi block writing
status = 0xFD;
spi_write(&status,1);
// 等待 busy 结束
i=0;
do
{
status = spi_read();
i++;
if (i==20000)
{
AOS_ASSERT(0);
goto done;
}
}
while(status==0);
//aos_printf(MPE_DRV,"after write multi block data response the first busy times is %d",i);
//先拉高 cs ,再使能cs
spi_disable_cs();
spi_enable_cs();
//等待 busy 结束
i=0;
do
{
status = spi_read();
i++;
if (i==5000)
{
AOS_ASSERT(0);
goto done;
}
}while(status==0);
//aos_printf(MPE_DRV,"after write multi block data response the last busy times is %d",i);
// send status R2 response
for( i=0; i< 500; i++ )
{
status_r2 = sd_write_cmd_r2(CMD13_SEND_STATUS_BLOCK);
if(status_r2 == 0)
{
result = AOS_SUCC;
break;
}
// ABORT: invalid response for read single block command
//aos_printf(MPE_DRV," sd write status=0x%x",status_r2);
result = AOS_FAIL;
}
done:
// Following a read transaction, the SD Card needs 8 clocks after the end
// bit of the last data block to finish up its work.
status=0xFF;
spi_write(&status,1);
spi_disable_cs();
return result;
}
/******************************************************************************
函数: drv_read_sd_card
描述:
主程序每10秒 定时 检查SD卡是否存在 ,第一次要 初始化
输入:
输出:
返回:
******************************************************************************/
void drv_read_sd_card(void)
{
if( !is_gmpub_board() )
return;
if( !is_sd_card_in() )
{
sdcard_pos = FALSE;
}
else
{
if( !sdcard_pos )
{
aos_printf(MPE_SYS," reinit the sd-card.");
sd_card_init();
}
}
}
/*
void sd_test2(U8 para1)
{
sd_mem_write(0x0,(U32)szTestBuf, 640); //from mem to sd
aos_printf(0," mem:0 len=64");
debug_mem_show(0,(U32)szTestBuf, 64);
aos_task_delay(10);
aos_printf(0," mem:512 len=64");
debug_mem_show(0,(U32)szTestBuf+512, 64);
aos_task_delay(10);
aos_printf(0," mem:1024 len=64");
debug_mem_show(0,(U32)szTestBuf+1024, 64);
aos_task_delay(10);
aos_printf(0," mem:1536 len=64");
debug_mem_show(0,(U32)szTestBuf+1536, 64);
aos_task_delay(10);
aos_printf(0," mem:2048 len=64");
debug_mem_show(0,(U32)szTestBuf+2048, 64);
aos_task_delay(10);
}
void sd_test4(U8 para1)
{
aos_memset(szTestBuf,para1,LENSIZE);
szTestBuf[0]=0xFF;
szTestBuf[LENSIZE-1]=0xFF;
if (para1 < 10 )
move_ram_to_sd((U32)szTestBuf,0x0,LENSIZE,MPE_DRV,0);
else
move_ram_to_sd((U32)szTestBuf,0x10,LENSIZE,MPE_DRV,0);
}
U32 sd_test3(U8 para1,U8 para2)
{
if( para1 == 0)
{
aos_memset(szTestBuf,0x11,512*5);
// aos_printf(0," mem:0 len=64\n");
//debug_mem_show(0,(U32)szTestBuf, 64);
//aos_task_delay(10);
if( AOS_FAIL == sd_write_block(0,szTestBuf)) //write from Buf to sd 0
{
AOS_ASSERT(0);
aos_printf(0, "SD TEST:write error ");
return AOS_FAIL;
}
aos_printf(0, "SD TEST:write correct ");
aos_task_delay(200);
if( AOS_FAIL == sd_read_block(0,TestBuf1)) //read from sd 0 to Buf1
{
AOS_ASSERT(0);
aos_printf(0, "SD TEST:read error ");
return AOS_FAIL;
}
aos_printf(0, "SD TEST:read correct ,TestBuf1: len=64\n");
debug_mem_show(0,(U32)TestBuf1+500, 64);
return AOS_SUCC;
}
if( para1 == 1 )
{
sd_read_csd_config();
sd_get_card_volume();
}
if( para1 == 2 )
{
aos_memset(szTestBuf,0x55,512*5);
sd_write_multi_block(0, szTestBuf, 512*5);
}
if( para1 == 3 )
{
aos_memset(szTestBuf,0x55,512);
sd_mem_write(10, szTestBuf, 512);
}
if( para1 == 4 )
{
sd_erase_block(0, 4096);
}
}*/
/******************************************************************************
函数: sd_readwrite_time
描述:
SD 卡读写一块数据所用时间,方便 sh 命令,为了不破坏数据 ,只提供读操作
输入: void
输出:
返回: void
******************************************************************************/
VOID sd_readwrite_time(void)
{
U8 TestspeedBuf0[512]={0};
// U8 TestspeedBuf1[600]={0};
U32 readblock_sec;
// U32 writeblock_sec,writeblock_usec;
CPU_TICK_S stCpuTick_read_start,stCpuTick_read_end;
//CPU_TICK_S stCpuTick_write_start,stCpuTick_write_end;
//aos_printf(MPE_SYS,"current SD card volume is %d M Bytes.",g_SDVolume);
//test read a block speed
aos_cputick_get(&stCpuTick_read_start);
sd_read_block(0, TestspeedBuf0); //read sd 0 to mem
aos_cputick_get(&stCpuTick_read_end);
aos_cputick_sub(&stCpuTick_read_end,&stCpuTick_read_start);
aos_cputick_2us(&stCpuTick_read_end,&readblock_sec,&g_readBlock_usec);
// aos_printf(MPE_SYS,"read oneblock time is %dus", g_readBlock_usec);
/*
//test write a block speed
aos_cputick_get(&stCpuTick_write_start);
sd_write_block(0x400, TestspeedBuf1); //from szTestBuf to 0(sd),
aos_cputick_get(&stCpuTick_write_end);
aos_cputick_sub(&stCpuTick_write_end,&stCpuTick_write_start);
aos_cputick_2us(&stCpuTick_write_end,&writeblock_sec,&writeblock_usec);
aos_printf(MPE_SYS,"write oneblock(to SD 0x400) time is %dus\n",writeblock_usec );
*/
}
/******************************************************************************
函数: sd_gmpu_debug_msg_proc
描述:
SD卡调试命令
CMD 50 0 帮助
CMD 50 1 初始化SD卡
CMD 50 2 ulPara1 从地址ulPara1 读一块并显示
CMD 50 3 ulPara1 ulPara2 写一块数据ulPara1 到SD地址ulPara2
CMD 50 4 ulPara1 ulPara2 写多块数据ulPara1 到SD地址ulPara2
CMD 50 5 ulPara1 从 地址ulPara1 读5块数据并显示
CMD 50 6 ulPara1 ulPara2 写数据ulPara1到SD地址ulPara2
CMD 50 7 0 (1 2) 命令时序
CMD 50 8 ulPara1 读起始地址为ulPara1的10块数据,计算时间
CMD 50 9 ulPara1 写10块0x55数据到ulPara1,计算总时间
输入:U32 ulCmd, 命令号
U32 ulPara1 ,ulPara2 参数,用于数据和地址
U32 ulPara3,ulPara4, 暂时没有用
输出:
返回:void
******************************************************************************/
VOID sd_gmpu_debug_msg_proc(U32 ulCmd, U32 ulPara1, U32 ulPara2, U32 ulPara3, U32 ulPara4)
{
U8 status;
U32 readblock_sec,readblock_usec;
U32 writeblock_sec,writeblock_usec;
CPU_TICK_S stCpuTick_read_start,stCpuTick_read_end;
CPU_TICK_S stCpuTick_write_start,stCpuTick_write_end;
switch( ulCmd )
{
case 0x0:
aos_printf(MPE_DRV,"0 sdcard test help ");
aos_printf(MPE_DRV,"1 spi_sdcard_init() ");
aos_printf(MPE_DRV,"2 sd_read_block ");
aos_printf(MPE_DRV,"3 sd_write_block ");
aos_printf(MPE_DRV,"4 sd_write_multi_block ");
aos_printf(MPE_DRV,"5 sd_mem_read ");
aos_printf(MPE_DRV,"6 sd_mem_write ");
aos_printf(MPE_DRV,"7 command test\n");
break;
case 0x1:
if (AOS_SUCC==spi_sdcard_init())
aos_printf(MPE_DRV,"SPI MODE SDcard initiazation success!\n");
break;
//读一块
case 0x2:
sd_read_block(ulPara1, szTestBuf); //read sd 0 to mem
debug_mem_show(MPE_DRV,(U32)szTestBuf, 64);
break;
//写一块
case 0x03:
aos_memset(szTestBuf,(U8)ulPara1,512*5);//ulPara1 denote 一个十进制数据
//aos_printf(MPE_DRV,"the first mem\n");
//debug_mem_show(MPE_DRV,(U32)szTestBuf1, 64);//aos_memset(szTestBuf0,0x55,512*5);
sd_write_block(ulPara2, szTestBuf); //from szTestBuf to 0(sd),ulPara2 denote SD address
aos_task_delay(10);
sd_read_block(ulPara2, szTestBuf1); //read sd 0 to mem
//aos_printf(MPE_DRV,"the last mem\n");
debug_mem_show(MPE_DRV,(U32)szTestBuf1, 64);
//debug_mem_show(0,(U32)szTestBuf1, 64);
break;
// 写多块
case 0x04:
//aos_memset(szTestBuf0,0x55,512*5);
aos_memset(szTestBuf,(U8)ulPara1,512*5); //ulPara1 denote 一个十进制数据
sd_write_multi_block(ulPara2, szTestBuf, 512*5);//ulPara2 denote SD address
break;
case 0x05: //read from sd to mem
sd_mem_read(ulPara1, (U32)szTestBuf, 512*5);
aos_printf(MPE_DRV," mem:0 len=64");
debug_mem_show(MPE_DRV,(U32)szTestBuf, 64);
aos_task_delay(10);
aos_printf(MPE_DRV," mem:512 len=64");
debug_mem_show(MPE_DRV,(U32)szTestBuf+512, 64);
aos_task_delay(10);
aos_printf(MPE_DRV," mem:1024 len=64");
debug_mem_show(MPE_DRV,(U32)szTestBuf+1024, 64);
aos_task_delay(10);
aos_printf(MPE_DRV," mem:1536 len=64");
debug_mem_show(MPE_DRV,(U32)szTestBuf+1536, 64);
aos_task_delay(10);
aos_printf(MPE_DRV," mem:2048 len=64");
debug_mem_show(MPE_DRV,(U32)szTestBuf+2048, 64);
break;
case 0x06: //write from mem to sd
aos_memset(szTestBuf,ulPara1,512*5);
sd_mem_write(ulPara2, (U32)szTestBuf, 512*5);
break;
// command test
case 0x07:
switch(ulPara1)
{
case 0x0:
aos_printf(MPE_DRV,"SPI command test.\n");
aos_printf(MPE_DRV,"cmd0 test.\n");
aos_printf(MPE_DRV,"cmd1 test.\n");
aos_printf(MPE_DRV,"cmd55 test.\n");
aos_printf(MPE_DRV,"acmd41 test.");
break;
case 0x01:
spi_enable_cs();
status = sd_write_command(CMD0_GO_IDLE_STATE); //response r1
spi_disable_cs();
aos_printf(MPE_DRV,"cmd0 response is %d",status);
break;
default:
break;
}
break;
//test read 10 block speed
case 0x08:
clear_watch_dog();
aos_cputick_get(&stCpuTick_read_start);
sd_mem_read(ulPara1, (U32)szTestBuf, 512*10);
//sd_read_block(0, TestspeedBuf0); //read sd 0 to mem
aos_cputick_get(&stCpuTick_read_end);
aos_cputick_sub(&stCpuTick_read_end,&stCpuTick_read_start);
aos_cputick_2us(&stCpuTick_read_end,&readblock_sec,&readblock_usec);
//g_ReadBlock_usec =readblock_usec;
aos_printf(MPE_SYS,"read 10 block time is %dus\n", readblock_usec);
// aos_task_delay(50);
break;
//test write a block speed
case 0x09:
clear_watch_dog();
aos_memset(szTestBuf,0x55,512*10);
aos_cputick_get(&stCpuTick_write_start);
sd_mem_write(ulPara1, (U32)szTestBuf, 512*10);
// sd_write_block(0x400, TestspeedBuf1); //from szTestBuf to 0(sd),
aos_cputick_get(&stCpuTick_write_end);
aos_cputick_sub(&stCpuTick_write_end,&stCpuTick_write_start);
aos_cputick_2us(&stCpuTick_write_end,&writeblock_sec,&writeblock_usec);
// g_WriteBlock_usec =writeblock_usec;
aos_printf(MPE_SYS,"write 10 block(t) time is %dus \n",writeblock_usec );
break;
default:
break;
}
}
#ifdef __cplusplus
}
#endif /* end of __cplusplus */
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -