資源描述:
《單片機讀寫SD卡教程.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、點這鄭重聲明:本實驗并不是對所有SD卡都能成功運行第一步:打開winhex軟件,用讀卡器讀SD卡,在winhex中查看SD卡點擊查找(ctrl+F)輸入FAT(找到DBR處)發(fā)現(xiàn)DBR起始于0x11200扇區(qū)地址,它必是512整數(shù)倍,因為一個扇區(qū)含512BYTE,所以在程序中讀一個扇區(qū)時一定要是512整數(shù)倍,否則會出錯。11200地址對應的值是0xEB,本程序讀一下這個地址的值看看是否正確。注意有的winhex編址是十進制看看程序吧#include#defineucharunsignedcha
2、r#defineuintunsignedint//=============================================================//定義SD卡需要的4根信號線sbitSD_CLK=P1^1;sbitSD_DI=P1^2;sbitSD_DO=P1^0;sbitSD_CS=P1^3;sbitBeep=P2^0;//用來調(diào)程序標志//===========================================================//==========
3、=================================================//定義512字節(jié)緩沖區(qū),,89C52直接定義成unsignedcharDATA[80];,太大了RAM不夠unsignedcharxdataDATA[512];voiddelay(unsignedintz){unsignedintx,y;for(x=z;x>0;x--);for(y=110;y>0;y--);}//==================================================
4、=========//寫一字節(jié)到SD卡,模擬SPI總線方式voidSdWrite(unsignedcharn){unsignedchari;for(i=8;i;i--){SD_CLK=0;SD_DI=(n&0x80);n<<=1;SD_CLK=1;}SD_DI=1;}//===========================================================//從SD卡讀一字節(jié),模擬SPI總線方式unsignedcharSdRead(){unsignedcharn,i;for(i=
5、8;i;i--){SD_CLK=1;SD_CLK=0;n<<=1;if(SD_DO)n
6、=1;}returnn;}//============================================================//檢測SD卡的響應unsignedcharSdResponse(){uchari=0,response=0;while(i<=8){response=SdRead();if(response==0x00)break;if(response==0x01)break;i++;}r
7、eturnresponse;}//================================================================//發(fā)命令到SD卡voidSdCommand(unsignedcharcommand,unsignedlongargument,unsignedcharCRC){SdWrite(command
8、0x40);/*SdWrite(((unsignedchar*)&argument)[0]);SdWrite(((unsignedchar*)&argument
9、)[1]);SdWrite(((unsignedchar*)&argument)[2]);SdWrite(((unsignedchar*)&argument)[3]);*/SdWrite(argument>>24);SdWrite(argument>>16);SdWrite(argument>>8);SdWrite(argument);SdWrite(CRC);}//================================================================//初始化SD卡u
10、nsignedcharSdInit(void){unsignedchari;unsignedcharresponse=0xFF;P3=0xff;SD_CS=1;for(i=0;i<=0xfe;i++)SdWrite(0xff);SD_CS=0;SdCommand(0x00,0,0x95);SD_DI=1;response=SdResponse();if(response!=0x01){