1、模电资料库SD卡SD模式读写的方式大家读写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 #de
2、fineSD_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_DAT
3、3_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)
4、; /- BYTEread_status; BYTEresponse_buffer20; BYTERCA2; BYTEcmd_buffer5; constBYTEcmd05=0x40,0x00,0x00,0x00,0x00; constBYTEcmd555=0x77,0x00,0x00,0x00,0x00; constBYTEcmd25=0x42,0x00,0x00,0x00,0x00; constBYTEcmd35=0x43,0x00,0x00,0x00,0x00; constBYTEcmd75=0x47,0x00,0x00,0x00,0x00; constBYTEcmd95=0x49,0x
5、00,0x00,0x00,0x00; constBYTEcmd165=0x50,0x00,0x00,0x02,0x00; constBYTEcmd175=0x51,0x00,0x00,0x00,0x00; constBYTEacmd65=0x46,0x00,0x00,0x00,0x02; constBYTEacmd415=0x69,0x0f,0xf0,0x00,0x00; constBYTEacmd515=0x73,0x00,0x00,0x00,0x00; /- voidNcr(void) SD_CMD_IN; SD_CLK_LOW; SD_CLK_HIGH; SD_CLK_LOW; SD_C
6、LK_HIGH; /- voidNcc(void) inti; for(i=0;i8;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;x40;x+) Ncr(); for(x=0;x5;x+) cmd_bufferx=cmd0x; y=send_cmd(cmd_buffer); do for(x=0;x40;x+); Ncc(); for(x=0;x
7、1)/responsetoolongorcrcerror return1; Ncc(); for(x=0;x5;x+) cmd_bufferx=acmd41x; y=send_cmd(cmd_buffer); Ncr(); while(response_R(3)=1); Ncc(); for(x=0;x1) return1; Ncc(); for(x=0;x1) return1; RCA0=response_buffer1; RCA1=response_buffer2; Ncc(); for(x=0;x1) return1; Ncc(); for(x=0;x1) return1; Ncc();
8、 for(x=0;x1) return1; read_status=1;/sdcardready return0; /- BYTESD_read_lba(BYTE*buff,UINT32lba,UINT32seccnt) BYTEc=0; UINT32i,j; lba+=101; for(j=0;j15)&0xff; cmd_buffer2=(lba7)&0xff; cmd_buffer3=(lba1)&0xff; cmd_buffer4=0; lba+; send_cmd(cmd_buffer); Ncr(); while(1) SD_CLK_LOW; SD_CLK_HIGH; if(!(S
9、D_TEST_DAT) break; for(i=0;i512;i+) BYTEk; for(k=0;k8;k+) SD_CLK_LOW; SD_CLK_HIGH; c=1; if(SD_TEST_DAT) c|=0x01; *buff=c; buff+; for(i=0;i100) return2; crc=0; if(s=2) j=17; for(k=0;k0)/forcrcculcar b=response_bufferk-1; for(i=0;i0) c0) crc=1; if(crcb)&0x80) crc=0x09; b=1; crc&=0x7f; if(s=3) if(k=1&(
10、!(c&0x80) r=1; response_bufferk=c; if(s=1|s=6) if(c!=(crc1)+1) r=2; returnr; /- BYTEsend_cmd(BYTE*in) inti,j; BYTEb,crc=0; SD_CMD_OUT; for(i=0;i5;i+) b=ini; for(j=0;j8;j+) SD_CLK_LOW; if(b&0x80) SD_CMD_HIGH; else SD_CMD_LOW; crc=1; SD_CLK_HIGH; if(crcb)&0x80) crc=0x09; b=1; crc&=0x7f; crc=(crc1)|0x0
11、1); b=crc; for(j=0;j8;j+) SD_CLK_LOW; if(crc&0x80) SD_CMD_HIGH; else SD_CMD_LOW; SD_CLK_HIGH; crc=1; returnb; /- #endif 这些程序有些我也不明白,贴出来希望大家一起探讨交流,打破网站SD卡用SPI方式读写的垄断局面,哈哈,sd模式下应该有4各data吧,怎么你的只用一个?SPI模式是1Bit的 SD模式是1Bit或4Bit SD卡确实也像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模式到底还有那些优势呢,请教
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1