static BYTE SD_reset(void) { BYTE i; BYTE retry; BYTE rev = 0x00; for(i=0; i<10; i++) { DSPI_send_8_clocks(); //至少74个时钟,必须的!!! } //SD卡复位 //发送CMD0,正常跳出表示成功进入idle状态 for(retry=0; rev!=0x01; retry++) { rev = SD_send_cmd(0, 0); //发idle命令【?】 if(retry>100) { return 1; } } //SD卡初始化(CMD1/CMD55+ACMD41两种方法) for(retry=0; rev!=0x00; retry++) { rev = SD_send_cmd(1, 0); //发idle命令 if(retry>100) { return 2; } } rev = SD_send_cmd(59, 0); //关crc rev = SD_send_cmd(16, 512); //设扇区大小512 return 0; //正常返回 }
//----------------by-JJ----------------// BYTE SD_read_multiple_block(DWORD sector, DWORD n, BYTE buffer[][SD_SECTOR_SIZE]) { BYTE rev; WORD i; DWORD j; rev = SD_send_cmd(18, sector<<9); if(rev != 0x00) { return rev; } for (j=0; j<n; j++) { while(DSPI_read_write_byte(0xFF) != 0xFE){} for(i=0; i<SD_SECTOR_SIZE; i++) { buffer[j][i] = DSPI_read_write_byte(0xFF); } DSPI_read_write_byte(0xFF); DSPI_read_write_byte(0xFF); } SD_send_cmd(12, 0); //发送STOP_TRANSMISSION DSPI_send_8_clocks(); return 0; }
//----------------by-徐博----------------// BYTE SD_write_block(DWORD sector, const BYTE *buffer) //sector=address,buffer=数据缓存区 { BYTE rev; WORD i; rev = SD_send_cmd(24, sector<<9); //写命令,sector<<9:将地址左移9位,address=address*512,将块地址(扇区地址)转为字节地址 if(rev != 0x00) { return rev; //收到0x00表示成功 } DSPI_read_write_byte(0xff); DSPI_read_write_byte(0xff); DSPI_read_write_byte(0xff); DSPI_read_write_byte(0xfe); //发开始符 for(i=0; i<SD_SECTOR_SIZE; i++) //送512字节数据 { DSPI_read_write_byte(*buffer++); } DSPI_read_write_byte(0xFF); //写入2个字节的CRC校验码,Don't care DSPI_read_write_byte(0xFF); rev = DSPI_read_write_byte(0xFF); //读取返回值 if((rev&0x1f) != 0x05) //若返回值为XXX00101,说明数据已经被SD卡接受 { return rev; //写入失败 } //等待操作完 while(!DSPI_read_write_byte(0xFF)){} //等待SD卡不忙 DSPI_send_8_clocks(); //按SD卡操作时序补8个时钟 return 0; //说明写扇区操作成功 }
//----------------by-徐博----------------// BYTE SD_read_block(DWORD sector, BYTE *buffer) //sector=address,buffer=数据缓冲区 { BYTE rev; WORD i; rev = SD_send_cmd(17, sector<<9); //读命令,发送CMD17,收到0x00表示成功 if(rev != 0x00) { return rev; } //等数据的开始 while(DSPI_read_write_byte(0xFF) != 0xFE){}//连续读直到读到开始字节0xfe for(i=0; i<SD_SECTOR_SIZE; i++) //读512个数据,写入数据缓冲区 { *buffer++ = DSPI_read_write_byte(0xFF); } DSPI_read_write_byte(0xFF); //读两个CRC字节 DSPI_read_write_byte(0xFF); DSPI_send_8_clocks(); //按时序补8个时钟 return 0; //读取操作成功 }
//----------------by-JJ----------------// BYTE SD_write_multiple_block(DWORD sector, DWORD n, const BYTE buffer[][SD_SECTOR_SIZE]) { BYTE rev; WORD i; DWORD j; rev = SD_send_cmd(25, sector<<9); if(rev != 0x00) { return rev; } DSPI_read_write_byte(0xff); DSPI_read_write_byte(0xff); for(i=0; i<n; i++) { DSPI_read_write_byte(0xfc); for(j=0; j<SD_SECTOR_SIZE; j++) { DSPI_read_write_byte(buffer[i][j]); } DSPI_read_write_byte(0xFF); DSPI_read_write_byte(0xFF); rev = DSPI_read_write_byte(0xFF); if((rev&0x1f) != 0x05) { return rev; } while(!DSPI_read_write_byte(0xFF)){} } DSPI_read_write_byte(0xfb); while(!DSPI_read_write_byte(0xFF)){} //SD_send_cmd(12, 0); //这句话导致后续的多扇区读出错 DSPI_send_8_clocks(); return 0; }
char write_string_to_files(uchar * data) { int waitCnt=0; int maxWaitCnt = 100000; NORMALTIME time; uchar fileName[30];//本来只有13长度,怕越界了 time = Time_GetTime(); sprintf(fileName,"%02d%02d%02d%02d.txt",time.tm_year-2000,time.tm_mon,time.tm_mday,time.tm_hour); //①获取系统状态 //---------------------------------------------------------------------------- waitCnt=0; while(IS_SD_BUSY) { waitCnt++; if(waitCnt>maxWaitCnt) { return 7; } };//先判断SD是否忙 SD_read_system();//上电后串口第一个字节发不出去 SD_read_system(); //等待状态 F_wait_response = 0x01; SD_cmd_return_byte = 0; waitCnt = 0; while(F_wait_response) { waitCnt++; if(waitCnt>maxWaitCnt) { return 1; } }; if((SD_cmd_return_byte & 0xCF) == 0x0D)//没有文件打开 { } else if((SD_cmd_return_byte & 0xCF) == 0x1D)//已经有文件打开 则关闭 { SD_close_file(); while(IS_SD_BUSY); } else { return SD_cmd_return_byte; } //②创建文件 //---------------------------------------------------------------------------- SD_send_cmd(SD_CREATE,13,fileName); F_wait_response = 0x01; SD_cmd_return_byte = 0; waitCnt=0; while(F_wait_response) { waitCnt++; if(waitCnt>maxWaitCnt) { return 2; } }; while(IS_SD_BUSY); //③打开文件 //---------------------------------------------------------------------------- SD_send_cmd(SD_OPEN,13,fileName); F_wait_response = 0x01; SD_cmd_return_byte = 0; waitCnt=0; while(F_wait_response) { waitCnt++; if(waitCnt>maxWaitCnt) { return 3; } }; while(IS_SD_BUSY); //④写入文件 //---------------------------------------------------------------------------- SD_send_data(SD_WRITE,strlen(data)+4,0xffffffff,data); F_wait_response = 0x01; SD_cmd_return_byte = 0; waitCnt=0; while(F_wait_response) { waitCnt++; if(waitCnt>maxWaitCnt) { return 4; } }; while(IS_SD_BUSY); //⑤保存文件 //---------------------------------------------------------------------------- SD_save_file();//保存文件 F_wait_response = 0x01; SD_cmd_return_byte = 0; waitCnt=0; while(F_wait_response) { waitCnt++; if(waitCnt>maxWaitCnt) { return 5; } }; while(IS_SD_BUSY); //⑥关闭文件 //---------------------------------------------------------------------------- SD_close_file();//关闭文件 F_wait_response = 0x01; SD_cmd_return_byte = 0; waitCnt=0; while(F_wait_response) { waitCnt++; if(waitCnt>maxWaitCnt) { return 6; } }; while(IS_SD_BUSY); return 0; }