《2023年SD卡SD模式读写的方式.pdf》由会员分享,可在线阅读,更多相关《2023年SD卡SD模式读写的方式.pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 大家读写 SD卡怎么不用 SD模式方式读取,是 SPI 方式读取简单?下面贴一段代码,是在 FPGA 上程序,只能用 SD模式进行读,没有文件系统,没有用 AVR硬件实现,电路图:电路说明,SD_DAT3 一直给高电平 程序:#ifndef _SD_Card_H_#define _SD_Card_H_#define High 1#define Low 0/-/SD Card Set I/O Direction#define SD_CMD_IN DDRX.1=Low#define SD_CMD_OUT DDRX.1=High#define SD_DAT_IN DDRX.2=Low#define
2、 SD_DAT_OUT DDRX.2=High#define SD_CLK_OUT DDRX.3=High#define SD_DAT3_OUT DDRX.0=High/SD Card Output High/Low#define SD_CMD_LOW PORTX.1=Low#define SD_CMD_HIGH PORTX.1=High#define SD_DAT_LOW PORTX.2=Low#define SD_DAT_HIGH PORTX.2=High#define SD_CLK_LOW PORTX.3=Low#define SD_CLK_HIGH PORTX.3=High#defin
3、e SD_DAT3_HIGH PORTX.0=High/SD Card Input Read#define SD_TEST_CMD PINX.1#define SD_TEST_DAT PINX.2/-#define BYTE unsigned char#define UINT16 unsigned int#define UINT32 unsigned long/-void Ncr(void);void Ncc(void);BYTE response_R(BYTE);BYTE send_cmd(BYTE*);BYTE SD_read_lba(BYTE*,UINT32,UINT32);BYTE S
4、D_card_init(void);/-BYTE read_status;BYTE response_buffer20;BYTE RCA2;BYTE cmd_buffer5;const BYTE cmd05=0 x40,0 x00,0 x00,0 x00,0 x00;const BYTE cmd555=0 x77,0 x00,0 x00,0 x00,0 x00;const BYTE cmd25=0 x42,0 x00,0 x00,0 x00,0 x00;const BYTE cmd35=0 x43,0 x00,0 x00,0 x00,0 x00;const BYTE cmd75=0 x47,0
5、 x00,0 x00,0 x00,0 x00;const BYTE cmd95=0 x49,0 x00,0 x00,0 x00,0 x00;const BYTE cmd165=0 x50,0 x00,0 x00,0 x02,0 x00;const BYTE cmd175=0 x51,0 x00,0 x00,0 x00,0 x00;const BYTE acmd65=0 x46,0 x00,0 x00,0 x00,0 x02;const BYTE acmd415=0 x69,0 x0f,0 xf0,0 x00,0 x00;const BYTE acmd515=0 x73,0 x00,0 x00,
6、0 x00,0 x00;/-void Ncr(void)SD_CMD_IN;SD_CLK_LOW;SD_CLK_HIGH;SD_CLK_LOW;SD_CLK_HIGH;/-void Ncc(void)int i;for(i=0;i8;i+)SD_CLK_LOW;SD_CLK_HIGH;/-BYTE SD_card_init(void)BYTE x,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=cmd0 x
7、;y=send_cmd(cmd_buffer);do for(x=0;x40;x+);Ncc();for(x=0;x1)/response too long or crc error return 1;Ncc();for(x=0;x5;x+)cmd_bufferx=acmd41x;y=send_cmd(cmd_buffer);Ncr();while(response_R(3)=1);Ncc();for(x=0;x5;x+)cmd_bufferx=cmd2x;y=send_cmd(cmd_buffer);Ncr();if(response_R(2)1)return 1;Ncc();for(x=0
8、;x1)return 1;RCA0=response_buffer1;RCA1=response_buffer2;Ncc();for(x=0;x1)return 1;Ncc();for(x=0;x1)return 1;Ncc();for(x=0;x1)return 1;read_status=1;/sd card ready return 0;/-BYTE SD_read_lba(BYTE*buff,UINT32 lba,UINT32 seccnt)BYTE c=0;UINT32 i,j;lba+=101;for(j=0;j15)&0 xff;cmd_buffer2=(lba7)&0 xff;
9、cmd_buffer3=(lba1)&0 xff;cmd_buffer4=0;lba+;send_cmd(cmd_buffer);Ncr();while(1)SD_CLK_LOW;SD_CLK_HIGH;if(!(SD_TEST_DAT)break;for(i=0;i512;i+)BYTE k;for(k=0;k8;k+)SD_CLK_LOW;SD_CLK_HIGH;c=1;if(SD_TEST_DAT)c|=0 x01;*buff=c;buff+;for(i=0;i16;i+)SD_CLK_LOW;SD_CLK_HIGH;read_status=1;/SD data next in retu
10、rn 0;/-BYTE response_R(BYTE s)BYTE a=0,b=0,c=0,r=0,crc=0;BYTE i,j=6,k;while(1)SD_CLK_LOW;SD_CLK_HIGH;if(!(SD_TEST_CMD)break;if(crc+100)return 2;crc=0;if(s=2)j=17;for(k=0;k 0)/for crc culcar b=response_bufferk-1;for(i=0;i 0)c 0)crc=1;if(crc b)&0 x80)crc=0 x09;b=1;crc&=0 x7f;if(s=3)if(k=1&(!(c&0 x80)r
11、=1;response_bufferk=c;if(s=1|s=6)if(c!=(crc1)+1)r=2;return r;/-BYTE send_cmd(BYTE*in)int i,j;BYTE b,crc=0;SD_CMD_OUT;for(i=0;i 5;i+)b=ini;for(j=0;j8;j+)SD_CLK_LOW;if(b&0 x80)SD_CMD_HIGH;else SD_CMD_LOW;crc=1;SD_CLK_HIGH;if(crc b)&0 x80)crc=0 x09;b=1;crc&=0 x7f;crc=(crc1)|0 x01);b=crc;for(j=0;j8;j+)S
12、D_CLK_LOW;if(crc&0 x80)SD_CMD_HIGH;else SD_CMD_LOW;SD_CLK_HIGH;crc=1;return b;/-#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模式到底还有那些优势呢,请教