Вы находитесь на странице: 1из 16

APLICACIONES AVANZADAS CON C18 ( II )

SD CARD/FAT

Autor: Suky

www.micros-designs.com.ar

2011

Autor: Suky

www.micros-designs.com.ar

2011

Licencia.
Casanova Alejandro ([www.micros-designs.com.ar][inf.pic.suky@live.com.ar]) Algunos derechos reservados:

Obra liberada bajo licencia Creative Commons by-nc-sa. Reconocimiento - NoComercial - CompartirIgual (by-nc-sa): En cualquier explotacin de la obra autorizada por la licencia hara falta reconocer la autor/a. La explotacin de la obra queda limitada a usos no comerciales. La explotacin autorizada incluye la creacin de obras derivadas siempre que mantengan la misma licencia al ser divulgadas. Ms informacin: http://es.creativecommons.org/licencia/

Autor: Suky

www.micros-designs.com.ar

2011

Introduccin.
En este artculo se pretende dar los pasos necesarios como para poder utilizar las libreras FAT implementadas por Microchip en un proyecto utilizando MPLAB C18. Al igual que para USB debemos tener instalado la aplicacin Microchip Solution. Tambin siguiendo la misma estructura que el artculo anterior debemos establecer cul es el hardware con el cual se va a trabajar, en este caso el corazn es un PIC18F2620:

Creacin del proyecto.


Para el proyecto utilizando USB partimos de uno de los ejemplos que nos provee Microchip y a partir de l trabajamos sobre nuestro ejemplo en particular. En este caso lo vamos a realizar de manera distinta para dar una alternativa cuando se necesita utilizar varios stack en un mismo proyecto, de esa manera entenderemos cmo integrarlos. Si abrimos la carpeta Microchip Solutions v2010-10-19 nos vamos a encontrar con una gran cantidad de carpetas, pero en este caso debemos enfocarnos en dos (2), Microchip y MDD File System-SD Card (por ejemplo), este ultimo donde se encuentra ubicado el proyecto ejemplo. Dentro de Microchip nos encontramos con varias carpetas en donde cada una de ellas contiene los archivos fuentes de las libreras implementadas y una en particular llamada include con los archivos cabeceras. Ahora, dentro de la carpeta del proyecto, nos vamos a encontrar con el archivo fuente principal y archivos cabeceras necesarios para establecer el hardware que disponemos y la configuracin a implementar en la librera a utilizar, por ejemplo en este caso existe el archivo FSconfig.h. Como se explico para implementar el USB Framework de Microchip, las libreras estn conformadas de tal manera que existen un par de archivos que establecen el modo de funcionamiento y que en el proceso de compilacin son accedidos de forma global. Ahora bien, las carpetas y archivos que debemos copiar son los siguientes:

Autor: Suky

www.micros-designs.com.ar

2011

..\Microchip\MDD File System

..\Microchip\PIC18 salloc ..\ Microchip\Include\MDD File System

..\Microchip\Include\PIC18 salloc .. \Microchip\Include ..\ MDD File System-SD Card\PIC18F

CF-Bit transaction CF-PMP Fs Phys Interface Template FSIO Internal Flash SD-SPI salloc CF-Bit transaction CF-PMP Fs Phys Interface Template FSIO Internal Flash SD-SPI TEMPLATEFILE salloc Compiler GenericTypeDefs HardwareProfile FSconfig

Y con ellos creamos la siguiente estructura de archivos para nuestros proyectos:

Donde, dentro de Proyecto SDCardFAT, creamos el proyecto con MPLAB IDE y nuestro main.c. Luego agregamos los archivos al proyecto, los mnimos necesarios para este caso son:

Autor: Suky

www.micros-designs.com.ar

2011

A partir de la estructura de archivos creada debemos establecer los Path necesarios para que el compilador sepa dnde buscar. Una forma de pensarlo es, parados en la ubicacin de la carpeta del proyecto (donde se encuentra *.mpc), determinar la direccin que debemos tomar para encontrar el archivo cabecera que se incluye. De esta manera, resolviendo la direccin para que encuentre el archivo cabecera salloc.h, el Path sera: ..\Microchip\Include\PIC18 salloc De igual manera establecemos todos los que sean necesarios, en este caso resulta:

Autor: Suky

www.micros-designs.com.ar

2011

Adecuando el proyecto a nuestro hardware.


Para ello debemos modificar o crear un nuevo archivo HardwareProfile.h, en l hay que definir la frecuencia del Clock del sistema, que tipo de interface utilizaremos para establecer comunicacin con la memoria Sd Card y dependiendo de ello los pines a utilizar. Entre las interface tenemos: USE_SD_INTERFACE_WITH_SPI. Utiliza el modulo SPI para la comunicacin. USE_CF_INTERFACE_WITH_PMP. Utiliza el modulo PMP para la comunicacin. USE_MANUAL_CF_INTERFACE. La comunicacin se realizar por software.

Dependiendo de la eleccin depende el archivo que hay que incluir al proyecto, entre SD-SPI.c/.h, CFPMP.c/.h o CF-Bit transaction.c/.h. Por ejemplo para nuestro caso el archivo quedara:

Autor: Suky

www.micros-designs.com.ar

2011

#ifndef _HARDWAREPROFILE_H_ #define _HARDWAREPROFILE_H_ // Define your clock speed here #define GetSystemClock() 10000000 // System clock frequency (Hz) Fosc=40MHz #define GetPeripheralClock() GetSystemClock() // Peripheral clock freq. #define GetInstructionClock() GetSystemClock() // Instruction clock freq. // Description: Macro used to enable the SD-SPI physical layer (SD-SPI.c and .h) #define USE_SD_INTERFACE_WITH_SPI #ifdef USE_SD_INTERFACE_WITH_SPI #define USE_PIC18 #define USE_SD_INTERFACE_WITH_SPI #define INPUT_PIN #define OUTPUT_PIN // Chip Select Signal #define SD_CS #define SD_CS_TRIS // Card detect signal #define SD_CD #define SD_CD_TRIS 1 0

PORTCbits.RC0 TRISCbits.TRISC0

PORTCbits.RC1 TRISCbits.TRISC1

// Write protect signal #define SD_WE PORTCbits.RC2 #define SD_WE_TRIS TRISCbits.TRISC2 // Registers for the SPI module you want to use #define SPICON1 SSPCON1 #define SPISTAT SSPSTAT #define SPIBUF SSPBUF #define SPISTAT_RBF SSPSTATbits.BF #define SPICON1bits SSPCON1bits #define SPISTATbits SSPSTATbits #define SPI_INTERRUPT_FLAG PIR1bits.SSPIF // Defines for the HPC Explorer board #define SPICLOCK TRISCbits.TRISC3 #define SPIIN TRISCbits.TRISC4 #define SPIOUT TRISCbits.TRISC5 // Latch pins for SCK/SDI/SDO lines #define SPICLOCKLAT LATCbits.LATC3 #define SPIINLAT LATCbits.LATC4 #define SPIOUTLAT LATCbits.LATC5 // Port pins for SCK/SDI/SDO lines #define SPICLOCKPORT PORTCbits.RC3 #define SPIINPORT PORTCbits.RC4 #define SPIOUTPORT PORTCbits.RC5 Autor: Suky www.micros-designs.com.ar 2011

#define SPIENABLE

SSPCON1bits.SSPEN

// Will generate an error if the clock speed is too low to interface to the card #if (GetSystemClock() < 400000) #error System clock speed must exceed 400 kHz #endif #endif //************************************************************************************* #endif

Para trabajar con la memoria SD Card, la librera utiliza dos buffer de 512 bytes que debemos reservar para ello, como sabemos esto lo realizamos modificando el *.lkr del microcontrolador que utilizamos. En este caso queda: LIBPATH . FILES c018i.o FILES clib.lib FILES p18f2620.lib CODEPAGE CODEPAGE CODEPAGE CODEPAGE CODEPAGE CODEPAGE NAME=vectors NAME=page NAME=idlocs NAME=config NAME=devid NAME=eedata START=0x0 END=0x29 PROTECTED START=0x2A END=0xFFFF START=0x200000 END=0x200007 PROTECTED START=0x300000 END=0x30000D PROTECTED START=0x3FFFFE END=0x3FFFFF PROTECTED START=0xF00000 END=0xF003FF PROTECTED

ACCESSBANK NAME=accessram START=0x0 END=0x7F DATABANK NAME=gpr0 START=0x80 END=0xFF DATABANK NAME=gpr1 START=0x100 END=0x1FF DATABANK NAME=gpr2 START=0x200 END=0x2FF DATABANK NAME=gpr3 START=0x300 END=0x3FF DATABANK NAME=gpr4 START=0x400 END=0x4FF DATABANK NAME=gpr5 START=0x500 END=0x5FF DATABANK NAME=gpr6 START=0x600 END=0x6FF DATABANK NAME=buffer1 START=0x700 END=0x8FF PROTECTED DATABANK NAME=buffer2 START=0x900 END=0xAFF PROTECTED DATABANK NAME=gpr11 START=0xB00 END=0xBFF DATABANK NAME=gpr12 START=0xC00 END=0xDFF PROTECTED DATABANK NAME=gpr14 START=0xE00 END=0xEBF DATABANK NAME=sfr14 START=0xEC0 END=0xEFF PROTECTED DATABANK NAME=sfr15 START=0xF00 END=0xF7F PROTECTED ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED SECTION NAME=dataBuffer RAM=buffer1 SECTION NAME=FATBuffer RAM=buffer2 SECTION NAME=CONFIG ROM=config STACK SIZE=0x200 RAM=gpr12

Autor: Suky

www.micros-designs.com.ar

2011

Creamos 2 DATABANK de 512 bytes ubicados en 0x700 y 0x900, y con ello definimos 2 SECTION de nombre dataBuffer y FATBuffer. Hay que tener en cuenta las direcciones donde se encuentran, pues en el archivo FSconfig.h debemos establecerlas.

Configurando la implementacin FAT


Para determinar que alcance tendr nuestro proyecto en el uso del sistema de archivos FAT debemos trabajar sobre FSconfig.h, en l podemos determinar por ejemplo, con cuantos archivos podremos trabajar al mismo tiempo, si trabajaremos con directorios, si utilizaremos funciones para bsqueda de archivos o directorios, si usaremos FAT32, etc. A continuacin se detallan las opciones, tener en cuenta que su seleccin afectar directamente en el uso de la memoria RAM y ROM. FS_MAX_FILES_OPEN: Cantidad mxima de archivos que se permite abrir para trabajar a la vez. Slo es aplicable cuando la asignacin de memoria dinmica no se utiliza (FS_DYNAMIC_MEM no est definido). MEDIA_SECTOR_SIZE: Define el tamao del sector en el sistema de archivos FAT. ALLOW_FILESEARCH: Habilita el uso de funciones de bsqueda tales como FindFirst y FindNext. ALLOW_WRITES: Habilita las funciones que permite realizar escritura sobre el dispositivo. ALLOW_FORMATS: Habilita la funcin FSformat que permite realizar el formateo del dispositivo. ALLOW_DIRS: Permite trabajar con directorios habilitando las funciones FSmkdir y FSrmdir. ALLOW_PGMFUNCTIONS: nicamente para C18, lo que permite utilizar funciones adicionales que permiten ingresar como argumento string en rom. ALLOW_FSFPRINTF: Habilita el uso de la funcin FSfprintf. SUPPORT_FAT32: Soporta dispositivos con FAT32. FS_DYNAMIC_MEM: Habilita la asignacin de los objetos FSFILE de forma dinmica. Si no se crean en un arreglo esttico.

Luego nos permite seleccionar el modo en el que trabajar para establecer la fecha y hora en los archivos, tenemos 3 opciones: USEREALTIMECLOCK: Utiliza el modulo RTC del microcontrolador (No valido para PIC18) USERDEFINEDCLOCK: El usuario establece los valores, para ello se habilita la funcin SetClockVars. INCREMENTTIMESTAMP: Cuando no interesa los valores de fecha y hora del archivo se utiliza este caso.

Tambin, como mencionamos anteriormente, encontramos la definicin de la posicin en donde se encuentra los buffer dentro de la memoria: DATA_BUFFER_ADDRESS FAT_BUFFER_ADDRESS

Las funciones implementadas.


FindFirst Funcin de bsqueda inicial FindNext Funcin de bsqueda secuencial FSattrib Cambiar los atributos de un archivo www.micros-designs.com.ar 2011

Autor: Suky

FSchdir Cambia el directorio actual de trabajo FSCreateMBR Crea un registro de inicio maestro FSerror Devolver un cdigo de error para la ltima funcin FSfclose Actualizacin de la informacin del archivo y libera el objeto FSFILE FSfopen Abrir un archivo. FSformat Formatea un dispositivo. FSfprintf Para escribir cadenas con formato en un archivo. FSfread Leer datos de un archivo. FSfwrite Escribir datos en un archivo FSgetcwd Obtener el nombre del directorio de trabajo actual FSInit Funcin para inicializar el dispositivo. FSmkdir Para crear un directorio. FSremove Para borra un archivo. FSrename Para renombrar un archivo. FSrmdir Para borrar un directorio. SetClockVars Para establecer manualmente Fecha y Hora del archivo.

Para detalles de cada una de las funciones, revisar el Help que se puede encontrar en ..\Microchip Solutions v2010-10-19\Microchip\Help

Implementacin.
En mi caso para lograr trabajar con la SD Card realice algunas modificaciones en cmo se trabaja con las inicializaciones del mdulo SPI cuando se inicia el dispositivo. Originalmente la librera no implementa el cambio de velocidades de SPI, sino que comienza con la mxima y eso no permite inicializar la memoria. As que dentro el archivo fuente SD-SPI.c buscar la funcin OpenSPIM y realizar la siguiente modificacin: #ifdef USE_ALTERNATIVE_CONFIG_SPI void OpenSPIM (unsigned char sync_mode){ switch(sync_mode){ case SYNC_MODE_FAST: OpenSPI(SPI_FOSC_4, MODE_11, SMPMID); break; case SYNC_MODE_MED: OpenSPI(SPI_FOSC_16, MODE_11, SMPMID); break; case SYNC_MODE_SLOW: OpenSPI(SPI_FOSC_64, MODE_11, SMPMID); break; } } #else #ifdef __18CXX void OpenSPIM (unsigned char sync_mode) #else void OpenSPIM( unsigned int sync_mode) Autor: Suky www.micros-designs.com.ar 2011

#endif { SPISTAT = 0x0000; #ifndef __PIC32MX__ SPICON1 = 0x0000; SPICON1 |= sync_mode; #endif #ifdef __18CXX SPICON1 |= 0x80; SPISTATbits.CKE = 1; #else SPICON1bits.CKP = 1; SPICON1bits.CKE = 0; #endif SPICLOCK = 0; SPIOUT = 0; SPIIN = 1; SPIENABLE = 1; } #endif

// power on state

// power on state // select serial mode

// define SDO1 as output (master or slave) // define SDI1 as input (master or slave) // enable synchronous serial port

Como vern utilizo las funciones propias de C18 para la configuracin del mdulo SPI, por lo que hay que agregar #include <spi.h> , adems he creado una definicin que hay que agregar a HardwareProfile.h para que seleccione esta opcin, USE_ALTERNATIVE_CONFIG_SPI. Dentro del main se puede realizar algo como lo que sigue: #include <p18f2620.h> //****************************************************************************** #pragma config OSC=HSPLL #pragma config IESO=OFF #pragma config PWRT=ON #pragma config WDT=OFF #pragma config MCLRE=ON #pragma config XINST=OFF #pragma config DEBUG=OFF #pragma config FCMEN = OFF #pragma config LVP=OFF #pragma config BOREN=OFF #pragma config PBADEN = OFF //****************************************************************************** #include <delays.h> #include "FSIO.h" //****************************************************************************** char MyBuffer[100]="Creacin de archivo mediante libreria de Microchip\r\nby Suky..."; char Fecha,Mes,Hora,Minuto,Segundo; int Anio; //****************************************************************************** Autor: Suky www.micros-designs.com.ar 2011

void main(void){ FSFILE *MyFile; char Nombre[20], mode[3]; unsigned char err,k; char *Sc;

Delay10KTCYx(250); Delay10KTCYx(250); k=0; do{ Delay10KTCYx(50); err=FSInit(); k++; }while((k<10) && (err==FALSE)); if((k==10) && (err==FALSE)){ // Error... }else{ sprintf(&Nombre[0],"ARCHIVO.TXT"); // w+ Abre archivo para escritura, si existe sobre-escribe // a+ Abre archivo para escritura, si existe continua agregando datos al final. sprintf(&mode[0],"w+"); MyFile = FSfopen(Nombre,mode); for(Sc=&MyBuffer[0];*Sc!=0;Sc++); k=Sc-&MyBuffer[0]; Fecha=31;Mes=7;Anio=2011;Hora=15;Minuto=30;Segundo=45; SetClockVars(Anio,Mes,Fecha,Hora,Minuto,Segundo); // Actualizamos datos... FSfwrite(&MyBuffer[0], 1, k, MyFile); FSfclose(MyFile); } while(1); } El resultado de ello es:

Autor: Suky

www.micros-designs.com.ar

2011

Autor: Suky

www.micros-designs.com.ar

2011

Autor: Suky

www.micros-designs.com.ar

2011

Autor: Suky

www.micros-designs.com.ar

2011

Вам также может понравиться