Autor Tema: MMC Card : Hardware & Firmware  (Leído 54797 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: Llamando a Houston: MMC Card & Connector
« Respuesta #15 en: 20 de Enero de 2007, 21:25:16 »


« Última modificación: 10 de Junio de 2013, 09:21:10 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: Llamando a Houston: MMC Card & Connector
« Respuesta #16 en: 21 de Enero de 2007, 09:58:14 »
 :mrgreen: :-/ :mrgreen:











« Última modificación: 10 de Junio de 2013, 09:22:56 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: Llamando a Houston: MMC Card & Connector
« Respuesta #17 en: 21 de Enero de 2007, 15:28:40 »
Lectura del primer bloque de 512 bytes de la MMC Card  :mrgreen:

« Última modificación: 10 de Junio de 2013, 09:23:47 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: Llamando a Houston: MMC Card & Connector
« Respuesta #18 en: 21 de Enero de 2007, 16:10:02 »
La tarjeta que estoy utilizando para las pruebas estuvo en uso en un teléfono Móvil (celular) y al ir leyendo los datos que contiene me voy encontrando cosas ...  :mrgreen:

« Última modificación: 10 de Junio de 2013, 09:24:17 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: Llamando a Houston: MMC Card & Connector
« Respuesta #19 en: 21 de Enero de 2007, 16:17:02 »
-----------------------------------------------------------------------------------

Punto y seguido.

Hasta este post el hilo estaba en el Foro Técnico .... a partir de él se traslada, hace mudanza, QSY, al foro de Proyectos. Nació como una consulta con el título "Llamando a Houston: MMC Card & Connector" y evoluciona a la segunda esfera del purgatorio de Dante con el nuevo título de "MMC Card : Hardware & Firmware"  :mrgreen:

-----------------------------------------------------------------------------------

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #20 en: 21 de Enero de 2007, 16:58:28 »
Nace este proyecto MMC Card : Hardware & Firmware con un poco de camino recorrido.  :mrgreen:

Hasta ahora solo estamos a nivel de pruebas iniciales, pero a poco que le hechemos un poco de esfuerzo pronto alzará el vuelo.  :P

El hardware que estoy utilizando es el que corresponde al esquema que podéis ver mas abajo:



El diseño de este hardware lo he realizado dándome algunas miles de vueltas por la Web, por nuestro Foro TODOPIC y por el CCS C Forum. Pero quizás el que mas me ha influido es el que aparece en la página Captain Universe realizado con un PIC 16F876A (antiguo y buen amigo este PIC) que yo he adaptado a mi 18F2550 de la iACV1.

El conector para la MMC Card es el YAMAICHI FLS007-3003-0 que podéis encontrar en RS con el código 493-2018. El componente no existe para Eagle 4.16r1 así que me lo he fabricado yo mismo (si lo necesitáis no tenéis mas que pedirlo)



La fuente de 3.3 está construida alrededor de un LT1585CT3.3 que los amables señores de Linear tuvieron a bien enviarme como sample el pasado mes de Noviembre de 2006. Los dos condensadores de 10 uF son los que el Datasheet recomienda como necesarios para el buen funcionamiento del regulador.

Las señales SPI a manejar son DI (Data Input) DO (Data Output)  CK (Clock) y CS (Slave Select Input) todas ellas de 3.3V

Como DO es la única que va desde la MMC hacia el PIC y éste reconoce cualquier señal por encima de unos 2.0V como un HIGH no tenemos que hacerle nada para conectarlo, pero las demás tienen el sentido contrario, desde el PIC hacia la MMC, por lo que deben reducir su voltaje de 5V a 3.3V. Por ello construimos un divisor de tensión alrededor de las resistencias R1 y R4 para CK, R2 y R5 para DI y R3 y R6 para CS. Los valores de 1K8 y 3K3 utilizados hacen que los 5V de la señal del PIC pasen a ser nuestros 5*3300/(3300+1800)=3.24V.

El conector de la MMC Card es SMD así que al realizar el PCB le he dado la vuelta utilizando la herramienta "mirror" del Eagle para colocarlo en la cara inferior y el resto de componentes por encima, normalmente. El PCB resultante es:



Con esto el Hardware está descrito, y como os comenté mas arriba no he llegado a fabricar el PCB sino que lo he montado sobre una placa de taladros, pero siguiendo el mismo esquema, y ¡funciona! (podéis verla en los posts anteriores) :mrgreen:

(Para no sobrepasar el tamaño máximo por Post dejo el tema de las pruebas de Firmware para el siguiente posteo)


« Última modificación: 10 de Junio de 2013, 09:26:17 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #21 en: 21 de Enero de 2007, 17:36:27 »
Y seguimos con el proyecto.

La comunicación entre el PIC y la MMC Card se realiza mediante el protocolo Síncrono SPI. Como el PIC 18F2550 dispone de un modo de funcionamiento de la USART específico para el SPI parecería lógico usarlo y en paz, pero el hardware de la placa iACV1 tiene la USART dedicada a sus comunicaciones con el módulo Ethernet Tibbo EM202 así que lo que he decidido es emular la comunicación SPI por software. No ocupa mucho y funciona correctamente.

Todo el protocolo está construido alrededor del Driver de CCS C "mmc_spi.c" que podéis encontrar en el directorio Drivers de la instalación de dicho compilador.

Lo único importante a tener en cuenta al usar este driver es configurar los defines que dicen qué pines vamos a utilizar para cada una de las funciones SPI (DO, DI, CK y CS) "antes" del include del driver <mmc_spi.c> ya que en caso contrario estos defines no tendran efecto al ser compilados "después" que el código del driver.

En mi caso concreto he optado por usar los primeros pines del PORTB (que además son los que tengo disponibles en las clemas de la iACV1):

#define MMC_CS    PIN_B3
#define MMC_CLK   PIN_B2
#define MMC_DI    PIN_B0
#define MMC_DO    PIN_B1

Os pongo la cabecera con las funciones disponibles en el driver CCS C:

////////////////////// Driver for Multimedia Card ///////////////////////
////                                                                 ////
////  mmc_init() - Reset and Initialize the MMC.  Returns zero if OK ////
////                                                                 ////
////  mmc_modify_byte(address, val) - Modify the byte at address to  ////
////               change it's value to val.  Will read/write the    ////
////               entire 512 byte block but only change this        ////
////               specific byte.  Returns zero if OK.               ////
////                                                                 ////
////  mmc_modify_block(address, size, *ptr) - Modifies the bytes     ////
////               to change their value to whats stored at *ptr.    ////
////               Will read/write the entire 512 byte block(s) but  ////
////               only change the values defined by ptr and size.   ////
////               Returns zero if OK.                               ////
////                                                                 ////
////  mmc_write_block(address, size, *ptr) - Writes a 512 byte       ////
////               block to the MMC.  If size is less than 512 then  ////
////               unspecified data will be written as 0.  Returns   ////
////               zero if OK.                                       ////
////                                                                 ////
////  mmc_read_byte(address,*ptr) - Reads the byte specified at      ////
////               address.  Result is saved to ptr.  Returns zero   ////
////               if OK.                                            ////
////                                                                 ////
////  mmc_read_block(address, size, *ptr) - Reads the bytes          ////
////               specified at address.  Result is saved to ptr.    ////
////               Returns zero if OK.                               ////
////               NOTE: You might get an address error if you try   ////
////               to read over a page size.  For example, trying    ////
////               to read a block size of 512 starting at address   ////
////               0x100 may cause an error because you are reading  ////
////               two blocks.                                       ////
////                                                                 ////
////  mmc_erase(address, blocks) - Erases the block specified at     ////
////               address.  Will erase the entire 512 byte block.   ////
////               If you wish to erase more blocks after specified  ////
////               block use the blocks parameter to specifiy how    ////
////               many extra blocks to erase.  Returns zero if OK.  ////
////                                                                 ////
////              ~~~~~~~ MULTI-READ FUNCTIONS ~~~~~~~~              ////
////                                                                 ////
////  mmc_read_enable(address, size) - Start multi-reads at          ////
////               specified address.  Size is the size of each      ////
////               individual read.  Returns zero if OK.             ////
////                                                                 ////
////  mmc_read_mult_block(*ptr) - Reads data from the MMC, and saves ////
////               to ptr.  The number of bytes read is defined      ////
////               by mmc_read_enable().  You must call              ////
////               mmc_read_enable() before you can call this.       ////
////               Returns zero if OK.                               ////
////                                                                 ////
////  mmc_read_disable(void) - Stop a multi-read.                    ////
////               Returns zero if OK.                               ////
////               MAY BE BROKEN.                                    ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2001 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////

Con este driver en uso he construido un Firmware inicial que solo inicializa la MMC Card y que lee bloques de información sobre un buffer de 512 bytes de largo.

Las lecturas se realizan secuencialmente desde la address 0 en adelante en saltos de 512 bytes. Tened en cuenta que estoy usando:

1º.- Un driver directo, sin utilizar información sobre formateo lógico como puede ser un FAT16 o un FAT32.
2º.- La MMC Card que estoy usando estaba ya en uso en una cámara digital o un móvil por lo que la información que contiene está formateada y no sé cuál puede ser.

El firmware versión v.0.0.0 es (Le he quitado lo relativo a hacer funcionar el Led, el Buzzer y el Rele del que dispone el hardware iACV1) :

////////////////////////////////////////////////////////////////////////////////////
//
// MMC Card Test ...
// by RedPic
////////////////////////////////////////////////////////////////////////////////////

#include <18f2550.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#use delay(clock=20000000)

#define EM202_MD   PIN_A0
#define EM202_RST  PIN_A1
#define EM202_CTS  PIN_A2
#define EM202_RTS  PIN_A3
#define EM202_DTR  PIN_A4
#define EM202_DSR  PIN_A5
#define EM202_RX   PIN_C6
#define EM202_TX   PIN_C7

#define LED        PIN_C0
#define BUZZER     PIN_C1
#define RELE       PIN_C2

#use rs232(baud=19200, xmit=EM202_RX, rcv=EM202_TX)

char  cRec=0x00;                            // Último caracter recibido via serie
char  Command=0x00;                         // Comando a procesar

int8  MMCBuffer[512];
int32 address=0;


#define MMC_CS    PIN_B3
#define MMC_CLK   PIN_B2
#define MMC_DI    PIN_B0
#define MMC_DO    PIN_B1

#include "rr_mmc_spi.c"

////////////////////////////////////////////////////////////////////////////////////
//
// Funciones ...
//
////////////////////////////////////////////////////////////////////////////////////

void Cursor(char c){

   printf("%c\r\n>",c);
}

void Presenta_Hardware(void){

   printf("\r\n\n");
   printf("MMC MultiMedia Card Driver Test\r\n");
   printf("Hardware iACCESS CONTROL V1 v.0.0.0\r\n\n");

   printf("Commands when available:\r\n\n");
   printf("[X] Reset EM202 Ethernet Module\r\n");
   printf("[M] Init MMC Card\r\n");
   printf("[F] Read MMC Card Block First\r\n");
   printf("[R] Read MMC Card Block Actual\r\n");
   printf("[ ] Read MMC Card Block Next\r\n\n");
   Cursor(0x00);
}

void Reset_EM202(void){

   OUTPUT_HIGH(EM202_MD);
   OUTPUT_HIGH(EM202_RST);
   delay_ms(110);
   OUTPUT_LOW(EM202_RST);
   delay_ms(110);
}

////////////////////////////////////////////////////////////////////////////////////
//
// Interrupción por Recepción Serie RS232
//
////////////////////////////////////////////////////////////////////////////////////

#int_rda
void handle_rda_int(){

   if(kbhit()){                             // Si hay algo pdte de recibir ...
      cRec=getc();                          // lo recibo sobre cRec ...
      if(cRec!=0x00){                       // Si es distinto de \0 ...
         Command=ToUpper(cRec);             // cargo cRec sobre Command para procesarlo
      }                                     // pasándolo a Mayúsculas para no confundir.
   }
}

////////////////////////////////////////////////////////////////////////////////////
//
// Main
//
////////////////////////////////////////////////////////////////////////////////////

void main() {

   int16 f=0;
   int16 size=512;
   int8  col=0;

   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   port_b_pullups(false);

   set_tris_a(0b00001000);
   set_tris_c(0b10000000);

   enable_interrupts(global);
   enable_interrupts(int_rda);

   Reset_EM202();

   address=0;

   do {
      if(Command!=0x00){                    // Si he recibido un comando vía Serie ...
         if(Command=='?'){                  // Si el comando es '?' ...
            Presenta_Hardware();
         }
         if(Command=='X'){                  // Reset EM202
            Cursor(Command);
            Reset_EM202();
         }

         if(Command=='M'){                  // Inicializa MMC Card
            Cursor(Command);
            if(mmc_init()==0)
               printf("MMC init ok");
            else
               printf("MMC init fault");
            Cursor(0x00);
         }

         if(Command=='F'){                  // Read First Block MMC Card
            address=0;
            Command='R';
         }
        
         if(Command==' '){                  // Read Next Block MMC Card
            address+=512;
            Command='R';
         }
        
         if(Command=='R'){                  // Read Block MMC Card
            Cursor(Command);
            for(f=0;f<=511;f++) MMCBuffer[f]=0;
            size=511;
            col=0;
            if(mmc_read_block(address, size,&MMCBuffer[0])==0){
               printf("\r\n>MMC read ok from Address %LX to %LX\r\n",address,address+size);
               for(f=0;f<=511;f++){
                  printf("%X ",MMCBuffer[f]);
                  if(++col==16){
                     col=0;
                     printf("\r\n");
                  }
               }
            }
            else
               printf("\n\rread fault");
            Cursor(0x00);

         }
         Command=0x00;                      // Indico que ya he procesado el comando.
      }
   } while (TRUE);
}

Y como ejemplo de su funcionamiento os pego de nuevo la imagen en la que encontré una referencia a la FAT16 con que parece ser está formateada la MMC Card que estoy usando:



Ea, y ya está bien por hoy.
Mañana más.  :mrgreen:
« Última modificación: 10 de Junio de 2013, 09:27:13 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #22 en: 22 de Enero de 2007, 19:20:58 »
Bien, seguimos avanzando ...

Visto que la tarjeta que tengo en uso fue "formateada" en FAT16 me he tirado de cabeza a buscar info sobre la dichosa FAT16 y en efecto ved la info comparada con lo leído ... (Referencia Sistemas FAT y NTFS)



Tras esto lo que he hecho es formatear en mi PC la tarjeta y escribirle un par de ficheros de texto cuyo contenido y nombres conozco (como que los he hecho yo) asi que ahora me pongo a buscarlos y tratar de trabajar con ellos.

Perooooo .... fijaos lo que es capaz de escribir el Windows en el mismo área de la tarjeta que en la imagen anterior (recordad que fue formateada y usada en un móvil Nokia) empezando por el MSDOS 5.0 (como en los 80286 ja ja ja  :D :D :D)



En fin, que Guillermo Puertas y sus Ventanas todo lo ensucia, corrompe o complica.  :D :D :D

PD. Por cierto, he cambiado el Firmware para que me coloque las direcciones por filas y los valores offset de cada columna, asi como las transcripción a ASCII, de forma que sea mas facil su lectura.  :mrgreen:

 
« Última modificación: 10 de Junio de 2013, 09:28:01 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5102
    • uControl
Re: MMC Card : Hardware & Firmware
« Respuesta #23 en: 22 de Enero de 2007, 20:03:00 »
Impresionante  :shock:
Hasta se ven los mensajes que suelen aparecer en sistemas DOS cuando dejas un diskette en A: que no es booteable. Sabia que ese mensaje estaba en el floppy, pero no que todavia lo siguen poniendo!
En esa zona es donde se alojaban virus prehistoricos, como el "de la pelotita" o el "Michelangelo".
Que epocas! :)

Es muy probable que si borras casi todo eso, la tarjeta siga siendo reconocida.
Estoy siguiendo muy de cerca tus avances, Dieguito... ;)
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #24 en: 23 de Enero de 2007, 02:37:02 »
Si Ariel, si te fijas el byte 0x8025 es en el primer caso 0x80 (disco duro) y en el segundo 0x00 (diskette) y las etiquetas a partir de 0x802B son "Memory Card" para el primero y "NO NAME" para el segundo.  :mrgreen:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #25 en: 24 de Enero de 2007, 07:11:04 »
Para lo que como yo estamos pensando en trabajar con nuestras tarjetas MMC/SD en FAT16 (o FAT32) sería conveniente darse una vuelta por FAT32 File System Specification No tanto por la información técnica que también, sino sobre todo por la Legal. Parece ser que podemos usar el sistema FAT pero .... cuidadín, cuidadín con incluirlo en algo vendible que Guillermo Puertas puede caer sobre tí y sacarte hasta los empastes de las muelas.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5102
    • uControl
Re: MMC Card : Hardware & Firmware
« Respuesta #26 en: 24 de Enero de 2007, 07:47:43 »
Ops!!!!!  :shock:

Ahi tenemos un problema!

Yo estoy embarcado en un datalogger que supongo puede ser comercializable. ¿Deberia usar mi propio sistema de archivos? Ufaaa!

Una alternativa es armar un cacharro lector, con un pic, que lea la tarjeta (en el formato AITOPES o REDPIC nativo) y lo transforme en un flujo de datos USB o RS-232 que un ordenador pueda leer....sin infrigir patentes. O es que tambien el RS-232 esta bajo alguna patente de uso? :)

Diego, gracias por el dato!

Saludos.
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #27 en: 24 de Enero de 2007, 10:38:15 »
Ufff ... así creo que no debiera haber problemas, pero nunca se sabe quien es dueño de qué y por qué.  :(
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 333
Re: MMC Card : Hardware & Firmware
« Respuesta #28 en: 24 de Enero de 2007, 16:09:09 »
Hola estube leyendo tu programa redpic y veoq ue usas la libreria "rr_mmc_spi.c" y en cambio la que incluye el CCS se llema mmc_spi.c mi pregunta es la siguiente.

Le has hecho alguna modificación a esta libreria y la renombraste??? o simplemente la has renombrado?? dentro de poco quiero empezar a escribir y leer en mmc y estoy mirando ejemplos, y la verdad que este sin usar el Fat de bill gates se le ve interesante muchas gracias un saludo!!!
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5423
    • Picmania by Redraven
Re: MMC Card : Hardware & Firmware
« Respuesta #29 en: 24 de Enero de 2007, 16:19:51 »
amigo qiqe:

acostumbro a copiar las librerías y preservar la original "por si acaso". En este caso no he tocado nada, solo active el "debug" para ver que estaba pasando y después lo desactivé por lo que ambas, la original y la mia renombrada son la misma.  :mrgreen:

Lo que mas me ha gustado de esta librería es que por un lado es pequeña y nos permite leer y escribir sin problemas, y si no nos hace falta pasar después por un PC pues ya lo tenemos todo, y por otro lado que no hace uso del módulo SPI por hardware de un PIC en concreto, sino que lo gestiona por software pudiendo decirle qué pines vamos a usar.

En mi caso este último detalle era fundamental ya que los originales del PIC 18F2550 para el SPI los tenía embarcados en otros menesteres.  :D

« Última modificación: 24 de Enero de 2007, 16:23:20 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania