Hola, estoy intentando escribir en una microSD desde un PIC, el 18F2550. Para ello uso una uALFAT OEM Board with TransFlash Micro SD Connector:
http://www.ghielectronics.com/details.php?id=1&sid=102.
De ahí se pueden obtener las librerías y el manual de las mismas.
La conexión la hago según el esquemático que el fabricante pone en la web:
http://www.ghielectronics.com/download/uALFAT/uALFAT-TF_SCH.pdf.
Segú este esquema, conecto:
UART_TX a RC7 ( Rx del PIC )
UART_RX a RC6 ( Tx del PIC )
I2C_SC no conectado
I2C_SDA no conectado
SPI_SCK no conectado
SPI_MISO/RTS no conectado
SPI_MOSI/CTS a GND
SPI_SSEL# a GND
RESET# a VCC
GND
VCC
SD_SCK/WAKE/BL# a GND
VBAT a VCC
SPI_SSEL# y SPI_SCK están conectados a GND para configurar la comunicación mediante la UART.
La comunicación con el PIC la hago por UART, a 9600 baudios ( velocidad por defecto de uALFAT ).
Para comenzar, trato de inicializar la SD. Para ello, sigo las instrucciones del fabricante
http://www.ghielectronics.com/download/uALFAT/uALFAT%20Manual.pdf.
Ahí se explica cómo realizar las distintas funciones para funcionar con uALFAT, por si fuese necesario modificar las librerías descargadas.
Para inicializar, hay que escribir “I\r” en la uALFAT:
int8 GHI_InitializeSD(void)
{
GHI_PutC('I');
GHI_PutC('\r');
return GHI_GetResult();
}
Esto devuelve un código, que debería ser de la forma “!xx<CR>”, donde “xx” es el código de error. Para mandarle el valor a uALFAT uso la siguiente función:
void GHI_PutC(int8 ch)
{
putc(ch);
}
El código de error se obtiene con la siguiente función:
int8 GHI_GetResult(void)
{
int8 result;
int8 c = 0;
// Solo debug Fuerzo el vaciado del buffer
while ( c != '!' ) // Voy a forzar que se quede colgado, pero veo todo lo que me envía hasta que deja de enviar
{
c=GHI_GetC();
printf(usb_cdc_putc,"%c\r",(char)c);
}
/* Comentado solo para debug
c=GHI_GetC();
if( c=='!')// the command has returned the results
{
result=ASCIItoNibble(GHI_GetC())<<4;
result|=ASCIItoNibble(GHI_GetC());
if(GHI_GetC()!='\r') // data MUST end with <CR>
return ERROR_UNEXPECTED_VALUE;
// everything went well
return result;
*/
return ERROR_UNEXPECTED_VALUE;
}
Para capturar el valor uso:
int8 GHI_GetC(void)
{
int8 a = 1;
while(!kbhit()); // Esto lo hago para forzar la espera ( solo para debug )
a = getc();
return a;
}
Esto es lo que se obtiene por el hyperterminal:
“b0 32 33 22 c8 ff 00”
O lo que es lo mismo “°23"Èÿ.”
Realmente debería recibir esto “21 00 0d”
He probado a cambiar la velocidad de 9600 a 19200 en el PIC y lee lo mismo, sin embargo 115200 da un resultado distinto ( un string de recepción más largo y con caracteres ascii extendidos )
Si alguien puede ayudarme se lo agradecería.
Desde ya muchas gracias