void mmc_comando(char a, char b, char c, char d, char e, char f)
{
Spi_Write(a); // Comando
Spi_Write(b);
Spi_Write(c);
Spi_Write(d);
Spi_Write(e);
Spi_Write(f); // checksum
}
int mmc_arranca()
{
int i;
//SETUP_SPI(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_4 | SPI_SS_DISABLED);
Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, HIGH_2_LOW);
SSPSTAT.F6 = 1;//SSPSTAT | 0x40;
SSPCON1.F4 = 0;//SSPCON & 0xEF;
//*(0x94) |= 0x40; // CKE = 1
//*(0x14) &= 0xEF; // CKP = 0
PORTA.F5 = 1;
for(i=0;i<10;i++)
{
Spi_Write(0xFF);
}
PORTA.F5 = 0;
mmc_comando(0x40,0x00,0x00,0x00,0x00,0x95);
if(mmc_respuesta(0x01)==1) return 1;
i = 0;
while((i < 255) && (mmc_respuesta(0x00)==1))
{
mmc_comando(0x41,0x00,0x00,0x00,0x00,0xff);
i++;
}
if(i >= 254) return 1;
PORTA.F5 = 1; // OUTPUT_HIGH(PIN_C2); // Chip Select = 1 (off)
Spi_Write(0xFF);
PORTA.F5 = 0; // OUTPUT_LOW(PIN_C2); // Chip Select = 0 (on)
mmc_comando(0x50,0x00,0x00,0x02,0x00,0xff);
// configuramos el boque con un tamaño de 512
if((mmc_respuesta(0x00))==1) return 1;
PORTA.F5 = 1; //OUTPUT_HIGH(PIN_C2); // Chip Select = 1 (off)
return 0;
}
int mmc_respuesta(unsigned char respuesta)
{
unsigned long count = 0xFFFF;
while(Spi_Read(0xFF) != respuesta && --count > 0);
if(count==0) return 1;
else return 0;
}
int mmc_escribir(unsigned long numero)
{
int dato;
unsigned long i;
unsigned long varh,varl;
varl=((numero&0x003F)<<9);
varh=((numero&0xFFC0)>>7);
PORTA.F5 = 0; // Chip select = 0 (on)
mmc_comando(0x58,HIGH(varh),LOW(varh),HIGH(varl),0x00,0xFF);
if((mmc_respuesta(0x00))==1) return 1;
Spi_Write(0xFE); // Envio el data token
for(i=0;i<512;i++)
{
//dato=AD();
Spi_Write(0X00); // envio del dato a la miemoria
}
Spi_Write(0xFF);
Spi_Write(0xFF);
if((Spi_Read(0xFF)&0x0F)!=0x05) return 1;
PORTA.F5 = 1; // Chip Select = 1 (off)
return 0;
}
int mmc_leer(unsigned long numero)
{
unsigned long i;
unsigned long varh,varl;
varl=((numero&0x003F)<<9);
varh=((numero&0xFFC0)>>7);
PORTA.F5 = 0; // Chip select = 0 (on)
mmc_comando(0x51,HIGH(varh),LOW(varh),HIGH(varl),0x00,0xff);
// Envio el comando de lectura de bloque
// y direccion del bloque a leer
if((mmc_respuesta(0x00))==1) return 1;
if((mmc_respuesta(0xFE))==1) return 1;
for(i=0;i<512;i++)
{
//putc(Spi_Read(0xFF)); //obteniendo los datos
}
Spi_Read(0xFF);
Spi_Read(0xFF); // fin de lectura
PORTA.F5 = 1;
Spi_Write(0xFF);
return 0;
}
int mmc_estado()
{
PORTA.F5 = 0; // Chip Select = 0 (on)
mmc_comando(0x58,0x00,0x00,0x02,0x00,0xff);
PORTA.F5 = 1; // Chip Select = 1 (off)
return 0;
}
////////////////////////////////////////////////////////////////////////////////
void main(void){
unsigned long direccion = 528;
TRISA = 0;
PORTA = 0;
TRISB = 0;
PORTB = 0;
TRISC = 0;
PORTC = 0;
TRISD = 0;
PORTD = 0;
TRISE = 0;
PORTE = 0;
if (mmc_arranca()== 0){
PORTD.F0 = 1;
mmc_escribir(0);
} else {
PORTD = 0xF0;
}
while(1){
//mmc_escribir(direccion);
//direccion++;
//PORTD.F1 = ~PORTD.F1;
}
}
Este es el código que implemente para la inicialización de la memoria funciona muy bien en un 16f877a pero no anda en un 18f4550 o en un 18f2550 ¿porque será ??? no se pero eso es lo que sucede
La cosa es implementar una cola circular para ver si se pueden almacenar en la memoria señales de ancho de banda mayor