⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcc_ccs.c

📁 CCS FAT file systemp access
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********************************************
 * ANDRE L. V. SILVA
 * andreluizeng@yahoo.com.br
 *
 * change the strings to your own language if you want (it is in portuguese br)
 *
 * Example of use:
 *
 *
   int main (void)
   {
      pic initialization....

      InicializaSPI ();
      InicializaMMC ();
      InicializaFAT32 ();

      While (TRUE)
      {
         your code ....
      }

      return 0;
   }

 **********************************************/


#include "MMCFat32.h"
#include "string.h"

//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
// Fun??es do cart?o MMC
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------

int32 FATTable[128];
int32 gFirstEmptyCluster;
FAT32Vars gFAT32Vars;
diskinforec DiskInfo;
FILE gFiles[MAXFILES];


#byte MMCAddressL       = gFAT32Vars
#byte MMCAddressH       = gFAT32Vars+1
#byte MMCAddressHL       = gFAT32Vars+2
#byte MMCAddressHH       = gFAT32Vars+3
#byte gStartSectorL    = gFAT32Vars+8
#byte gStartSectorH    = gFAT32Vars+9
#byte gStartSectorHL    = gFAT32Vars+10



//-------------------------------------------------------------------------
// Detec??o do MMC 
//-------------------------------------------------------------------------
char DetectaMMC (void)
{
   char Resp;
   
   TRIS_DETECTA_MMC = ENTRADA;
   
   printf ("\r\nDetectando MMC...");
   
   if (MMC_DETECT)
   {
      printf ("Nao Conectado !");
      printf ("\r\nAguardando Conexao... ");
      
      while (MMC_DETECT);
   }
   
   TRIS_DETECTA_MMC = ENTRADA;
   MMC_DETECT = SAIDA;
   MMC_DETECT = FALSE;
   
   
   printf ("OK");   
   
   return Resp;
}   

//-------------------------------------------------------------------------
// Configura??o da SPI
//-------------------------------------------------------------------------
void InicializaSPI (char Tipo)
{
   TRIS_SPI_SCK      =   SAIDA;
   TRIS_SPI_SDI      =   ENTRADA;
   TRIS_SPI_SDO      =   SAIDA;
   TRIS_SPI_MMC_CS      =   SAIDA;

   MMC_CS   = TRUE;
   SPI_SCK = TRUE;
   SPI_DI   = TRUE;
   SPI_DO   = FALSE;


   if (Tipo == MAXIMO)
   {
      printf ("\r\nAjustando SPI: ");
      printf ("5 MHz...");

      CKE = FALSE;
      SMP = TRUE;
      CKP = TRUE;
      SSPCON1 = SSPCON1 & SPI_MASTER_SCK_DIV_4;
      SSPEN = TRUE;
   }


   else if (Tipo == MEDIO)
   {
      printf ("\r\nAjustando SPI: ");
      printf ("1.25 MHz...");

      CKE = FALSE;
      SMP = TRUE;
      CKP = TRUE;
      SSPCON1 = SSPCON1 & SPI_MASTER_SCK_DIV_16;
      SSPEN = TRUE;

   }

   else
   {
      printf ("\r\nInicializando SPI: ");
      printf ("312.5 KHz...");

      CKE = FALSE;
      SMP = TRUE;
      CKP = TRUE;
      SSPCON1 = SSPCON1 & SPI_MASTER_SCK_DIV_4;
      SSPEN = TRUE;
   }

   printf ("OK");

   delay_ms (10);

    return;
}



//-------------------------------------------------------------------------
// Fun??o de Sele??o do CS do MMC
//-------------------------------------------------------------------------
void SelecionaMMC (boolean Flag)
{
   if (Flag)
   {
      MMC_CS = FALSE;
   }

   else
   {
      MMC_CS = TRUE;
   }
}


//-------------------------------------------------------------------------
// Fun??o para enviar um dado via SPI
//-------------------------------------------------------------------------
void EnviaMMC (char a)
{
   char b;

   BF = FALSE;
   SSPBUF = a;
   while (! BF);
   b = SSPBUF;

   return;
}

//-------------------------------------------------------------------------
// Fun??o para receber um dado via SPI
//-------------------------------------------------------------------------
char RecebeMMC (void)
{
   char b;

   BF = FALSE;
   SSPBUF = 0xff;
   while (! BF);
   b = SSPBUF;

   return b;
}

//-------------------------------------------------------------------------
// 8 pulsos de clock dummy
//-------------------------------------------------------------------------
void MMC8Clock (void)
{
   EnviaMMC (0xff);
   return;
}


//-------------------------------------------------------------------------
// Comando de Reset
//-------------------------------------------------------------------------
void ExecutaCMD0 (void)
{
   char Resp;
   long TimeOut;
   char i;

   // comando CMD0 - Reset
//   printf ("\r\n\tResposta ao CMD0...");
   do
   {
      Resp = 0xff;
      TimeOut = 100;

      // envia pelo pulsos de clock para inicializa??o
      for (i = 0; i < 10; i++)   MMC8Clock ();

      // envia CMD0 -> Idle state
      SelecionaMMC (TRUE);
      EnviaMMC (0x40); // CMD0
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x95); // CRC - OK
      MMC8Clock ();

      // espera pela resposta = 0x01 - caso contr?rio = falha
      while ((Resp != 0x01) && (TimeOut))
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }

      SelecionaMMC (FALSE);

   // roda enquanto der timeout
   } while (! TimeOut);

//   printf ("OK");
   
   return;
}   

//-------------------------------------------------------------------------
// Modo SPI
//-------------------------------------------------------------------------
void ExecutaCMD1 (void)
{
   char Resp;
   long TimeOut;

   // comando CMD1 - Modo SPI
//   printf ("\r\n\tResposta ao CMD1...");
   do
   {
      Resp = 0xff;
      TimeOut = 100;


      // envia CMD1 -> Modo SPI
      SelecionaMMC (TRUE);
      EnviaMMC (0x41); // CMD1
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x01); // CRC - OK
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contr?rio = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }

      SelecionaMMC (FALSE);


   // roda enquanto der timeout
   } while (! TimeOut);

//   printf ("OK");
   
   return;
}
   
//-------------------------------------------------------------------------
// Ajusta o tamanho do bloco - 512 bytes
//-------------------------------------------------------------------------
void ExecutaCMD16 (void)
{
   char Resp;
   long TimeOut;
   
   // comando CMD16 - Bloco de 512 bytes
//   printf ("\r\n\tResposta ao CMD16...");

   do
   {
      Resp = 0xff;
      TimeOut = 100;

      // envia CMD16 -> block lenght
      SelecionaMMC (TRUE);
      EnviaMMC (0x50); // CMD1
      EnviaMMC (0x00);
      EnviaMMC (0x00);
      EnviaMMC (0x02);
      EnviaMMC (0x00);
      EnviaMMC (0x01); // CRC - OK
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contr?rio = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }
      SelecionaMMC (FALSE);

   // roda enquanto der timeout
   } while (! TimeOut);

//   printf ("OK");

   return;
}   

//-------------------------------------------------------------------------
// L? a identifica??o do cart?o - CID
//-------------------------------------------------------------------------
void ExecutaCMD10 (void)
{
   char Resp;
   long TimeOut;
   char i;
   char Ano;
   char Mes;
   char HW;
   char FW;

   // comando CMD10 - L? a identifica??o do cart?o
   do
   {
      Resp = 0xff;
      TimeOut = 100;

      SelecionaMMC (TRUE);
         EnviaMMC (0x4A);   //CMD10 - Le CID
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x01);
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contr?rio = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }

      // dummy
      MMC8Clock ();

      // respondeu
      if (TimeOut)
      {

//         // recebe a identifica??o - bin?rio (8bits)
//         printf ("\r\n\r\n\tID do Fabricante: 0x%x", RecebeMMC ());   // identifica??o para MMCA
//
//         // recebe a id de aplica??o - bin?rio (16bits)
//         printf ("\r\n\tID da Aplica??o: 0x");
//         for (i = 0; i < 2; i++)
//         {
//            printf ("%x", RecebeMMC ());   // identifica??o para MMCA
//         }
//         
//         printf ("\r\n\r\n\tProduto: ");
//         for (i = 0; i < 6; i++)
//         {
//            printf ("%c", RecebeMMC ());   // 6 pr?ximos bytes - Nome do Produto
//         }
//
//         // revis?o do produto - 8bits - BCD
//         printf ("\r\n\r\n\tRevis?o do Produto: %02d", RecebeMMC ());
//
//         printf ("\r\n\tSerial: 0x");
//         
//         for (i = 0; i < 4; i++)
//         {
//            printf ("%x", RecebeMMC ());   // 4 pr?ximos bytes - Serial do Produto
//         }
//
//         
//
//
//         FW = Resp & 0x0f;               // Firmware = 4bits menos significativos
//         HW = (Resp >> 4) & 0x0f;         // Hardware = 4bits mais significativos
//         printf ("\r\n\tFirmware: %2d", FW);
//         printf ("\r\n\tHardware: %02d", HW);
//         printf ("\r\n\tFW+HW: 0x%x", Resp);
//         
//         
//   
//         Resp = RecebeMMC ();       // Mes + Ano;
//         Ano = Resp & 0x0f;         // Ano = 4bits menos significativos
//         Mes = (Resp >> 4) & 0x0f;   // Ano = 4bits mais significativos
//
//         printf ("\r\n\tAno: %02d", Ano);
//         printf ("\r\n\tMes: %02d", Mes);
//         printf ("\r\n\tAno+Mes: 0x%x\r\n", Resp);
      
      }

      SelecionaMMC (FALSE);
      
   // roda enquanto der timeout
   } while (! TimeOut);   
   
   return;
}
   
//-------------------------------------------------------------------------
// L? o formato do cart?o - CSD
//-------------------------------------------------------------------------
void ExecutaCMD9 (void)
{
   char Resp;
   long TimeOut;

   // comando CMD9 - L? o formato do cart?o
//   printf ("\r\n\tResposta ao CMD9...");
   do
   {
      Resp = 0xff;
      TimeOut = 100;

      SelecionaMMC (TRUE);
         EnviaMMC (0x49);   //CMD9 - Le CSD
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x00);
         EnviaMMC (0x01);
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contr?rio = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }
      
      // Respondeu
      if (TimeOut)
      {
         
      }

      SelecionaMMC (FALSE);

   // roda enquanto der timeout
   } while (! TimeOut);

//   printf ("OK");
   
   return;
}   

//-------------------------------------------------------------------------
// Muda para o modo de high-speed
//-------------------------------------------------------------------------
void ExecutaCMD6 (void)
{
   char Resp;
   long TimeOut;

   // comando CMD6 - high speed (manual mmc plus)
//   printf ("\r\n\tResposta ao CMD6...");
   do
   {
      Resp = 0xff;
      TimeOut = 100;

      SelecionaMMC (TRUE);
      EnviaMMC (0x46); // CMD6
      EnviaMMC (0x03);
      EnviaMMC (0xb9);
      EnviaMMC (0x01);
      EnviaMMC (0x00);
      EnviaMMC (0x01); // CRC - OK
      MMC8Clock ();

      // espera pela resposta = 0x00 - caso contr?rio = falha
      while (Resp && TimeOut)
      {
         Resp = RecebeMMC ();
         TimeOut--;
      }
      SelecionaMMC (FALSE);

   // roda enquanto der timeout
   } while (! TimeOut);

//   printf ("OK");
   
   return;
}   

//-------------------------------------------------------------------------
// Inicializa??o do MMC
//-------------------------------------------------------------------------
void InicializaMMC (void)
{

   printf ("\r\nInicializando MMC...");
   
   ExecutaCMD0 ();
   ExecutaCMD1 ();
   ExecutaCMD16 ();
   ExecutaCMD10 ();
   ExecutaCMD9 ();
   
   printf ("\r\nInicializando MMC...OK");

   return;
}

//-------------------------------------------------------------------------
// Le um setor da mem?ria - FAT32
//-------------------------------------------------------------------------
void ReadSector(int32 sector, char *buffer)
{
      char errs,response;
      char cnt2,cnt3;

      #byte sectorL = sector
      #byte sectorH = sector+1
      #byte sectorHL = sector+2

      // if (input(CardInserted)) return;
      
   // Disable_interrupts(GLOBAL);
      Restart_wdt();
      
      MMCAddressL = 0;
      MMCAddressH = sectorL;
      MMCAddressHL = sectorH;
      MMCAddressHH = sectorHL;
      gFAT32Vars.MMCAddress <<= 1;

   SelecionaMMC (TRUE);
      EnviaMMC (0x51);
      EnviaMMC (MMCAddressHH);
      EnviaMMC (MMCAddressHL);
      EnviaMMC (MMCAddressH & 0xFE);

      EnviaMMC (0);
      EnviaMMC (0x01);
      errs = 8;
      
   do
   {
       response = RecebeMMC ();
      
     } while ((--errs) && (response == 0xFF));
      
      
      errs = 50;
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -