HAL.C
资源名称:51-SD.rar [点击查看]
上传用户:jcsy2001
上传日期:2013-11-29
资源大小:201k
文件大小:5k
源码类别:
嵌入式/单片机编程
开发平台:
C/C++
- #include "common.h"
- #include "HAL.H"
- extern unsigned char xdata DBUF[BUFFER_LENGTH];
- //============================================================
- //往SD卡定一字节 www.mcusky.com
- void SdWrite(unsigned char n)
- {
- unsigned char i;
- for(i=8;i;i--)
- {
- SD_CLK=0;
- SD_DI=(n&0x80);
- n<<=1;
- SD_CLK=1;
- }
- SD_DI=1;
- }
- //================================================================
- //从SD卡读一字节 www.mcusky.com
- unsigned char SdRead()
- {
- unsigned char n,i;
- for(i=8;i;i--)
- {
- SD_CLK=0;
- SD_CLK=1;
- n<<=1;
- if(SD_DO) n|=1;
- }
- return n;
- }
- //================================================================
- //读SD卡响应 www.mcusky.com
- unsigned char SdResponse()
- {
- unsigned char i=0,response;
- while(i<=8)
- {
- response=SdRead();
- if(response==0x00)
- break;
- if(response==0x01)
- break;
- i++;
- }
- return response;
- }
- //================================================================
- void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC)
- {
- SdWrite(command|0x40);
- SdWrite(((unsigned char *)&argument)[0]);
- SdWrite(((unsigned char *)&argument)[1]);
- SdWrite(((unsigned char *)&argument)[2]);
- SdWrite(((unsigned char *)&argument)[3]);
- SdWrite(CRC);
- }
- //================================================================
- unsigned char SdInit(void)
- {
- int delay=0, trials=0;
- unsigned char i;
- unsigned char response=0x01;
- SD_CS=1;
- for(i=0;i<=9;i++)
- SdWrite(0xff);
- SD_CS=0;
- //Send Command 0 to put MMC in SPI mode
- SdCommand(0x00,0,0x95);
- response=SdResponse();
- if(response!=0x01)
- {
- return 0;
- }
- while(response==0x01)
- {
- SD_CS=1;
- SdWrite(0xff);
- SD_CS=0;
- SdCommand(0x01,0x00ffc000,0xff);
- response=SdResponse();
- }
- SD_CS=1;
- SdWrite(0xff);
- return 1;
- }
- //================================================================
- unsigned char SdWriteBlock(unsigned char *Block, unsigned long address)
- {
- unsigned char count;
- unsigned char dataResp;
- //Block size is 512 bytes exactly
- //First Lower SS
- SD_CS=0;
- //Then send write command
- SdCommand(0x18,address,0xff);
- if(SdResponse()==00)
- {
- SdWrite(0xff);
- SdWrite(0xff);
- SdWrite(0xff);
- //command was a success - now send data
- //start with DATA TOKEN = 0xFE
- SdWrite(0xfe);
- //now send data
- for(count=0;count<128;count++)
- {
- SdWrite(*Block++);
- SdWrite(*Block++);
- SdWrite(*Block++);
- SdWrite(*Block++);
- }
- //data block sent - now send checksum
- SdWrite(0xff);
- SdWrite(0xff);
- //Now read in the DATA RESPONSE token
- dataResp=SdRead();
- //Following the DATA RESPONSE token
- //are a number of BUSY bytes
- //a zero byte indicates the MMC is busy
- while(SdRead()==0);
- dataResp=dataResp&0x0f; //mask the high byte of the DATA RESPONSE token
- SD_CS=1;
- SdWrite(0xff);
- if(dataResp==0x0b)
- {
- //printf("DATA WAS NOT ACCEPTED BY CARD -- CRC ERRORn");
- return 0;
- }
- if(dataResp==0x05)
- return 1;
- //printf("Invalid data Response token.n");
- return 0;
- }
- //printf("Command 0x18 (Write) was not received by the MMC.n");
- return 0;
- }
- //=======================================================================
- unsigned char SdReadBlock(unsigned char *Block, unsigned long address)
- {
- unsigned char count;
- //Block size is 512 bytes exactly
- //First Lower SS
- // printf("MMC_read_blockn");
- SD_CS=0;
- //Then send write command
- SdCommand(0x11,address,0xff);
- if(SdResponse()==00)
- {
- //command was a success - now send data
- //start with DATA TOKEN = 0xFE
- while(SdRead()!=0xfe);
- for(count=0;count<128;count++)
- {
- *Block++=SdRead();
- *Block++=SdRead();
- *Block++=SdRead();
- *Block++=SdRead();
- }
- //data block sent - now send checksum
- SdRead();
- SdRead();
- //Now read in the DATA RESPONSE token
- SD_CS=1;
- SdRead();
- return 1;
- }
- // printf("Command 0x11 (Read) was not received by the MMC.n");
- return 0;
- }
- //================================================================
- void ComSendByte(unsigned char c)
- {
- SBUF=c;
- while(!TI);
- TI=0;
- }
- //================================================================
- void DelayMs(unsigned char nFactor)
- {
- return;
- /*
- unsigned char i;
- unsigned int j;
- for(i=0; i<nFactor; i++)
- {
- for(j=0;j<1000;j++)
- j=j;
- }
- */
- }
- unsigned int LSwapINT16(unsigned short dData1,unsigned short dData2)
- {
- unsigned int xdata dData;
- dData = ((dData2<<8)&0xff00)|(dData1&0x00ff);
- return dData;
- }
- unsigned long LSwapINT32(unsigned long dData1,unsigned long dData2,unsigned long dData3,unsigned long dData4)
- {
- unsigned long xdata dData;
- dData = ((dData4<<24)&0xff000000)|((dData3<<16)&0xff0000)|((dData2<<8)&0xff00)|(dData1&0xff);
- return dData;
- }