HAL.C
上传用户:jcsy2001
上传日期:2013-11-29
资源大小:201k
文件大小:5k
开发平台:

C/C++

  1. #include "common.h"
  2. #include "HAL.H"
  3. extern unsigned char xdata DBUF[BUFFER_LENGTH];
  4. //============================================================
  5. //往SD卡定一字节 www.mcusky.com
  6. void SdWrite(unsigned char  n)
  7. {
  8.     
  9.   unsigned char i;
  10.   for(i=8;i;i--)
  11.    {
  12.     SD_CLK=0;
  13.     SD_DI=(n&0x80);
  14.     n<<=1;
  15.     SD_CLK=1;
  16.    }
  17.   SD_DI=1;      
  18. }   
  19. //================================================================
  20. //从SD卡读一字节 www.mcusky.com
  21. unsigned char SdRead()
  22. {
  23.  unsigned char n,i;
  24.  for(i=8;i;i--)
  25.   {
  26.    SD_CLK=0;
  27.    SD_CLK=1;
  28.    n<<=1;
  29.    if(SD_DO) n|=1;
  30.   }
  31.  return n;
  32. }
  33. //================================================================
  34. //读SD卡响应 www.mcusky.com
  35. unsigned char SdResponse()
  36. {
  37.   unsigned char i=0,response;
  38.   
  39.   while(i<=8)
  40.   {
  41.     response=SdRead();
  42.     if(response==0x00)
  43.       break;
  44.     if(response==0x01)
  45.       break;
  46.     i++;
  47.   }
  48.   return response;
  49. }  
  50. //================================================================
  51. void SdCommand(unsigned char command, unsigned long argument, unsigned char CRC)
  52. {
  53.   
  54.   SdWrite(command|0x40);
  55.   SdWrite(((unsigned char *)&argument)[0]);
  56.   SdWrite(((unsigned char *)&argument)[1]);
  57.   SdWrite(((unsigned char *)&argument)[2]);
  58.   SdWrite(((unsigned char *)&argument)[3]);
  59.   SdWrite(CRC);
  60. }
  61. //================================================================
  62. unsigned char SdInit(void)
  63. {
  64.   int delay=0, trials=0;
  65.   unsigned char i;
  66.   unsigned char response=0x01;
  67.   SD_CS=1;
  68.   for(i=0;i<=9;i++)
  69.     SdWrite(0xff);
  70.   SD_CS=0;
  71.   
  72.   //Send Command 0 to put MMC in SPI mode
  73.   SdCommand(0x00,0,0x95);
  74.   
  75.   response=SdResponse();
  76.   
  77.   if(response!=0x01)
  78.    {
  79.     return 0;
  80.    } 
  81.   
  82.   while(response==0x01)
  83.   {
  84.     SD_CS=1;
  85.     SdWrite(0xff);
  86.     SD_CS=0;
  87.     SdCommand(0x01,0x00ffc000,0xff);
  88.     response=SdResponse();
  89.   } 
  90.     
  91.   SD_CS=1;
  92.   SdWrite(0xff);
  93.   return 1;  
  94. }
  95. //================================================================
  96. unsigned char SdWriteBlock(unsigned char *Block, unsigned long address)
  97. {
  98.   unsigned char  count;
  99.   unsigned char dataResp;
  100.   //Block size is 512 bytes exactly
  101.   //First Lower SS
  102.   
  103.   SD_CS=0;
  104.   //Then send write command
  105.   SdCommand(0x18,address,0xff);
  106.   
  107.   if(SdResponse()==00)
  108.   {
  109.     SdWrite(0xff);
  110. SdWrite(0xff);
  111. SdWrite(0xff);
  112.     //command was a success - now send data
  113.     //start with DATA TOKEN = 0xFE
  114.     SdWrite(0xfe);
  115.     //now send data
  116.     for(count=0;count<128;count++)
  117.     {
  118.       SdWrite(*Block++);
  119.   SdWrite(*Block++);
  120.   SdWrite(*Block++);
  121.   SdWrite(*Block++);
  122.     }
  123.     //data block sent - now send checksum
  124.     SdWrite(0xff);
  125.     SdWrite(0xff);
  126.     //Now read in the DATA RESPONSE token
  127.     dataResp=SdRead();
  128.     //Following the DATA RESPONSE token
  129.     //are a number of BUSY bytes
  130.     //a zero byte indicates the MMC is busy
  131.     while(SdRead()==0);
  132.     dataResp=dataResp&0x0f; //mask the high byte of the DATA RESPONSE token
  133.     SD_CS=1;
  134.     SdWrite(0xff);
  135.     if(dataResp==0x0b)
  136.       {
  137.       //printf("DATA WAS NOT ACCEPTED BY CARD -- CRC ERRORn");
  138.       return 0;
  139.       }
  140.     if(dataResp==0x05)
  141.       return 1;
  142.       
  143.     //printf("Invalid data Response token.n");
  144.     return 0;
  145.  }
  146.   //printf("Command 0x18 (Write) was not received by the MMC.n");
  147.   return 0;
  148. }
  149. //=======================================================================
  150. unsigned char SdReadBlock(unsigned char *Block, unsigned long address)
  151. {
  152.    unsigned char count;
  153.   //Block size is 512 bytes exactly
  154.   //First Lower SS
  155.   
  156. //  printf("MMC_read_blockn");
  157.   
  158.   SD_CS=0;
  159.   //Then send write command
  160.   SdCommand(0x11,address,0xff);
  161.   
  162.   if(SdResponse()==00)
  163.   {
  164.     //command was a success - now send data
  165.     //start with DATA TOKEN = 0xFE
  166.     while(SdRead()!=0xfe);
  167.     for(count=0;count<128;count++)
  168.     {
  169.       *Block++=SdRead();
  170.   *Block++=SdRead();
  171.   *Block++=SdRead();
  172.   *Block++=SdRead();
  173.     }
  174.     //data block sent - now send checksum
  175.     SdRead();
  176.     SdRead();
  177.     //Now read in the DATA RESPONSE token
  178.     SD_CS=1;
  179.     SdRead();
  180.     return 1;
  181.  }
  182. //  printf("Command 0x11 (Read) was not received by the MMC.n");
  183.   return 0;
  184. }
  185. //================================================================
  186. void ComSendByte(unsigned char c)
  187. {
  188. SBUF=c;
  189. while(!TI);
  190. TI=0;
  191. }
  192. //================================================================
  193. void DelayMs(unsigned char nFactor)
  194. {
  195.  return;
  196. /*
  197. unsigned char i;
  198. unsigned int j;
  199. for(i=0; i<nFactor; i++)
  200. {
  201. for(j=0;j<1000;j++)
  202.          j=j;
  203. }
  204. */
  205. }
  206. unsigned int LSwapINT16(unsigned short dData1,unsigned short dData2)
  207. {
  208.     unsigned int xdata dData;
  209.     dData = ((dData2<<8)&0xff00)|(dData1&0x00ff);
  210. return dData;
  211. }
  212. unsigned long LSwapINT32(unsigned long dData1,unsigned long dData2,unsigned long dData3,unsigned long dData4)
  213. {
  214.     unsigned long xdata dData;
  215.     dData = ((dData4<<24)&0xff000000)|((dData3<<16)&0xff0000)|((dData2<<8)&0xff00)|(dData1&0xff);
  216. return dData;
  217. }