📄 mcc_ccs.c
字号:
/**********************************************
* 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 + -