为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

大家读写SD卡怎么不用SD模式方式读取【精品文档-doc】

2017-11-12 14页 doc 44KB 5阅读

用户头像

is_833902

暂无简介

举报
大家读写SD卡怎么不用SD模式方式读取【精品文档-doc】大家读写SD卡怎么不用SD模式方式读取【精品文档-doc】大家读写SD卡怎么不用SD模式方式读取,是SPI方式读取简单?下面贴一段代码,是在FPGA上程序,只能用SD模式进行读,没有文件系统,没有用AVR硬件实现,电路图:电路说明,SD_DAT3一直给高电平程序:#ifndef__SD_Card_H__#define__SD_Card_H__#defineHigh1#defineLow0//---------------------------------------------------------------------...
大家读写SD卡怎么不用SD模式方式读取【精品文档-doc】
大家读写SD卡怎么不用SD模式方式读取【精品文档-doc】大家读写SD卡怎么不用SD模式方式读取,是SPI方式读取简单?下面贴一段代码,是在FPGA上程序,只能用SD模式进行读,没有文件系统,没有用AVR硬件实现,电路图:电路,SD_DAT3一直给高电平程序:#ifndef__SD_Card_H__#define__SD_Card_H__#defineHigh1#defineLow0//-------------------------------------------------------------------------//SDCardSetI/ODirection#defineSD_CMD_INDDRX.1=Low#defineSD_CMD_OUTDDRX.1=High#defineSD_DAT_INDDRX.2=Low#defineSD_DAT_OUTDDRX.2=High#defineSD_CLK_OUTDDRX.3=High#defineSD_DAT3_OUTDDRX.0=High//SDCardOutputHigh/Low#defineSD_CMD_LOWPORTX.1=Low#defineSD_CMD_HIGHPORTX.1=High#defineSD_DAT_LOWPORTX.2=Low#defineSD_DAT_HIGHPORTX.2=High#defineSD_CLK_LOWPORTX.3=Low#defineSD_CLK_HIGHPORTX.3=High#defineSD_DAT3_HIGHPORTX.0=High//SDCardInputRead#defineSD_TEST_CMDPINX.1#defineSD_TEST_DATPINX.2//-------------------------------------------------------------------------#defineBYTEunsignedchar#defineUINT16unsignedint#defineUINT32unsignedlong//-------------------------------------------------------------------------voidNcr(void);voidNcc(void);BYTEresponse_R(BYTE);BYTEsend_cmd(BYTE*);BYTESD_read_lba(BYTE*,UINT32,UINT32);BYTESD_card_init(void);//-------------------------------------------------------------------------BYTEread_status;BYTEresponse_buffer[20];BYTERCA[2];BYTEcmd_buffer[5];constBYTEcmd0[5]={0x40,0x00,0x00,0x00,0x00};constBYTEcmd55[5]={0x77,0x00,0x00,0x00,0x00};constBYTEcmd2[5]={0x42,0x00,0x00,0x00,0x00};constBYTEcmd3[5]={0x43,0x00,0x00,0x00,0x00};constBYTEcmd7[5]={0x47,0x00,0x00,0x00,0x00};constBYTEcmd9[5]={0x49,0x00,0x00,0x00,0x00};constBYTEcmd16[5]={0x50,0x00,0x00,0x02,0x00};constBYTEcmd17[5]={0x51,0x00,0x00,0x00,0x00};constBYTEacmd6[5]={0x46,0x00,0x00,0x00,0x02};constBYTEacmd41[5]={0x69,0x0f,0xf0,0x00,0x00};constBYTEacmd51[5]={0x73,0x00,0x00,0x00,0x00};//-------------------------------------------------------------------------voidNcr(void){SD_CMD_IN;SD_CLK_LOW;SD_CLK_HIGH;SD_CLK_LOW;SD_CLK_HIGH;}//-------------------------------------------------------------------------voidNcc(void){inti;for(i=0;i<8;i++){SD_CLK_LOW;SD_CLK_HIGH;}}//-------------------------------------------------------------------------BYTESD_card_init(void){BYTEx,y;SD_CMD_OUT;SD_DAT_IN;SD_CLK_HIGH;SD_CMD_HIGH;SD_DAT_LOW;read_status=0;for(x=0;x<40;x++)Ncr();for(x=0;x<5;x++)cmd_buffer[x]=cmd0[x];y=send_cmd(cmd_buffer);do{for(x=0;x<40;x++);Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd55[x];y=send_cmd(cmd_buffer);Ncr();if(response_R(1)>1)//responsetoolongorcrcerrorreturn1;Ncc();for(x=0;x<5;x++)cmd_buffer[x]=acmd41[x];y=send_cmd(cmd_buffer);Ncr();}while(response_R(3)==1);Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd2[x];y=send_cmd(cmd_buffer);Ncr();if(response_R(2)>1)return1;Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd3[x];y=send_cmd(cmd_buffer);Ncr();if(response_R(6)>1)return1;RCA[0]=response_buffer[1];RCA[1]=response_buffer[2];Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd9[x];cmd_buffer[1]=RCA[0];cmd_buffer[2]=RCA[1];y=send_cmd(cmd_buffer);Ncr();if(response_R(2)>1)return1;Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd7[x];cmd_buffer[1]=RCA[0];cmd_buffer[2]=RCA[1];y=send_cmd(cmd_buffer);Ncr();if(response_R(1)>1)return1;Ncc();for(x=0;x<5;x++)cmd_buffer[x]=cmd16[x];y=send_cmd(cmd_buffer);Ncr();if(response_R(1)>1)return1;read_status=1;//sdcardreadyreturn0;}//-------------------------------------------------------------------------BYTESD_read_lba(BYTE*buff,UINT32lba,UINT32seccnt){BYTEc=0;UINT32i,j;lba+=101;for(j=0;j<seccnt;j++){{Ncc();cmd_buffer[0]=cmd17[0];cmd_buffer[1]=(lba>>15)&0xff;cmd_buffer[2]=(lba>>7)&0xff;cmd_buffer[3]=(lba<<1)&0xff;cmd_buffer[4]=0;lba++;send_cmd(cmd_buffer);Ncr();}while(1){SD_CLK_LOW;SD_CLK_HIGH;if(!(SD_TEST_DAT))break;}for(i=0;i<512;i++){BYTEk;for(k=0;k<8;k++){SD_CLK_LOW;SD_CLK_HIGH;c<<=1;if(SD_TEST_DAT)c|=0x01;}*buff=c;buff++;}for(i=0;i<16;i++){SD_CLK_LOW;SD_CLK_HIGH;}}read_status=1;//SDdatanextinreturn0;}//-------------------------------------------------------------------------BYTEresponse_R(BYTEs){BYTEa=0,b=0,c=0,r=0,crc=0;BYTEi,j=6,k;while(1){SD_CLK_LOW;SD_CLK_HIGH;if(!(SD_TEST_CMD))break;if(crc++>100)return2;}crc=0;if(s==2)j=17;for(k=0;k<j;k++){c=0;if(k>0)//forcrcculcarb=response_buffer[k-1];for(i=0;i<8;i++){SD_CLK_LOW;if(a>0)c<<=1;elsei++;a++;SD_CLK_HIGH;if(SD_TEST_CMD)c|=0x01;if(k>0){crc<<=1;if((crc^b)&0x80)crc^=0x09;b<<=1;crc&=0x7f;}}if(s==3){if(k==1&&(!(c&0x80)))r=1;}response_buffer[k]=c;}if(s==1||s==6){if(c!=((crc<<1)+1))r=2;}returnr;}//-------------------------------------------------------------------------BYTEsend_cmd(BYTE*in){inti,j;BYTEb,crc=0;SD_CMD_OUT;for(i=0;i<5;i++){b=in[i];for(j=0;j<8;j++){SD_CLK_LOW;if(b&0x80)SD_CMD_HIGH;elseSD_CMD_LOW;crc<<=1;SD_CLK_HIGH;if((crc^b)&0x80)crc^=0x09;b<<=1;}crc&=0x7f;}crc=((crc<<1)|0x01);b=crc;for(j=0;j<8;j++){SD_CLK_LOW;if(crc&0x80)SD_CMD_HIGH;elseSD_CMD_LOW;SD_CLK_HIGH;crc<<=1;}returnb;}//-------------------------------------------------------------------------#endif这些程序有些我也不明白,贴出来希望大家一起探讨交流,打破网站SD卡用SPI方式读写的垄断局面,哈哈sd模式下应该有4各data吧,怎么你的只用一个?SPI模式是1Bit的SD模式是1Bit或4BitSD卡确实也像USB一样分为全速(FULL-SPEED)卡和低速卡(LOW-SPEED)。全速卡支持SPI,1BIT和4BIT的传输模式,可以工作在0-25MHz,并且可以提供高达10MB/S的传输速率;低速卡仅支持SPI和1BIT的传输模式,4BIT属于可选模式,可以工作在0-400KHz.在SD模式下,用软件将数据拆分,计算CRC16的时间都占了大头,实际速度不比SPI模式快多少!SD模式的读有优势吧。写的时候SD模式下就多了CRC16(刚接触实际的东西,所以不太了解CRC16的时间问题,见笑),但是读不管哪种模式下,不是都有CRC校验的,SD模式到底还有那些优势呢,请教关注一下,SD的读写方式资料太少,或是英文资料太难看
/
本文档为【大家读写SD卡怎么不用SD模式方式读取【精品文档-doc】】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索