TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: RedPic en 16 de Enero de 2007, 18:53:44

Título: MMC Card : Hardware & Firmware
Publicado por: RedPic en 16 de Enero de 2007, 18:53:44
Solicito la colaboración de los amigos foreros con alguna experiencia en esto de las MMC card.  :)

Deseo comenzar realmente a probar con este tipo de tarjetas así que me he hecho con una y con un conector.  :mrgreen:

La tarjeta tiene escrita en el lomo los siguientes identificadores "0903042 6600 32 Mbyte", lo de los 32 Mbyte sospecho fundadamente que es el tamaño de la misma  :D , con los demás números ya no lo tengo tan claro. He buscado y rebuscado en Internet y todo apunta a que es una referencia al teléfono móvil Nokia 660 del que sospecho fué extraída esta tarjeta ya que me han asegurado que sirvió en las filas de un móvil antes de cedérmela.  :shock:

El conector lo he desoldado de un cacharro de esos lectores multi-tarjetas para PC. He extraído el único donde esta tarjeta encajaba mecanicamente de forma correcta. No tiene ninguna referencia, ni números, ni letras, ni perro que me ladre, ni pájaro que me cante. Tiene 11 contactos externos para soldar, estando todos mas o menos igual de separados unos de otros, menos los dos de uno de los extremos que estan mucho mas juntos uno al otro, y de éstos el penúltimo está conectado a la carcasa metálica superior.  :shock:

Sin embargo la tarjeta tiene solo 7 contactos por lo que parece que o sobran contactos del conector o faltan en la tarjeta.  :shock:

Os pongo un par de imágenes en detalle de ambos para ver si me podéis hechar una mano en saber si:

1.- Es realmente un MMC card lo que aparece en la foto y  :shock:
2.- El conector sirve para ella.  :shock:

(http://publi.garcia-cuervo.net/mmc_card_y_conector_vista_superior.jpg)
(http://publi.garcia-cuervo.net/mmc_card_y_conector_vista_inferior_contactos.jpg)


EDITO: Solo para darle el Icono de Positivo..  :mrgreen:

 
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 16 de Enero de 2007, 19:31:30
He encontrado esto en How to Use an MMC (http://elm-chan.org/docs/mmc/mmc_e.html)

(http://publi.garcia-cuervo.net/sdc_mmc_contact.jpg)

Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: aitopes en 16 de Enero de 2007, 19:58:32
Justamente.
El zocalo fisico de las MMC y las SD es muy parecido, ya que solo se diferencian en el grosor...y en el numero de contactos.
No lo tengo fresco (debo refrescarlo por que me pidieron un proyecto que involucra las SD) el tema, pero creo que es por las SD tienen un modo de funcionamiento que es compatible con las MMC (y usa esos pines nomas) y otro donde las transferencias se hacen por mas de un canal ( :shock: ) y para eso son los pines restantes.

Diego, que lastima que no uses Basic..... ;) Podriamos encarar la construccion de una libreria en conjunto.

Saludos!
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: doppel en 16 de Enero de 2007, 21:18:45
Hola Diego

Como siempre los temas que eliges son por demás interesantes y este tema en particular tb me gusta mucho es por eso que desde hace algún tiempo estoy juntando info sobre tarjetas a continuacion te dejo un par de archivos (http://www.4shared.com/dir/1779480/a797a0c1/sharing.html) que espero te sean útiles en la realización del proyecto, en los archivos hay un programita que sirve para monitorear la escritura/lectura de datos en la tarjeta y un circuito práctico de aplicación usando un pic 876!

saludos y gracias por compartir tus conocimientos
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 17 de Enero de 2007, 03:05:22
Gracias amigos.

Doppel ya tengo la info a buen recaudo. Le voy a dar un vistazo ... muchas gracias.

Bueno, el tema es que posteé esto aqui en el Foro Técnico pidiendo información sobre el conector para saber si era o no el adecuado ....

Si convertimos el hilo directamente en Proyecto lo moveré a Proyectos que para eso está, aunque creo que aún está, por mi parte, demasiado verde como para llevarlo allí. Quizás dentro de unos días ... ja ja ja  :D :D :D  :mrgreen:

Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 17 de Enero de 2007, 09:26:54
Acabo de pedirme este conector en RS On-Line (http://www.amidata.es/), me dicen mañana lo tengo en la ofi.  :mrgreen:

(http://publi.garcia-cuervo.net/conector_mmc_yamaichi_rs.jpg)

Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: raus en 17 de Enero de 2007, 09:40:31
Hola RedPic (y demás) ;)

Para mi proyecto de datalogger de datos meteorológicos, utilizo una SD card y pedí el conector a RS-amidata... ahora mismo no recuerdo si es como el tuyo, pero el mío es de la marca Yamaichi, y tengo las librerías para el Eagle, si alguien las quiere, que me avise y las cuelgo cuando llegue a casa

Saludos!!
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: aitopes en 17 de Enero de 2007, 10:32:28
Hola Diego!
Me llaman la atencion los dos pines que estan "adelantados" respecto de los otros....Mi zocalo no los tiene, y mis tarjetas SD (tengo 4) tampoco.. :shock:
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 17 de Enero de 2007, 10:36:15
Ariel, todas las que he visto tienen un par de pines así, un poco raros, no se por qué será pero parece que es usual (en las MMC, no en las MMC/SD) ...  :shock:

Raus, si quiero.  :mrgreen:

Este de la foto es el Yamaichi ese y es el que he pedido (3 unidades) asi que ... ¿a qué esperas? ¿eh? vamos, vamos ... cuelga yá ... ¿está ya? vamos, vamos ... ¿ya puedo? ¿ya? ... ja ja ja  :D :D :D
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: raus en 17 de Enero de 2007, 14:30:06
A ver... tengo un par de librerias más, pero son de Compact Flash y llevan algun conector SD. De esta libreria (o biblioteca para ser correctos) el que yo uso es el que acaba en 3003. Si necesitas algo más, avísame que acerca de las SD/MMC he recopilado un montón de código y documentos (estoy a puntito de empezar a probarlos todos, a ver si consigo escribir la FAT bien ).... y ya era hora de que te devolviese la ayuda que me has prestado, bueno, en realidad a todo el foro, jejeje.
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 19 de Enero de 2007, 08:00:51
...
Diego, que lastima que no uses Basic..... ;) Podriamos encarar la construccion de una libreria en conjunto.
...

Ariel, no desesperes. No se como llevaras de adelantado tu trabajo con MMC/SD y Basic pero por si acaso dale un vistazo a esto que he encontrado

MMC Project (http://www.compsys1.com/workbench/On_top_of_the_Bench/MMC_Project/mmc_project.html)

Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: ascii en 19 de Enero de 2007, 10:59:44
 :P Redpic sabes que no pude ver el codigo fuente  :mrgreen:
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 19 de Enero de 2007, 11:01:54
' Program: MMC3V.BAS written using PicBasicPro ver 2.40
' PicBasic Pro program to interface with a Sandisk
' MMC module using the SPI protocol.
'
'                    BETA CODE
' ************* NOT FOR COMMERCIAL USE *************************
'               Ver. 0.1.31  Nov, 2001
'
' Proprietory Owner: COMPsys, Copyright 2001
'
' Project Reference: MMC3V-F876
' MCU: Microchip PIC16F876
' Software: Compiler PBP V.2.40, IDE MBLAB Ver 5
' PIC Programmer: EPIC used to load the bootloader,
'                 Custom PCB with a serial interface
'                 for ISP and terminal output
'
' Initial Date: OCT 28, 2001
' Projected Completion Date: Unknown
'
' Author: Ranjit Diol
'         rsdiol@compsys1.com
'         http://www.compsys1.com/workbench
'
'---------------------------------------------------------------
'                      (c) COMPSys, 2001
'                     All Rights Reserved
'***************************************************************
'   DISCLAIMER: This file is being released as non-commericial
'   freeware. It is being provided "AS IS", neither the author,
'   nor COMPSys shall be held liable for any damages caused directly
'   or indirectly by its use.
'***************************************************************
'Brief: The MMC is a 3volt part therefore all data lines
'       must be conditioned if interfacing with a 5v mcu.
'
'       MMC pins in SPI mode:
'            Pin1:ChipSelect(SS),Pin2:MMC input(MOSI),Pin3:GND,Pin4:3V+,
'            Pin5:Clock(SCK), Pin6:GND, Pin7:MMC output(MISO)
'       PIC pins:
'            Portd.7 SS,Portd.6 SCK,Portd.5 MOSI, Portd.4 MISO
'
'       For voltage translation: 
'       An LM317 or LM2937-3.3 can be used to provide 3.3 volts
'       for the MMC and four 2N3904 transistors with resistors
'       can be used forfor MMC power and data line conditioning
'       See the SanDisk website for more details
'                  http://www.sandisk.com
'==============================================================
'
'                    I M P O R T A  N T
'                       PLEASE NOTES
' ************** This code is written for a PIC16F876 operating on 3.3volts **************
@ device pic16F876, xt_osc, wdt_on, pwrt_off, bod_off, lvp_off, cpd_off, wrt_off, protect_off
' ****************************************************************************************
'
' This application uses a external 3.3v FRAM FM24CL64 for temporary storage
' which does not require a wait state after a write and it does not have
' any limit on the number of lifetime writes!
'
' IF YOU USE a standard I2C EEprom you will have to insert a 5 or 10 ms pause
' after each write statement depending on the eeprom used.
'
'******************************************************************************************


DEFINE   ONINT_USED   1   'If using ISP

DEFINE OSC 10         'Adjust to suit your design
ADCON1   = 7         'Adjust ADC for your needs

'*****************************

include "modedefs.bas"


'I2C Variables
ctl      con    $A0      'EEPROM control code
edata    var   BYTE      'Data byte to be written

'***************** PIC PIN ASSIGNMENTS *****************

'I2C Eeprom Pins
scl    var    PORTC.3      'I2C SCL  for ext eeprom
sda    var   PORTC.4      'I2C SDA for ext eeprom

'Serial Pins
out_pin    var   PORTC.6      'Serial OUT pin
in_pin    var    PORTC.7      'Serial IN pin
ser_baud con   32      '19200 Baud


        TRISC.0 = 1                     'SO Set pin directions
   TRISC.1 = 0
   TRISC.2 = 0
   TRISC.5 = 0

'MMC Connections
SCK     var     PORTC.1                 ' Clock pin MMC pin 5
SO      var     PORTC.0                 ' Data from MMC pin 7
SS      var     PORTC.5                 ' Slave select pin 1
SI      var     PORTC.2                 ' Data to MMC pin 2


'***************** General MMC Variables used **************************

'Variables used (may be some that are no longer in use -- haven't cleaned up as yet!)

mmc_status   var     byte
mmc_status  =  $0000

addr    var     word
addr_H  var     word                    ' MMC Address is a 32 bit address, addr_h is bits 31-16
addr_L  var     word         ' and addr_l is is bits 0-15
arg0    var     byte         ' args used
arg1    var     byte
arg2    var     byte
arg3    var     byte
arg4    var     byte
cmd     var     byte         'command var
crc     var     byte         'crc var
dat     var     byte                    'data var
i   var     byte         'counter var
x       var     word         'counter var
y   var   byte         'counter var
res   var     byte         'response var
reswr   var     byte         'response w/r
res2    var     word         'response var

erase_flag var  byte
erase_flag = 0

eaddr1  var     word         'ext eeprom addr vars
eaddr2  var   word
e_addr  var     word


in_dat  var     byte                    'Serial vars
chk     var     byte
cntr    var     byte

addr      =      $0000         'Used for eeprom etc         

pause 500            'Let things settle a bit

'For debugging
serout2 out_pin,ser_baud,["Start",10,13] 'Display on terminal

' ***** Jump over the subroutines **************
goto main

'Initialize MMC
init_mmc:
   SS = 1
   dat =$ff
        cntr = 10
        gosub shiftout_dat
   ss = 0
    pause 50
   cmd = $40               'MMC Command 0
   crc = $95
cmd0:

    dat = cmd
        Shiftout SI, SCK, MSBFIRST,[dat]
   dat = 0
        cntr = 4
        gosub shiftout_dat
   dat = crc
        Shiftout SI, SCK, MSBFIRST,[dat]
        chk = 1
        gosub chk_res
   ss = 1
   pause 50
   ss = 0
CMD1:
'TO DO: Need to insert a 'time-out' after 255 attempts and branch to error routine
   while res <> 0
   ss = 1
   dat = $ff
        Shiftout SI, SCK, MSBFIRST,[dat]
        gosub shiftin_res
   ss = 0
   dat = $41                'MMC Command 1
        Shiftout SI, SCK, MSBFIRST,[dat]
        'arg4 = $41
        'gosub shiftout1
   dat = 0
        cntr = 4
        gosub shiftout_dat

   dat = $ff
        gosub shiftout2
        gosub shiftin_res
   wend
   dat = $ff
       'MMC now successfully initialized in SPI mode
'For debugging
serout2 out_pin,ser_baud,["INIT OK!",10,13] 'Display on terminal
return

'MMC Writing subroutine write 512 bytes stored in the I2C eeprom
'This routine will write whatever is in I2C eeprom locations eaddr1 to eaddr2

'Check response
chk_res:
'TO DO: Need to insert a 'time-out' after 255 attempts and branch to error routine
   while res <> chk         
        Shiftin SO, SCK, MSBPRE, [res]      
   wend
return

mwrite:
   ss = 1
   arg4 = $ff
        gosub shiftout1
        gosub shiftin_res
   ss = 0
    arg0 = $58
        arg1 = addr_H.BYTE1
        arg2 = addr_H.BYTE0
        arg3 = addr_L.BYTE1
        arg4 = addr_L.BYTE0
        gosub shiftout5
   arg4 = $ff
        gosub shiftout1
        gosub shiftin_res
        chk = 0
        gosub chk_res

'Write command was a success
   'File token tells the MMC data is to follow
   arg4 = $FE
        gosub shiftout1


'MMC now ready to write data in blocks of 512 bytes assumes eeprom address in eaddr1, eaddr2

   for addr = eaddr1 to eaddr2
      'READ addr,dat      'Read from internal eeprom if it has 512 byte capacity

           I2CREAD sda,scl,ctl,addr,[dat]   'Read from I2C ext eeprom
      Shiftout SI, SCK, MSBFIRST,[dat]
   next addr


   dat=$ff
        cntr = 2
        gosub shiftout_dat
        gosub shiftin_res
   y=res & $0f
        gosub shiftin_res

'TO DO: Need to insert a 'time-out' after 255 attempts and branch to error routine
   while res = 0      'MMC is busy writing until response is not = 0
          Shiftin SO, SCK, MSBPRE, [res]
   wend
   gosub mstatus      'Get write status   
return

'MMC Reading routine, assumes addr_H and addr_L have the MMC 32 bit address
mread:
   ss = 1
   arg4 = $ff
        gosub shiftout1
        gosub shiftin_res
   ss = 0
   arg0 = $51
        arg1 = addr_H.BYTE1
        arg2 = addr_H.BYTE0
        arg3 = addr_L.BYTE1
        arg4 = addr_L.BYTE0
        gosub shiftout5
   arg4 = $ff
        gosub shiftout1
        gosub shiftin_res
   chk = 0
   gosub chk_res
   chk = $FE
   gosub chk_res

'Read cmd successful

'Read the MMC data and save in eeprom assumes eaddr1 and eaddr2 is given
    for e_addr = eaddr1 to eaddr2      'We will read 512 bytes can be any number
   
         Shiftin SO, SCK, MSBPRE, [dat]
        'We now have a byte do something with it!
         I2CWRITE sda,scl,ctl,e_addr,[dat]      'Write to eeprom from eaddr1 to eaddr2
 
    next e_addr

'Required after a MMCread
        gosub shiftin_res
        gosub shiftin_res

     gosub mstatus      'Get read status

return

'Set block length (must lie with sector boundaries minimum default is 512)
mset_blk:
'Cmd16:
   cmd = $50
        crc = $ff
        gosub send_cmd
return

'MMC tag beginning and end of an earse block
tag_start:
'MMC tag block
'Block START TAG
'Cmd32
   cmd = $60
        gosub send_cmd
return

tag_end:
'Cmd33
   cmd = $61
        gosub send_cmd
return

'MMC erase tagged block
merase:

'For debugging
'ERASE BLOCK at addr_h,addr_L
'Cmd38
   erase_flag = 1
   cmd = $66
        gosub send_cmd
   erase_flag = 0     
return

'=============================

'Send a command to the mmc assumes CMD, addr_H and addr_L
send_cmd:
        ss = 1
   arg4 = $ff
        gosub shiftout1
        gosub shiftin_res
        ss = 0
        arg0  = cmd
        arg1 = addr_H.BYTE1
        arg2 = addr_H.BYTE0
        arg3 = addr_L.BYTE1
        arg4 = addr_L.BYTE0
        gosub shiftout5
   Dat = $FF
        cntr = 2
        gosub shiftout_dat
        gosub shiftin_res
   if erase_flag = 1 then return
   chk = 0
   gosub chk_res
return



'MMC status
mstatus:
   ss = 1
   dat = $ff
        Shiftout SI, SCK, MSBFIRST,[dat]
        gosub shiftin_res

   ss = 0
   arg4 = $4D
        gosub shiftout1
   dat = 0
        cntr = 4
        gosub shiftout_dat
   arg4 = $ff
        gosub shiftout1
        Shiftin SO, SCK, MSBPRE, [res2\16]
        mmc_status = res2
return

'Shift out the same data. Assumes DAT and cntr
shiftout_dat:
            for y = 1 to cntr
           Shiftout SI, SCK, MSBFIRST,[dat]
            next y
return

'Shift out 5 (ARG0-ARG4)
shiftout5:
        Shiftout SI, SCK, MSBFIRST,[arg0]
shiftout4:
        Shiftout SI, SCK, MSBFIRST,[arg1]
shiftout3:
        Shiftout SI, SCK, MSBFIRST,[arg2]
shiftout2:
        Shiftout SI, SCK, MSBFIRST,[arg3]
shiftout1:
        Shiftout SI, SCK, MSBFIRST,[arg4]
return

'Shiftin RES
shiftin_res:
         Shiftin SO, SCK, MSBPRE, [res]
return

'====================== END OF MMC GENERAL ROUTINES =========================

'Subroutine used by this application
disp:
serout2 out_pin,ser_baud,["Data from MMC",10,13] 'Display on terminal
'Display data to terminal, assumes eaddr1,eaddr2 are given
   for e_addr = eaddr1 to eaddr2
           I2CREAD sda,scl,ctl,e_addr,[dat]
           serout2 out_pin,ser_baud,[dat]   'Display on terminal
        next e_addr
return

'*************** M A I N   P R O G R A M ****************
main:

'Initialize the MMC
   gosub init_mmc

'Set block length (minimum 512 bytes when writing) default is 512 bytes
   addr_H = $0000
   addr_L = $0200
   gosub mset_blk

'Set an I2C eeprom address (512 bytes)
   eaddr1 = 0
   eaddr2 = $01FF

'Load the eeprom with some data to simulate this we
'write 512 bytes to the eeprom
   Dat = "A"
   for e_addr = eaddr1 to eaddr2
           I2CWRITE sda,scl,ctl,e_addr,[dat]
        next e_addr

'Set some MMC address 0 - to the end. (However, it must remain within sector boundaries)
'Since we are reading/writing 512 bytes at a time just make sure that the address is a integer
'multiple of 512 bytes. Such as: 0, $0200,$0400...$0A00...$00010A00 etc

   addr_H = $0001
   addr_L = $0000  'Multiple of 512 bytes

'Now transfer the data from the eeprom to the MMC
   gosub mwrite

'For debugging
serout2 out_pin,ser_baud,["Data Written to MMC",10,13] 'Display on terminal

'Next, we read the data back from the MMC and load it into the eeprom
'using the same addresses as above
   gosub mread

'Now, read it back from the eeprom and display it
gosub disp

'If you want to erase the data you need to set the start and end addresses
'But, they must not cross block boundaries

'*** Note*****
'If the program hangs at the erase command
'Sandisk documentation states that the erase command in SPI mode can
'sometimes not work correctly. Depends on the version of the card.
'However,it works fine on the Viking MMC's

'For debuggin
serout2 out_pin,ser_baud,[10,13,"Erasing...",10,13] 'Finished!
'Set the start erase TAG
gosub tag_start

'Set the end erase TAG
addr_H = $0001
addr_L = $01FF
gosub tag_end


'Issue the erase command
gosub merase   

'Verify it by reading the MMC again
addr_L = $0000
gosub mread

'And finally display the results
'Display data to terminal, assumes eaddr1,eaddr2 are given

'Debugging
serout2 out_pin,ser_baud,["Data from MMC after erase",10,13] 'Display on terminal

   for e_addr = eaddr1 to eaddr2
           I2CREAD sda,scl,ctl,e_addr,[dat]
           serout2 out_pin,ser_baud,[hex2 dat]   'Display on terminal
        next e_addr

'For debugging
serout2 out_pin,ser_baud,[10,13,"All Done!",10,13] 'Finished!
end
'******************* END OF CODE ************************
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: aitopes en 19 de Enero de 2007, 13:03:04
Hola Diego!
Muchas gracias por el codigo. Va a ser un buen punto de partida. Es mucho mas sencillo migrar de un BASIC a otro que desde ASM o C.

Saludos!
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 19 de Enero de 2007, 16:46:13
A mandar que pa' eso estamos (frase popular española que significa A mandar que para eso estamos  :D)

Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 20 de Enero de 2007, 21:25:16
(http://picmania.garcia-cuervo.net/images/mmc_card_adapter_schema.gif)

(http://picmania.garcia-cuervo.net/images/mmc_card_adapter_board.gif)
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 21 de Enero de 2007, 09:58:14
 :mrgreen: :-/ :mrgreen:

(http://picmania.garcia-cuervo.net/images/mmc_card_adapter_dump_first_ok.gif)

(http://picmania.garcia-cuervo.net/images/mmc_card_adapter_foto1_iacv1_front.jpg)

(http://picmania.garcia-cuervo.net/images/mmc_card_adapter_foto2_iacv1_reverse.jpg)

(http://picmania.garcia-cuervo.net/images/mmc_card_adapter_foto3_detalle.jpg)



Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic en 21 de Enero de 2007, 15:28:40
Lectura del primer bloque de 512 bytes de la MMC Card  :mrgreen:

(http://publi.garcia-cuervo.net/mmc_card_dump_first_read_block.gif)
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic 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:

(http://publi.garcia-cuervo.net/mmc_card_dump_read_block_at_8000.gif)
Título: Re: Llamando a Houston: MMC Card & Connector
Publicado por: RedPic 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:

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

Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic 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:

(http://picmania.garcia-cuervo.net/images/mmc_card_adapter_schema.gif)

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  (http://www.captain.at/electronics/pic-mmc/) realizado con un PIC 16F876A (antiguo y buen amigo este PIC) que yo he adaptado a mi 18F2550 de la iACV1 (http://picmania.garcia-cuervo.net/Profesionales/profesionales_02_iacv1.htm).

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)

(http://publi.garcia-cuervo.net/conector_mmc_yamaichi_rs.jpg)

La fuente de 3.3 está construida alrededor de un LT1585CT3.3 que los amables señores de Linear (http://www.linear.com/) 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 (http://picmania.garcia-cuervo.net/Electronica_Basica_Divisor_Tension.htm) 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:

(http://picmania.garcia-cuervo.net/images/mmc_card_adapter_board.gif)

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)


Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic 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 (http://picmania.garcia-cuervo.net/Profesionales/Profesionales_02_iACV1.htm) tiene la USART dedicada a sus comunicaciones con el módulo Ethernet Tibbo EM202 (http://picmania.garcia-cuervo.net/Proyectos_RRPICNET.htm) 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:

(http://publi.garcia-cuervo.net/mmc_card_dump_read_block_at_8000.gif)

Ea, y ya está bien por hoy.
Mañana más.  :mrgreen:
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic 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 (http://www.zator.com/Hardware/H8_1_2a1.htm))

(http://publi.garcia-cuervo.net/mmc_card_fat16_descubierta_1.jpg)

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)

(http://publi.garcia-cuervo.net/mmc_card_fat16_descubierta_2.jpg)

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:

 
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes 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... ;)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic 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:
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic 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 (http://www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx) 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.

Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes 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.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic 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é.  :(
Título: Re: MMC Card : Hardware & Firmware
Publicado por: QIQE 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!!!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic 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

Título: Re: MMC Card : Hardware & Firmware
Publicado por: QIQE en 24 de Enero de 2007, 16:30:40
muchas gracias, haber si tengo algun finde libre y aparco proyectos para ponerme con la mmc me parece un muy buen sustituto para las EEPROM
Título: Re: MMC Card : Hardware & Firmware
Publicado por: LABmouse en 24 de Enero de 2007, 17:32:21
Maestro RedPic, Este tipo de memorias con la tecnica que estas usando, yo podria diseñar una memori USB, solo el PIC 18F2550 y la memoria SD??
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 25 de Enero de 2007, 02:22:14
Si. Ya lo tienes todo. Solo habría que utilizar el driver "Mass storage" para que el Güindous reconozca el cacharro como un disco.

En eso estoy  :mrgreen:

Título: Re: MMC Card : Hardware & Firmware
Publicado por: Nocturno en 25 de Enero de 2007, 02:29:25
Proyecto añadido al Índice de Proyectos (http://www.todopic.com.ar/foros/index.php?topic=14633.msg89354#msg89354)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 25 de Enero de 2007, 03:25:00
Graciaaaaasss Manolo por la gentileza ....

Este finde voy a intentar implementar el FAT16 mono-directorio, solo el directorio raíz que simplifica mucho y como primer acercamiento no es mala opción, para ser capaz de leer y/o escribir en un fichero dado y que éste pueda ser leído y/o escrito también en el lector multitarjeta del PC, o sea que la tarjeta pueda ir de uno a otro sin problemas.

Voy a dejar para una segunda tacada lo que comentaba  el amigo PICmouse sobre el "Mass Storage" para no complicar la MMC con el USB hasta que la MMC la tenga dominada.  :mrgreen:

Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 25 de Enero de 2007, 09:07:04
Diego: Te parece que vaya tratando de traducir el codigo de C a Basic? Como para tener la "solucion" en ambos mundos?

Por supuesto, la clave de mi ofrecimiento esta en la palabra "tratando".... ;)

Un abrazo.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 25 de Enero de 2007, 09:11:25
¡Señor! ¡Sí, señor!  :mrgreen:

Pos claro que quiero ... así podemos tener este proyecto conjunto escrito en C-Basic pa tos los amigos, sean del bando que sean.

Título: Re: MMC Card : Hardware & Firmware
Publicado por: LABmouse en 25 de Enero de 2007, 11:23:01
pues Amigo RedPic, lo que pasa es que con el ritmo tuyo, es dificil seguirte el paso, yo seguire leyendo tus avances, Solo te doy mucho animo. Que te esta quedando de pelicula.

saludos!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: PalitroqueZ en 25 de Enero de 2007, 11:51:12
Gran trabajo el que hace RedPic :o, estoy siguiendo de cerca tus avances, no me da tiempo para meterle manos a esas memorias :?


Salu2
Pedro
Título: Re: MMC Card : Hardware & Firmware
Publicado por: cchhaa en 25 de Enero de 2007, 13:24:43
JJJOOOO Redpic alucino con tus proyectos, no solo por lo interesantes y bien explicados, si no por la ilusion y ganas que se siente en cada frase que leo tuya, en serio, alucino, seguramente tu señora esposa no opinara lo mismo, pero aqui en el foro estamos muchos que cada vez que empiezas un proyecto pensamos para nosotros mismo "eso tengo que hacerlo tambien", pero no nos das cuartelillo, es imposible seguirte, bueno hay alguno por hay que si puede, pero es que no sois normales.

Bueno, lo dicho, otro proyecto mas pa la libreta de pendientes por hacer, y ya van ........
saludos
cchhaa

p.d. Oye, no has pensado en hacer un libro, con la cantidad de proyectos que tienes y todos son proyectos practicos estaria muy bien.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 25 de Enero de 2007, 15:43:59
¡¡¡ wow !!! ¡Qué exagerados sois ! Si voy solo a un cuarto máquina ...  :mrgreen:

Precisamente por lo que dice cchhaa ... mi esposa no está tan contanta como ustedes  :D

Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 25 de Enero de 2007, 17:55:19
Bueno, señores, tengo buenas y malas noticias que daros  :mrgreen:

Llevo varias horas dándome cabezazos contra un par de códigos FAT16, el uno descargado del CCS Forum y el otro "prestado" por el amigo Raus (http://www.todopic.com.ar/foros/index.php?action=profile;u=5462)  de este foro.

Ambos tienen para mí un gravísimo inconveniente: ambos utilizan el módulo SPI del PIC en cuestión. Yo no puedo hacerlo por este método.

Como dije antes tengo los pines SPI de mi 18F2550 destinados a otro uso y me es fundamental mantenerlos en ello, no puedo usar el SPI por hard.

Sin embargo el driver "mmc_spi.c" de CCS C implementa toda la comunicación SPI por software en una serie de funciones perfectamente operativas.

El dilema que se me plantea ahora es:

1.- ¿Sigo trabajando con los códigos FAT16 ya implementados e intento sustituir solo la parte de comunicación SPI reescribiendo las funciones SPI_READ() y SPI_WRITE() del CCS?

2.- ¿Utilizo la base quasi-hardware del "mmc_spi.c" e implemento mi propio driver FAT16 basándome en la documentación técnica de Microsoft de la que os hable haces unos posts?

A mi el cuerpo me pide la segunda opción ... sobre todo porque significaría entender de verdad cómo funciona lo de la FAT16, el problema como siempre sería de tiempo. Pasar de una lectura / escritura hardware de bloques de 512 bytes por dirección absoluta a un sistema lógico creado por la gente de Microsoft, que ya sabeís que su máximo lema es "Haga díficil lo sencillo para que lo dificil sea imposible", creando capa a capa lo que vaya desentrañando de la cebolla microsoftiana.

No sé que hacer. Dudo, dudo mucho, Sufro, sufro mucho.  :?

Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 25 de Enero de 2007, 17:58:52
Mmmmmmmmmm......

La segunda es la mejor. Te independizas del hard. Y la cebolla debe tener muchas capas, pero a lo mejor algunas se pueden obviar. Tenes algun doc para ir mirando? Por ahi puedo opinar algo si leo mucho. ;)

Y fuerza, que para sufrir es que hemos elegido este hobby! :)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Nocturno en 25 de Enero de 2007, 18:09:38
Si realmente tienes prisa, el SPI por software sale con dos patadas.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 25 de Enero de 2007, 18:22:45
Aitopes:

El mejor sitio es Tutorial sobre Tecnología PC (http://www.zator.com/Hardware/)  de Zator Systems y también el documento original de Microsoft Microsoft Extensible Firmware Initiative FAT32 File System Specification  (http://publi.garcia-cuervo.net/fatgen103.doc)

Creo que por información no va a quedar  :mrgreen:

Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 25 de Enero de 2007, 19:50:43
Gracias!
Los acabo de bajar. Hay para leer un ratito. :mrgreen:
Título: Re: MMC Card : Hardware & Firmware
Publicado por: J1M en 25 de Enero de 2007, 21:43:58
Esto está cada vez mas chulo!! :D:D Respecto al SPI, solo lo utilicé una vez por software (en la biblioteca para GCLCD, probé el SPI por soft y por hard) y no había ni punto de comparación, el hard mucho mas rápido, no te sabría poner en pie si fué mi culpa (muy probable) o esq por soft no se le puede exprimir al menos tanto como al hard. En esta casa se ha publicado también otra libreria para FAT16, te dejo aquí la de diego a ver si te sirve :)
http://www.todopic.com.ar/foros/index.php?topic=11990.0

Saludos!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 26 de Enero de 2007, 02:22:03
Gracias Jaime, ésa es una de las que tengo en stand-by para ver si puedo adaptarla para el SPI Soft. En cuanto a lo que me dices entre soft y hard tienes mucha razón ... pero mi problema es particular, la placa que uso ya está diseñada y no puedo usar los pines del SPI hard. Voy a intentarlo así, y si funciona cuando lo use con un hardware SPI-hard-compatible todo irá de maravillas.  :mrgreen:

Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 26 de Enero de 2007, 04:49:25
De http://pic18fusb.online.fr/wiki/wikka.php?wakka=MsDrive  :mrgreen:


Understanding FAT/FAT32 Filesystems
http://www.pjrc.com/tech/8051/ide/fat32.html (Understanding FAT32 Filesystems)
http://www.compuphase.com/mbr_fat.htm (FAT on a Compact Flash card or a Memory Stick)
http://staff.washington.edu/dittrich/misc/fatgen103.pdf (FAT32 File System Specification)
http://md.hudora.de/presentations/forensics/2004-10-26/fatgen103.doc.pdf (FAT32 File System Specification, same as above)
http://home.teleport.com/~brainy/fat32.htm (FAT32 Structure Information)
http://home.teleport.com/~brainy/fat16.htm (FAT16 Structure Information)
http://www.digitalspirit.org/wiki/docs/fat16 [fr] (FAT16/32 Informations)
http://www.digitalspirit.org/file/?aff=,/docs/fat/appnote_fat16.pdf (Overview of a FAT16 File System)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 26 de Enero de 2007, 10:36:25
Para, para, para!!!! Que recien voy por la mitad del documento de Microsoft!!!! :shock:

EDITO: Diego, al final de cada link hay unos caracteres "raros" que no dejan acceder correctamente.
Son los "%E2%88%9E" del final, creo. Se ven como el simbolo de "infinito" en tus links.

Saludos.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 26 de Enero de 2007, 11:29:25
Arreglado. Quitados los infinitos.  :mrgreen:
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 26 de Enero de 2007, 11:36:39
Hola Diego, amigos:

Como ejercicio para comprender un poco el tema de las FATxx´s, he omenzado a traducir y comentar el documento Microsoft Extensible Firmware Initiative FAT32 File System Specification  (http://publi.garcia-cuervo.net/fatgen103.doc) que tan generosamente aporto Diego. Si bien es muy escueto ("solo" unas 30 paginas) explica muy bien que es cada byte del MBR y del BPB. Ademas, los "muchachos" son los que crearon la extructura, y se permiten dar unos cuantos consejos, sobre todo para garantizar la compatibilidad con hard viejo o "chapucero".

Me pongo a ello, y en breve les paso un link al documento traducido/comentado en mi web. Cuando este listo, lo posteare como una GUIA o un hilo. Espero le sirva a alguien mas.

Por ahora, debo reconocer, estoy muy verde con el tema, pero pretendo solucionarlo. ;)

Saludos.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 26 de Enero de 2007, 15:57:30
Hola de nuevo...

¿Alguien conoce o tiene el link para descargar algun soft que me permita mirar la FAT de un disco o tarjeta de memoria? Me vendria barbaro para estudiar el tema.

Gracias!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 26 de Enero de 2007, 18:16:42
ja, ja, ja,  :D :D :D

Ariel, precisamente eso es lo primero que me estoy fabricando: un firmware inspector de la estructura. Primero leer y transmitir cualquier bloque de 512 bytes para ver su contenido. Segundo un buscador de cualquier secuencia de bytes dándole una address inicial y otra final para acotar dónde buscar ....

En cuanto lo tenga operativo lo publico ... y si te montas el hardware minimo para leer la tarjeta ya lo tenemos disponible.

Eso o el Norton Utilities antediluviano para inspeccionar el contenido de un Diskette  :mrgreen:
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 26 de Enero de 2007, 18:58:45
Te espero... :)
¿Que micro pensas usar? Tengo 3 18F4520 en esas capsulas chiquiiiiiitas con pines chiquiiiiiitos en las cuatro caras (SMD) que podria usar para esto..
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 26 de Enero de 2007, 19:05:40
Yo lo estoy montando sobre un 18F2550 con el canal serie libre para comunicarme con él y estoy usando la librería MMC_SPI.C de CCS C con el SPI hardware-independiente para dejarme libre el pin RX (que en este micro es el compartido con el SDO) asi que vale para cualquier micro con bastante RAM, ya que es fundamental leer bloques completos en un buffer de 512 bytes.

P.D. El canal serie no lo estoy utilizando con un MAX232 sino con el EM202 Ethernet a 115200 braulios y va como una moto.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 26 de Enero de 2007, 19:45:05
Lo mio va a ser de miedo. No tengo librerias de nada, asi que voy arrancando desde CERO. Hoy me he pasado la tarde transcribiendo el documento de Microsoft que explica FAT12, 16 y 32 solo para que todo me vaya quedando clarisimo.
Hasta ahora, sin problemas.

Mañana, despues de un par de tareas impostergables, voy a encarar un PCB para montar el lector de tarjetas y el micro, asi puedo hacer alguna prueba. Es probable que utilice alguna variacion de tu esquema.....;)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 26 de Enero de 2007, 19:47:38
Me olvidaba: Este link (http://thestarman.pcministry.com/asm/mbr/STDMBR.htm) contiene algun dato interesante sobre MBR.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Duende_Azul en 26 de Enero de 2007, 22:17:14
Este programa sirve para ver el contenido de un disco (o tarjeta)...

http://www.x-ways.net/winhex/index-e.html
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 27 de Enero de 2007, 09:27:25
Hola!
Bueno, me he puesto a trabajar y he comenzado la GUIA: FAT al desnudo (http://www.todopic.com.ar/foros/index.php?topic=15741.0) donde ire posteando una especie de ....."manual" sobre como esta constituida la FAT. Usare como ejemplo un diskete (es lo que tengo a mano) y la analizare byte a byte. Los invito a que se den una vuelta por alla.
Por supuesto, una copia de la GUIA: Fat al desnudo va a residir en www.ucontrol.com (en unos dias) con un formato diferente, y en PDF tambien.

Saludos!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Nocturno en 27 de Enero de 2007, 12:33:01
Mmmmm, vosotros estáis liados con la FAT, Diego ya implementó la lectura y escritura del teclado PS2, yo hice lo propio con un ratón PS2, el maestro Sisco genera señal VGA ... ¿qué nos falta para meter un Linux en un PIC?
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 27 de Enero de 2007, 12:40:04
Hola Manolo!
Linux no creo....pero ¿no se podra hacer (como ejercicio nomas) una especie de microcomputadora, como las ZX81 o similares, basandose en un PIC?
Te dejo la idea...;)

Saludos!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Nocturno en 27 de Enero de 2007, 12:42:02
¡Eh, eh!, a mí no me desafíes. ¡¡¡Además, yo lo he dicho antes!!!  :P
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 27 de Enero de 2007, 12:45:00
Ufa....ya me ilusionaba yo con una compu hecha en casa. En fin, fue un buen intento.  :mrgreen:

Título: Re: MMC Card : Hardware & Firmware
Publicado por: Duende_Azul en 27 de Enero de 2007, 13:01:13
PROXIMO POST DE NOCTURNO (o REDPIC)!!!!!!   Compu Hecha en casa con Linux y PIC16F84   :D  :D  :D
Título: Re: MMC Card : Hardware & Firmware
Publicado por: LABmouse en 27 de Enero de 2007, 13:45:45
ya creo que si... estos trabajan en esto como si detras estubiera un tipo tirando latigo todo el dia. jajajaja :D es impresionante lo que hacen y mas la manera de compartirlo, mas explicado imposibe.!!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 27 de Enero de 2007, 14:28:42
Hoy vamos a terminar lo de las FAT, mañana le meteremos mano al PicPC  :mrgreen:
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Nocturno en 27 de Enero de 2007, 14:33:31
Mi primer ordenata era un MSX con un Z80A a 3,57MHz.
Hoy estoy jugando con mi dsRRBOARD que calza un dsPIC33F a 50MIPS.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 27 de Enero de 2007, 14:53:19
¿No te digo Manolo? Ya lo tienes, lo unico que te falta es ponerle huevos! :)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 29 de Enero de 2007, 19:53:39
Otro palito a la burra pa que camine.

Continúo, muy poco a poco, trabajando con el asunto MMC. Ahora le he implementado al proto-firmware la función de poder leer cualquier sector (de 512 bytes) de la MMC. Ahora ya podré "navegar" por la MMC para investigar y/o confirmar la estructura FAT16 que tan bien nos está describiendo y documentando el amigo Ariel / aitopes en GUIA: FAT al desnudo (http://www.todopic.com.ar/foros/index.php?topic=15743.0).

Como yo le escribo al PIC el comando "a hhhhhhhh" donde hhhhhhhh es la dirección en ascii-hex que quiero leer me he fabricado un par de funciones.

char *_extract_arghex_from_s(char* ptr) que extrae el string argumento en ascci donde le escribo la direccion y int32 _hexstoint32(char* ptr) que convierte el string extraído a un entero larguísimo (de 32 bytes) que es la dirección que voy a leer. Estas funciones usan la estándar strlen() para conocer la longitud del argumento extraído pero ... en lugar de hacer el include del <strings.h> que me carga y compila todas las funciones de strings me he implementado solo la que me hacía falta, renombrándola como int8 _strlen(char* ptr)

Las funciones han quedado así:

int8 _strlen(char* ptr){
   int8 i;
   int8 r=0;
   for(i=0; i<MaxLenRecBuffer; ++i) {
      if(ptr[ i ]=='\0'){
         r=i;
         i=MaxLenRecBuffer;
      }
   }
   return r;
}

char* _extract_arghex_from_s(char* ptr){
   char arg[]="00000000";
   char c='\0';
   int8 i,j,L;
   L = _strlen(ptr);
   for(i=L,j=7;i!=0,j!=0,c!=' ';i--){
      c=ptr[ i ];
      if(c!=0x20 AND isxdigit(c)) arg[j--]=c;
   }
   return (char*) arg;  
}

int32 _hexstoint32(char* ptr){
   int32 n=0;
   char  arg[]="00000000";
   char* arg_ptr;
   int8  i,d;
   char  c;
   arg_ptr = _extract_arghex_from_s(ptr);
   strcpy(arg,arg_ptr);
   for(i=7;i!=255;i--){
      c = arg[ i ];
      if(c<='9') d=(c-'0'); else d=(c-'A')+10;
      switch(i){
         case 7: n += (d * 0x00000001); break;
         case 6: n += (d * 0x00000010); break;
         case 5: n += (d * 0x00000100); break;
         case 4: n += (d * 0x00001000); break;
         case 3: n += (d * 0x00010000); break;
         case 2: n += (d * 0x00100000); break;
         case 1: n += (d * 0x01000000); break;
         case 0: n += (d * 0x10000000); break;
      }
   }
   return n;
}

y su uso en el programa es tan simple como:

address = _hexstoint32((char*) recbuffer);

Así que ahora puedo ya, por fin, ir directamente a ver cuál es el BMR de mi MMC  :mrgreen:

(http://publi.garcia-cuervo.net/mmc_card_dump_read_block_at_address.gif)






Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 29 de Enero de 2007, 19:56:38
Muy bien Diego!!!!!!! :-/

Yo sigo liado con la estructura de directorios....pero siento que le voy encontrando la vuelta. 8)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 31 de Enero de 2007, 18:48:57
 Del salón en el ángulo oscuro,
 de su dueña tal vez olvidada,
 silenciosa y cubierta de polvo
 veíase el arpa.

 Gustavo Adlofo Becquer (Poeta Sevillano 1836-1870)
 Primera estrofa de su Rima VII (http://www.los-poetas.com/a/beq1.htm#RIMA%20VII)

Para que no digáis de mí como Becquer decía de la dueña del arpa os confirmo que sigo en la brecha, dándome de cabezazos con la MMC Card.  :mrgreen:

Y ahora ya tengo una herramienta para navegar por sus entrañas ... y debo decir que está siendo un pequeño-gran suplicio el penetrar en los secretos de la FAT16. Estos señores de Mocosoft deberían de dejar de fumar cosas prohibidas cuando se ponen a diseñar.

Leyendo, releyendo y volviendo a leer lo publicado por el amigo Ariel/Aitopes llego a la conclusión de que falta algo. Sobre todo en cuestión de direcciones.

Me explico:

En su documento habla del MBR, y como ejemplo utiliza un Diskette, en el que el MBR ocupa el primer sector, primeros 512 bytes del mismo, o sea a partir de la dirección 0x0000. Sin embargo en mi MMC éste comienza a partir de la posición 0x8000. Y en la posición 0x0000 tengo "otra" información de la que no habla su documento.

Sospecho que es la Tabla Maestra de Particiones MPT de la que no disponen los Disquetes pero sí los Discos Duros o asimilados. Sospecho asimismo que ahí está la información necesaria para, después de leerla, encontrar en función de ella, calculándola, la posición del MBR que nos describe Ariel.

Para comenzar todo desde una posición o estado conocido de la MMC Card he procedido a:

.- Formatear en XP la tarjeta, sin marcar la opción de formateo rápido, y colocándole la etiqueta de volúmen "RRMMCCARD"

.- Creé en mi PC dos ficheros de Texto con nombres "RRFILE1.TXT" y "RRFILE2.TXT" cuyos contenidos sólo difieren en un byte, un "1" en RRFILE1 y un "2" en RRFILE2. El contenido de ambos, salvo ese byte de diferencia, es:

RRFILE1AAAAAAAAA
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF
0123456789ABCDEF


Como véis es muy fácil de detectar su contenido dentro de la MMC Card.

.- Copié y pegué desde mi PC primero el fichero "RRFILE1.TXT" y después el fichero "RRFILE2.TXT"

y 4º.- Me puse al habla con el PIC para estudiar cúal era el contenido de la MMC Card, dónde y qué había colocado los ficheros y la estructura que había utilizado. Para ello hago uso de la nueva versión del Firmware hace unos días.

Resumiendo, hay cinco sectores de 512 bytes cada uno de ellos, cuyo contenido parece ser el adecuado. El resultado es el siguiente:

A.- Primer sector. Dirección 0x0000. Tabla Maestra de Particiones. MPT.

(http://publi.garcia-cuervo.net/mmc_card_01_tabla_maestra_de_particiones_mpt.gif)

B.- Segundo sector. Dirección 0x8000. Sector de Arranque. MBR.

(http://publi.garcia-cuervo.net/mmc_card_02_sector_de_arranque_mbr.gif)

C.- Tercer sector. Dirección 0x45000. Tabla de Asignación FAT. ROOT.

(http://publi.garcia-cuervo.net/mmc_card_03_tabla_fat_directorio_raiz.gif)

D.- Cuarto sector. Dirección 0x49000. Sector de Datos de File 1. RRFILE1.TXT

(http://publi.garcia-cuervo.net/mmc_card_04_sector_de_datos_file1.gif)

E.- Quinto sector. Dirección 0x49200. Sector de Datos de File 2. RRFILE2.TXT

(http://publi.garcia-cuervo.net/mmc_card_05_sector_de_datos_file2.gif)

Ahora solo queda ver la relación que hay entre todos ellos y a su vez con lo documentado y creo que ya tenemos la estructura que debemos implementar.  :mrgreen:

Eso es todo por hoy, amigos. Mañana más.



Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 31 de Enero de 2007, 18:59:27
Hola Diego!!!

Que placer ver que seguis avanzando!

Respecto de lo que comentas sobre las direcciones de las extructuras, aun no lo he posteado en el foro (a veces me lleva mucho tiempo el formato del foro) pero si ya he puesto algo en mi web. Espero esta noche (si el bebe me lo permite) seguir agregando info.

Si no me equivoco, ya he publicado las formulas para encontrar el principio de la zona de datos, de la extructura de directorios,etc.

Tengo que hacerme tiempo para poder bucear un poco en el contenido de la tarjeta. Y ni hablar para empezar a escribir la libreria! :(

Saludos!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: raus en 01 de Febrero de 2007, 07:00:48
Impresionante!!!

He estado siguiendo de cerca este post, y he de decir que la guia de aitopes es genial: perfectamente explicado y muy detallado todo.

Yo tengo mi hardware al 50% listo, me queda taladrar y soldar. Espero poder hacerlo el fin de semana, pero como tengo examenes, no prometo nada. De todos modos, tengo ganas de empezar a programar ya, a ver si termino mi proyecto fin de carrera a tiempo para mediados de marzo :S

De nuevo, enhorabuena a aitopes y RedPic!!!!  :-/
Título: Re: MMC Card : Hardware & Firmware
Publicado por: LABmouse en 01 de Febrero de 2007, 10:33:47
clap, clap, clap  :-/  Aplausos por tan buen trabajo que están realizando.

RedPic, todo un Maestro enseñando todo lo que sabes a todos nosotros los vírgenes en conocimiento.

Aitopes, es de guerreros atender la casa, el trabajo y este foro, de la manera en que lo haces.

Felicidades.

Saludos!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 01 de Febrero de 2007, 10:45:12
Muchas gracias, amigo PICMouse, en la parte que me toca ...   :5}
pero la verdad es que soy un exhibicionista y me gusta hacerlo todo (o casi todo público)  :D
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 01 de Febrero de 2007, 11:30:34
Amigo PicMouse!

Citar
Aitopes, es de guerreros atender la casa, el trabajo y este foro, de la manera en que lo haces.

Si lo dices por lo del bebe, no te equivoques!  Lo atiende mi mujer, yo solo me pongo mal cuando lo veo llorar, pero la encargada de TODO lo que implica atender un retoño lo hace ella! :)
Hasta que no aparezca un buen compilador para reprogramarlo, seguira atendiendolo ella.
(No estaria mal cambiarle el firmware...se ve que vino con la hora de España, duerme de 5AM hasta el medidodia....y a la noche, se dedica a hacer fiestas, llorar, o ambas cosas..  :shock: ).
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 03 de Febrero de 2007, 10:59:58
Este es un pequeño paso para la humanidad pero inmenso para mí.  :D
(Dándole la vuelta a lo que Armstrong dijo en la Luna)

Visto que para alcanzar el Master Boot Sector (o sea saber en qué Address había que leer) había que interpretar primero la Master Partition Table ...  :mrgreen:

Pues yá está.

(http://publi.garcia-cuervo.net/mmc_fat16_01_code_bootloader_and_partition_table.gif)

Con éste código:

               for(j=0;j<0x10;j++){  // one for byte in Partition Entry
                  f = 0x1BE+j;
                  Partition_Entry[j]=MMCBuffer[f];
               }
               // Interpretation
               printf("\r\n");
               // Type
               printf("Partition Type %u\r\n",Partition_Entry[4]);
               // start_lsec is address of the partion boot sector
               start_lsec=make32(Partition_Entry[11],Partition_Entry[10],Partition_Entry[9],Partition_Entry[8]);
               printf("Start Partition in sectors %Lu (Address of MBR 0x%LX)\r\n",start_lsec,start_lsec*(sector_size+1));
               // partition_size
               partition_size=make32(Partition_Entry[15],Partition_Entry[14],Partition_Entry[13],Partition_Entry[12]);
               printf("Partition Size in sectors %Lu (Capacity in Bytes %Lu)\r\n",partition_size,partition_size*(sector_size+1));
               // Continuing for MBR
               printf("Jumping to MBR in %LX ...\r\n\n",start_lsec*(sector_size+1));          
               address = 0x8000;
               strcpy(recBuffer,"R\0");

podemos ver ....

(http://publi.garcia-cuervo.net/mmc_fat16_01_reading_partition_table_dump.gif)

Ya os daré detalles en cuando tenga un hueco para documentar esto en condiciones.  :D


Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 03 de Febrero de 2007, 16:34:57
Bueno, para que este Sábado no sea improductivo del todo ...

Vamos a interpretar el MBR ... por lo menos la entrada general y el BPB  :mrgreen:

El siguiente paso va a ser interpretar el xPBP o Información Extendida del FAT16

(http://publi.garcia-cuervo.net/mmc_fat16_02_reading_partition_table_dump.gif)

   int32 start_lsec;
   int32 partition_size;
   int16 bytes_per_sector;
   int8  sectors_per_cluster;
   int16 sectors_reserved;
   int16 root_entries;
   int16 sectors_per_volumenL;
   int16 sectors_per_fat;
   int16 sectors_per_track;
   int16 num_heads;
   int32 sectors_invisibles;
   int32 sectors_per_volumenH;

   ...

            address = 0x00;
            if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
               // Read and Presentation
               printf("\r\n\n>MMC read Master Partition Table\r\n\n");
               printf("RAW in MPT  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
               printf("            ===============================================\r\n");
               for(i=0;i<4;i++){        // One for Partition Entry
                  f = 0x1BE + (i*0x10);
                  printf("P%u at %LX  ",i+1,f);
                  for(j=0;j<0x10;j++){  // one for byte in Partition Entry
                     f = 0x1BE + (i*0x10) +j;
                     Partition_Entry[j]=MMCBuffer[f];
                     printf("%LX ",Partition_Entry[j]);
                  }
                  if(i==0) printf("*");
                  printf("\r\n");
               }
               // Reread the first partition
               for(j=0;j<0x10;j++){  // one for byte in Partition Entry
                  f = 0x1BE+j;
                  Partition_Entry[j]=MMCBuffer[f];
               }
               // Interpretation
               printf("\r\n");
               // Type
               printf("Partition Type %u\r\n",Partition_Entry[4]);
               // start_lsec is address of the partion boot sector
               start_lsec=make32(Partition_Entry[11],Partition_Entry[10],Partition_Entry[9],Partition_Entry[8]);
               printf("Start Partition in sectors %Lu (Address of MBR 0x%LX)\r\n",start_lsec,start_lsec*(sector_size+1));
               // partition_size
               partition_size=make32(Partition_Entry[15],Partition_Entry[14],Partition_Entry[13],Partition_Entry[12]);
               printf("Partition Size in sectors %Lu (Capacity in Bytes %Lu)\r\n",partition_size,partition_size*(sector_size+1));
               // Continuing for MBR
               printf("\r\nReading MBR in address %LX ...\r\n\n",start_lsec*(sector_size+1));
               address = start_lsec*(sector_size+1);
               if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
                  // Jumping Code
                  printf("Jump Code .: ");
                  iOffset=0x00;
                  for(i=0;i<3;i++){
                     printf("0x%X ",MMCBuffer[iOffSet+i]);
                  }
                  printf("\r\n");
                  // OEM ID
                  printf("OEM ID ....: ");
                  iOffset=0x03;
                  for(i=0;i<8;i++){
                     printf("%c",MMCBuffer[iOffSet+i]);
                  }
                  printf("\r\n");
                  // BPB_Entry
                  printf("\r\nMMC read BIOS Parametrer Block\r\n\n");
                  printf("RAW in BPB  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
                  printf("            ===============================================\r\n");
                  printf("            ");
                  iOffset=0x0B;
                  for(i=0;i<25;i++){
                     BPB_Entry[ i ]=MMCBuffer[iOffSet+i];
                     printf("%X ",BPB_Entry[ i ]);
                     if(i==0x0F) printf("\r\n            ");
                  }
                  printf("\r\n\n");
                  // bytes_per_sector
                  bytes_per_sector=make16(BPB_Entry[1],BPB_Entry[0]);
                  printf("Bytes per Sector ....: 0x%LX (%Lu)\r\n",bytes_per_sector,bytes_per_sector);
                  // sectors_per_cluster
                  sectors_per_cluster=(int8) BPB_Entry[2];
                  printf("Sectors per Cluster .: 0x%X   (%u)\r\n",sectors_per_cluster,sectors_per_cluster);
                  // sectors_reserved
                  sectors_reserved=make16(BPB_Entry[4],BPB_Entry[3]);
                  printf("Sectors Reserved ....: 0x%LX (%Lu)\r\n",sectors_reserved,sectors_reserved);
                  // number copys of FAT
                  printf("Copys of FAT ........: 0x%X   (%u)\r\n",BPB_Entry[05],BPB_Entry[05]);
                  // root_entries
                  root_entries=make16(BPB_Entry[7],BPB_Entry[6]);
                  printf("Root entries ........: 0x%LX (%Lu)\r\n",root_entries,root_entries);
                  // sectors_per_volumen LOW
                  sectors_per_volumenL=make16(BPB_Entry[9],BPB_Entry[8]);
                  printf("Volumen Sectors Low .: 0x%LX (%Lu)\r\n",sectors_per_volumenL,sectors_per_volumenL);
                  // Media Descriptor Byte
                  printf("Media Descriptor Byte: 0x%X   (%u)\r\n",BPB_Entry[10],BPB_Entry[10]);
                  // sectors_per_fat
                  sectors_per_fat=make16(BPB_Entry[12],BPB_Entry[11]);
                  printf("FAT Sectors .........: 0x%LX (%Lu)\r\n",sectors_per_fat,sectors_per_fat);
                  // sectors_per_track
                  sectors_per_track=make16(BPB_Entry[14],BPB_Entry[13]);
                  printf("Track Sectors .......: 0x%LX (%Lu)\r\n",sectors_per_track,sectors_per_track);
                  // sectors_per_track
                  num_heads=make16(BPB_Entry[16],BPB_Entry[15]);
                  printf("Heads ...............: 0x%LX (%Lu)\r\n",num_heads,num_heads);
                  // sectors_invisibles
                  sectors_invisibles=make32(BPB_Entry[20],BPB_Entry[19],BPB_Entry[18],BPB_Entry[17]);
                  printf("Invisible Sectors ...: 0x%LX (%Lu)\r\n",sectors_invisibles,sectors_invisibles);
                  // sectors_per_volumen Hight
                  sectors_per_volumenH=make32(BPB_Entry[24],BPB_Entry[23],BPB_Entry[22],BPB_Entry[21]);
                  printf("Volumen Sectors Hight: 0x%LX (%Lu)\r\n",sectors_per_volumenH,sectors_per_volumenH);
                  // xBPB_Entry
                  
                  
               }else{
                  printf("\n\r>Read MBR page fault");
               }

            }else{
               printf("\n\r>Read MPT page fault");
            }
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 03 de Febrero de 2007, 17:22:54
Hola Diego!

Tendriamos que chekear que lo que estas leyendo sea coherente con lo que yo he posteado, no? :)

Saludos!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 04 de Febrero de 2007, 08:42:02
La leyes de la Filosofia Natural, ó Filosofía de la Ciencia, me obligan a deducir siempre lo general de lo particular. Y para ello necesitamos de una casuística amplia y variada. Un solo ejemplar bajo el microscopio es insuficiente para proclamar una Ley Natural. Esto sería como construir la Entomología a partir de una única mariposa estudiada. Y no ese el caso.

Tu documento, Ariel, describe un Diskette, mi experimento involucra una MMC Card. Siendo iguales no son lo mismo. El uno no admite particiones, la otra sí al ser asimilada a un Disco Duro. Aquél tiene el MBR el el Sector 0, ésta lo tiene en el 64. Ambos MBR son similares y compatibles entre sí y con tu documento.

Pero para llegar a él hay que descifrar primero el MPT de particiones, y para ello tengo que hacer una suposición que después me confirma el MBR y es que los sectores son de 512 Bytes. Premisa a la que se ha de llegar por inspiración divina, como si fuese un Postulado de Euclídes.

Sin esta suposición no puedo inferir la dirección del MBR en la MMC Card. Y yo lo he hecho porque previamente sabía, a través de mi Firmware espía, en qué dirección estaba el MBR y al leer la MPT y decirme ésta que el comienzo físico de dicha partición estaba en el sector 64 solo tuve que multiplicar por 512 para poder cargar el MBR. Ya que efectivamente 64 * 512 = 32768 (Hex 8000) que es donde en efecto está mi MBR.

Y es entonces el MBR el que me dice que BPB_BytsPerSec es precisamente 512, que es como ser capaz de subirse al tren después de que éste haya partido de la estación.  :shock:

Pero hay mas ¿incongruencias o desconocimientos? ... la MPT tiene 4 entradas de las que una de ellas, la primera, tiene datos y las otras tres están a cero. Por ello yo esperaba que el campo Active tuviese un valor distinto de cero, pero es cero, por lo que debería suponer que esa única partición no es la activa, y sin embargo lo es, precisamente porque es la única. Por ello mi software no puede fiar de ese dato, sino que debe ver si los demás tienen o no contenido. O como es el caso, leer la primera partición tal cual está dándola por activa y saltando a leer el siguiente hito dándola por buena.  :shock:

Pero por lo demás tu documento es absolutamente exacto, cuando los offsets correspondientes se toman como relativos al inicio del MBR y no absolutos con respecto al origen.  :mrgreen:

Por ello te digo lo que te dije antes: Falta más información, y sospecho que es sobre el sistema de organizar las FAT en un Disco Duro, que puede albergar varias particiones, cada una de ellas con distintos formateos, ó MBR's distintos.  :P

Continuamos ...

P.D. ¿Son todas la MMC iguales? No lo sé, solo tengo una (como la mariposa) asi que no puedo hablar de las MMC Cards, sino de mi MMC Card.  :(

Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 04 de Febrero de 2007, 10:33:18
Another Brick in the Wall ...

The Wall, Pink Floyd. 1979.

Buenoooo ... con esto doy por concluída la primera fase de la fase concluyente. O sease que el BPB, la MPT y la xBPB ... Ahora imagino que el siguiente frente ha de ser el del Root Directory ... supongo.  :mrgreen:

Ademas de la info publicada por Ariel/Aitopes en su Fat al desnudo (http://www.ucontrol.com.ar/Articulos/fataldesnudo/fataldesnudo.htm) he utilizado principalmente el magnífico Tutorial de Tecnología PC (http://www.zator.com/Hardware/index.htm) de A.J.Millán de Zator Systems. Sobre todo la sección Discos : Estructura Lógica (http://www.zator.com/Hardware/H8_1_2.htm) en la que aparece ABSOLUTAMENTE TODO.

El asunto es que he logrado interpretar, y volcar a pantalla, con mi firmware en CCS C, toda la información relevante acerca de la organización lógica de la MMC Card. Ahora el reto está en acceder a las entradas FAT y a través de ellas localizar los ficheros para poder interactuar con ellos, leyéndolos y/o escribiéndolos.

La pantalla mostrativa de la lectura de los datos básicos de acceso es:

(http://publi.garcia-cuervo.net/mmc_fat16_03_reading_partition_table_dump.gif)

El código CCS C que hace esto es el siguiente:

Código: C#
  1.    int8  heads, Cylinders, Sectors;
  2.    int32 CHS_Address_start;
  3.    int32 CHS_Address_end;
  4.    int32 start_lsec;
  5.    int32 partition_size;
  6.    int16 bytes_per_sector;
  7.    int8  sectors_per_cluster;
  8.    int16 sectors_reserved;
  9.    int16 root_entries;
  10.    int16 sectors_per_volumenL;
  11.    int16 sectors_per_fat;
  12.    int16 sectors_per_track;
  13.    int16 num_heads;
  14.    int32 sectors_invisibles;
  15.    int32 sectors_per_volumenH;
  16.  
  17.          // Read Master Partition Table ///////////////////////////////////////////////////////////
  18.          if(recBuffer[0]=='P' AND recBuffer[1]=='\0'){
  19.  
  20.             address = 0x00;
  21.             if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
  22.                // Read and Presentation
  23.                printf("\r\n\nMMC read Master Partition Table\r\n");
  24.                printf("RAW in MPT  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
  25.                printf("            ===============================================\r\n");
  26.                for(i=0;i<4;i++){        // One for Partition Entry
  27.                   f = 0x1BE + (i*0x10);
  28.                   printf("P%u at %LX  ",i+1,f);
  29.                   for(j=0;j<0x10;j++){  // one for byte in Partition Entry
  30.                      f = 0x1BE + (i*0x10) +j;
  31.                      Partition_Entry[j]=MMCBuffer[f];
  32.                      printf("%LX ",Partition_Entry[j]);
  33.                   }
  34.                   if(i==0) printf("*");
  35.                   printf("\r\n");
  36.                }
  37.                // Reread the first partition
  38.                for(j=0;j<0x10;j++){  // one for byte in Partition Entry
  39.                   f = 0x1BE+j;
  40.                   Partition_Entry[j]=MMCBuffer[f];
  41.                }
  42.                // Interpretation
  43.                printf("\r\n");
  44.                // Begin CHS Partition
  45.                heads     = Partition_Entry[1];
  46.                sectors   = Partition_Entry[2] & 0x3f;
  47.                cylinders = ((Partition_Entry[2] & 0xc0) << 2) + Partition_Entry[3];              
  48.                CHS_Address_start = (cylinders*Heads*sectors) + (heads*Sectors) + (sectors - 1);
  49.                printf("Start Partition in CHS %X/%X/%X (0x%LX)\r\n",cylinders,heads,sectors,CHS_Address_start);
  50.                // End CHS Partition
  51.                heads     = Partition_Entry[5];
  52.                sectors   = Partition_Entry[6] & 0x3f;
  53.                cylinders = ((Partition_Entry[6] & 0xc0) << 2) + Partition_Entry[7];              
  54.                CHS_Address_end = (cylinders*Heads*sectors) + (heads*Sectors) + (sectors - 1);
  55.                printf("End Partition in CHS %X/%X/%X (0x%LX)\r\n",cylinders,heads,sectors,CHS_Address_end);
  56.                // Type
  57.                printf("Partition Type %u\r\n",Partition_Entry[4]);
  58.                // start_lsec is address of the partion boot sector
  59.                start_lsec=make32(Partition_Entry[11],Partition_Entry[10],Partition_Entry[9],Partition_Entry[8]);
  60.                printf("Start Partition in sectors %Lu (Address of MBR 0x%LX)\r\n",start_lsec,start_lsec*(sector_size+1));
  61.                // partition_size
  62.                partition_size=make32(Partition_Entry[15],Partition_Entry[14],Partition_Entry[13],Partition_Entry[12]);
  63.                printf("Partition Size in sectors %Lu (Capacity in Bytes %Lu)\r\n",partition_size,partition_size*(sector_size+1));
  64.                // Continuing for MBR
  65.                printf("Reading MBR in address 0x%LX ...\r\n",start_lsec*(sector_size+1));
  66.                address = start_lsec*(sector_size+1);
  67.                if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
  68.                   // Jumping Code
  69.                   printf("Jump Code .: ");
  70.                   iOffset=0x00;
  71.                   for(i=0;i<3;i++){
  72.                      printf("0x%X ",MMCBuffer[iOffSet+i]);
  73.                   }
  74.                   printf("\r\n");
  75.                   // OEM ID
  76.                   printf("OEM ID ....: ");
  77.                   iOffset=0x03;
  78.                   for(i=0;i<8;i++){
  79.                      printf("%c",MMCBuffer[iOffSet+i]);
  80.                   }
  81.                   printf("\r\n");
  82.                   // BPB_Entry
  83.                   printf("\nMMC read BIOS Parametrer Block BPB\r\n");
  84.                   printf("RAW in BPB  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
  85.                   printf("            ===============================================\r\n");
  86.                   printf("            ");
  87.                   iOffset=0x0B;
  88.                   for(i=0;i<25;i++){
  89.                      BPB_Entry[ i ]=MMCBuffer[iOffSet+i];
  90.                      printf("%X ",BPB_Entry[ i ]);
  91.                      if(i==0x0F) printf("\r\n            ");
  92.                   }
  93.                   printf("\r\n\n");
  94.                   // bytes_per_sector
  95.                   bytes_per_sector=make16(BPB_Entry[1],BPB_Entry[0]);
  96.                   printf("Bytes per Sector ....: 0x%LX (%Lu)\r\n",bytes_per_sector,bytes_per_sector);
  97.                   // sectors_per_cluster
  98.                   sectors_per_cluster=(int8) BPB_Entry[2];
  99.                   printf("Sectors per Cluster .: 0x%X   (%u)\r\n",sectors_per_cluster,sectors_per_cluster);
  100.                   // sectors_reserved
  101.                   sectors_reserved=make16(BPB_Entry[4],BPB_Entry[3]);
  102.                   printf("Sectors Reserved ....: 0x%LX (%Lu)\r\n",sectors_reserved,sectors_reserved);
  103.                   // number copys of FAT
  104.                   printf("Copys of FAT ........: 0x%X   (%u)\r\n",BPB_Entry[05],BPB_Entry[05]);
  105.                   // root_entries
  106.                   root_entries=make16(BPB_Entry[7],BPB_Entry[6]);
  107.                   printf("Root entries ........: 0x%LX (%Lu)\r\n",root_entries,root_entries);
  108.                   // sectors_per_volumen LOW
  109.                   sectors_per_volumenL=make16(BPB_Entry[9],BPB_Entry[8]);
  110.                   printf("Volumen Sectors Low .: 0x%LX (%Lu)\r\n",sectors_per_volumenL,sectors_per_volumenL);
  111.                   // Media Descriptor Byte
  112.                   printf("Media Descriptor Byte: 0x%X   (%u)\r\n",BPB_Entry[10],BPB_Entry[10]);
  113.                   // sectors_per_fat
  114.                   sectors_per_fat=make16(BPB_Entry[12],BPB_Entry[11]);
  115.                   printf("FAT Sectors .........: 0x%LX (%Lu)\r\n",sectors_per_fat,sectors_per_fat);
  116.                   // sectors_per_track
  117.                   sectors_per_track=make16(BPB_Entry[14],BPB_Entry[13]);
  118.                   printf("Track Sectors .......: 0x%LX (%Lu)\r\n",sectors_per_track,sectors_per_track);
  119.                   // sectors_per_track
  120.                   num_heads=make16(BPB_Entry[16],BPB_Entry[15]);
  121.                   printf("Heads ...............: 0x%LX (%Lu)\r\n",num_heads,num_heads);
  122.                   // sectors_invisibles
  123.                   sectors_invisibles=make32(BPB_Entry[20],BPB_Entry[19],BPB_Entry[18],BPB_Entry[17]);
  124.                   printf("Invisible Sectors ...: 0x%LX (%Lu)\r\n",sectors_invisibles,sectors_invisibles);
  125.                   // sectors_per_volumen Hight
  126.                   sectors_per_volumenH=make32(BPB_Entry[24],BPB_Entry[23],BPB_Entry[22],BPB_Entry[21]);
  127.                   printf("Volumen Sectors Hight: 0x%LX (%Lu)\r\n",sectors_per_volumenH,sectors_per_volumenH);
  128.                   // xBPB_Entry
  129.                   printf("\nMMC read BIOS Parametrer Block Extended xBPB\r\n");
  130.                   printf("RAW in xBPB 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
  131.                   printf("            ===============================================\r\n");
  132.                   printf("            ");
  133.                   iOffset=0x24;
  134.                   for(i=0;i<26;i++){
  135.                      xBPB_Entry[ i ]=MMCBuffer[iOffSet+i];
  136.                      printf("%X ",xBPB_Entry[ i ]);
  137.                      if(i==0x0F) printf("\r\n            ");
  138.                   }
  139.                   printf("\r\n\n");
  140.                   // disp number
  141.                   printf("Drive # .............: 0x%X   (%u)\r\n",xBPB_Entry[0],xBPB_Entry[0]);
  142.                   // reserverd
  143.                   printf("Reserved ............: 0x%X   (%u)\r\n",xBPB_Entry[1],xBPB_Entry[1]);
  144.                   // extended signature
  145.                   printf("Extended Signature ..: 0x%X   (%u)\r\n",xBPB_Entry[2],xBPB_Entry[2]);
  146.                   // serial number
  147.                   printf("Serial Number .......: ");
  148.                   iOffset=0x03;
  149.                   for(i=0;i<4;i++){
  150.                      if(i!=3)
  151.                         printf("%X-",xBPB_Entry[iOffSet+i]);
  152.                      else
  153.                         printf("%X",xBPB_Entry[iOffSet+i]);
  154.                   }
  155.                   printf("\r\n");
  156.                   // Vol Name
  157.                   printf("Vol. Name ...........: ");
  158.                   iOffset=0x07;
  159.                   for(i=0;i<0x0B;i++){
  160.                      printf("%c",xBPB_Entry[iOffSet+i]);
  161.                   }
  162.                   printf("\r\n");
  163.                   // Format Type
  164.                   printf("Format Type .........: ");
  165.                   iOffset=0x12;
  166.                   for(i=0;i<0x08;i++){
  167.                      printf("%c",xBPB_Entry[iOffSet+i]);
  168.                   }
  169.                   printf("\r\n");
  170.                   // Boot record signature
  171.                   printf("Boot record signature: 0x%X-0x%X\r\n",MMCBuffer[0x1FE],MMCBuffer[0x1FF]);
  172.                }else{
  173.                   printf("\n\r>Read MBR page fault");
  174.                }
  175.             }else{
  176.                printf("\n\r>Read MPT page fault");
  177.             }
  178.             Cursor();
  179.             validCommand=1;
  180.          }
  181.  

El 90% de la información que estamos tratando con este código es irrelevante para nuestras pretensiones de leer/escribir ficheros, y además la gran carga de programa y/o ROM se desperdicia con los printf ... Cuando pasemos a la fase siguiente imagino que con una docena de líneas tendremos resulto la carga de los datos importantes.  :mrgreen:

En fin, pero eso será otro día.
 
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 04 de Febrero de 2007, 10:54:27
Nota muy importante:

Todos los valores numéricos utilizados por Mocosoft para en sus FAT, menos los formatos Cylinder/Head/Sector, estan expresados en little-endian format.

Esto quiere quiere decir que el primer byte en orden ascendente de dirección en el buffer es el MENOS SIGNIFICATIVO, y el último es el MAS SIGNIFICATIVO.

Por eso lo de int16 Valor = make16(buffer[1],buffer[0]);

¡Que después me decís que no explico las cosas!  :mrgreen:


Título: Re: MMC Card : Hardware & Firmware
Publicado por: PalitroqueZ en 04 de Febrero de 2007, 11:55:57
es decir Red que si veo en un offset por ejemplo 3A4F el dato en realidad ¿es 4F3A?

Salu2
Pedro
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 04 de Febrero de 2007, 12:29:11
Hola Diego!

Sigues adelante a toda maquina! ;)

Por supuesto, a pesar de que el ejemplo que he tomado es un diskete, voy a ampliar a los demas medios de almacenamiento, ya que el diskete esta obsoleto. Pero me sirve como base sobre los que analizar los otros, ya que es de lejos el mas sensillo.

¿Llegaremos a concetar un disco duro a un pic?  :shock:
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Nocturno en 04 de Febrero de 2007, 12:37:34
¿Llegaremos a concetar un disco duro a un pic?  :shock:
Eso ya lo hizo Manex hace tiempo:
http://www.todopic.com.ar/foros/index.php?topic=2558.20
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 04 de Febrero de 2007, 12:39:26
Siempre pienso lo mismo: he llegado a este foro demasiado tarde....ja ja ja!
Voy a ver el hilo YA! :)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: PalitroqueZ en 05 de Febrero de 2007, 11:52:51
¿Llegaremos a concetar un disco duro a un pic?  :shock:
Eso ya lo hizo Manex hace tiempo:
http://www.todopic.com.ar/foros/index.php?topic=2558.20

hay un código que publicó Lagger hace tiempo, está simulado OK en proteus pero solo es acceso al disco por bloques, mas no entra en la parte del FAT

Salu2
Pedro
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Duende_Azul en 05 de Febrero de 2007, 17:58:02
Que sera de la vida de Lagger? mejor conocido como el "pana" Lagger.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: LordLafebre en 05 de Febrero de 2007, 18:21:50
Hola:

Pues que pena, pero Lager se desaparecio de la noche a la mañana, desde que nos hemos migrado a este foro, no se ha conectado nunca, es una verdadera lástima, a ver si aparece nuevamente mi maestro  :mrgreen: (http://img170.imageshack.us/img170/8154/maestroao6.gif)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: aitopes en 05 de Febrero de 2007, 18:53:18
Citar
Todos los valores numéricos utilizados por Mocosoft para en sus FAT, menos los formatos Cylinder/Head/Sector, estan expresados en little-endian format.

Esto quiere quiere decir que el primer byte en orden ascendente de dirección en el buffer es el MENOS SIGNIFICATIVO, y el último es el MAS SIGNIFICATIVO.

Por eso lo de int16 Valor = make16(buffer[1],buffer[0]);

¡Que después me decís que no explico las cosas!  Mr. Green

Si, es para tenerlo muy en cuenta. Y hay valores de 4 bytes (DWord?) que tambien estan invertidos. Es decir, si encontramos "FF AB 00 02", tenemos que "darlo vuelta" ("02 00 AB FF") y recien pasarlo a decimal....

Saludos!

PD: Arranque con el analisis de una tarjeta SD de un GB, para ver las diferencias con los disketes...ya va a haber novedades. Algo puse en mi sitio.

Título: Re: MMC Card : Hardware & Firmware
Publicado por: Sispic en 08 de Febrero de 2007, 16:12:00
No se si esto puede ayudar de MicroChip

void SDCardInit(void)

http://ww1.microchip.com/downloads/en/AppNotes/01003a.pdf
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en024394

Y es para un PIC18f USB.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Dr_PNElectronico en 26 de Febrero de 2007, 10:03:09
Señores:

Antes que nada mis saludos, y una pequeña consulta con el driver CCS mmc_spi.c, he visto que conectan el SDO de la tarjeta MMC a la PIC en forma directa (sin divisores de tension) y me fije en el drivers, y tiene a MMC_SDO y MMC_SDI como salida,
es ¿eso correcto o me equivoco?, ¿sera el mismo drivers que ustedes usan?, de antemano muchas gracias por su tiempo.

MMC_EC mmc_init(void)   {
   int16 result;
   int8 to=50;

   mmc_state = MMC_STARTUP_STATE;

   output_high(MMC_CS);
   output_high(MMC_DO);             //----> Esta que es de salida

   output_high(MMC_CLK);
//   output_low(MMC_CLK);

   output_float(MMC_DI);

   delay_ms(15);

   do {
      mmc_select();
      result=mmc_send_cmd(MMC_CMD_GO_IDLE_STATE,0,1);
      mmc_deselect();
      if (result==1)
         break;
      else {
         delay_ms(10);
         to--;
      }
   } while (to);

   if (result!=1) {
      MMC_DEBUG(" ERR: after reset, device isn't idle");
      return(MMC_EC_NOT_IDLE);
   }


   to=50;

   do {
      mmc_select();
      result = mmc_send_cmd(MMC_CMD_SEND_OP_COND,0,1);         
      mmc_deselect();
      if (result && (result!=1)) {
         MMC_DEBUG(" ERR: after init we got a funky error %LX", result);
         return(MMC_EC_NOT_INIT);
      }
      else if (result==1) {
         to--;
         delay_ms(1);
      }
      else
         break;
   } while (to);     // loop until not busy

   MMC_DEBUG(" init cmd returns: %X\n\r",result);


   mmc_select();
   result=mmc_send_cmd(MMC_CMD_CRC_ON_OFF,0,1);
   mmc_deselect();
   if (result) {
      MMC_DEBUG(" ERR: CRC didn't turn off");
      return(MMC_EC_NO_CRC);
   }

   mmc_state = MMC_STANDBY_STATE;        // set current state
   return(MMC_EC_OK);
}
Título: Re: MMC Card : Hardware & Firmware
Publicado por: raus en 06 de Marzo de 2007, 16:15:41
¿Qué tal van vuestros avances con el sistema FAT?

Se que Aitopes y RedPic están haciendo un gran trabajo. Gracias a vosotros 2 he podido comprender un poco mejor la estructura y, Dios mediante, en cosa de mes y medio estaré presentando mi proyecto fin de carrera al respecto (estación meteorologica sencilla con almacenamiento en SD card de los datos). Espero cumplir los plazos y, tan pronto lo tenga listo, colgaré la memoria del proyecto con todos los listados de programa :)

PD: solo escribía para activar esto un poco, yo sigo trabajando aunque no escriba ;-)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: raus en 12 de Marzo de 2007, 04:46:29
Bump!!!


Por casualidad alguien ha probado el código de este sitio (http://elm-chan.org/docs/mmc/mmc_e.html)?

Tiene dos sistemas (uno más completo y que ocupa más) para gestionar la FAT con un pic. Tiene buena pinta, pero he tenido problemas con mi placa principal al soldar y creo que tendre que repetirla :(
Título: Re: MMC Card : Hardware & Firmware
Publicado por: LABmouse en 12 de Marzo de 2007, 10:21:40
raus, pero yo no veo codigo?
Título: Re: MMC Card : Hardware & Firmware
Publicado por: raus en 12 de Marzo de 2007, 16:28:28
raus, pero yo no veo codigo?

Perdón, el link correcto era este (http://elm-chan.org/fsw/ff/00index_e.html) y esta (http://elm-chan.org/fsw/ff/ff004.zip) es la descarga directa del codigo. Lo siento
Título: Re: MMC Card : Hardware & Firmware
Publicado por: crispic en 20 de Mayo de 2007, 11:06:16
Hola amigos este es mi primer post, Saludos desde Colombia!!!

Encontre este link http://www.captain.at/electronics/pic-mmc/ , no estoy desarrollando una aplicacion de este tipo, pero casualmente la encontre, creo que les puede servir.

Título: Re: MMC Card : Hardware & Firmware
Publicado por: pepegotera69 en 25 de Mayo de 2007, 02:48:34
Hola Chicos.

Resulta que llevo intentando hacer funcionar tu invento redpic ni se sabe, pero no me funciona, al hacer la incialización de la tarjeta hace el cs tambien el clk pero di y do na de na, y estoy un poco desesperado ¿me podrías hechar un cable? Gracias de antemano.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 25 de Mayo de 2007, 20:50:56
Pepe, no entiendo que quieres decir con di y do na de na ...  :shock:

DI y DO son los Data Input y Data Output del SPI. Yo en mi caso no uso el módulo SPI por hardware ya que los pines los tengo en uso para otra cosa, asi que dejo al CCS que lo simule por software.

El driver MMC es exactamente el de CCS que está en el directorio drivers .. yo solo he re-definido los pines que uso, que en concreto son:

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

por lo demás poco puedo decirte ya que a mi con eso y con mi hardware me funciona.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: pepegotera69 en 26 de Mayo de 2007, 19:20:59
Gracias por contestar!

El montaje del circuito es el mismo que el tuyo, los pines tambien, la programación la realizo con un icd2, y lo unico que te comentaba era que conectando un osciloscopio digital, al darle a la opcion de inicializar mmc sacaba señal por la patilla del reloj(clk) por la de habilitación (cs) también, pero por DI y DO no se envía nada de nada ni se recibe, te lo comentaba por si te podía dar alguna pista.

Muchas truncias otra vez.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: mikepic en 09 de Junio de 2007, 12:26:47
Hola a todos,

Estoy pensando en una aplicación en la que sería genial introducir el almacenamiento de datos en una memoria MMC, pero me gustaría antes hacer algunas simulaciones.
Alguien ha probado a simular en PROTEUS?
Yo me estoy basando en el montaje de Redpic con la salvedad que utilizo el 18F2520 en lugar del 18F2550, ya que no tiene modelo en ISIS, pero no me funciona.
He visto esquemas hechos en PROTEUS, pero ningún fichero de simulación. Ah, por cierto, programo con CCS.

Saludos y gracias de antemano
Título: Multiplicación en 32 bits
Publicado por: dopoulo en 03 de Julio de 2007, 13:53:23
Hola compañeros!
No se como llevareis el tema y si seguis con él. Yo he realizado un proyecto con una tarjeta MMC y he tenido que empaparme todo lo relacionado con FAT16, la comunicación con la MMC, el MBR, etc...
Por lo que veo vais a pasar al manejo de los archivos de la partición FAT ¿no?. Yo tengo todo eso desarrollado.
Podeis echar un vistazo a lo que he hecho:

http://www.todopic.com.ar/foros/index.php?topic=17912.msg122174#msg122174

Si puedo echar una mano, aquí estoy.
Un saludo
Título: Multiplicación en 32 bits
Publicado por: RedPic en 03 de Julio de 2007, 14:20:48
Dopoulo:

El hardware que monté sobre la placa taladrada dejó de funcionar hace tiempo y no se porqué, pero tengo la PCB nueva hecha y voy a soldarle los componentes para retomar este asunto. Ya te consultaré sobre algunos temas del FAT16,  :)

Título: Re: MMC Card : Hardware & Firmware
Publicado por: facundo_10 en 21 de Abril de 2008, 22:22:52
Hola redpic, pensaba y ya te mande varios mp, si tu podrias pasarme el circuito que usaste para probar la MMC-SD CARD.

Desde ya muchas gracias!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: LordLafebre en 22 de Abril de 2008, 02:33:19
Hola:

Facundo, tómate un poco de tiempo y revisa todos los posts.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 22 de Abril de 2008, 10:21:42
Si, en este mismo hilo, en el cuarto o quinto post tienes el circuito que he utilizado.

http://www.todopic.com.ar/foros/index.php?topic=15553.msg99543#msg99543
Título: Re: MMC Card : Hardware & Firmware
Publicado por: facundo_10 en 22 de Abril de 2008, 15:46:05
Gracias por la rapida respuesta, me referia a que si tenias el archivo de eagle para poder pasarmelo. A eso me refiero!
Título: Re: MMC Card : Hardware & Firmware
Publicado por: PalitroqueZ en 23 de Abril de 2008, 13:37:13
Hola a todos,

Estoy pensando en una aplicación en la que sería genial introducir el almacenamiento de datos en una memoria MMC, pero me gustaría antes hacer algunas simulaciones.
Alguien ha probado a simular en PROTEUS?
...

si que funciona.

Título: Re: MMC Card : Hardware & Firmware
Publicado por: Javicho en 03 de Mayo de 2008, 13:12:07
Saludos:

Tendré a disposición una laptop que viene con un conector especial para memorias SD, saben si hay algún software que me permita leer la SD? me refiero a datos internos como el ID, número de serie, etc?

Javicho.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: ema en 03 de Mayo de 2008, 14:46:39
"Winhex"

Saludos
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Javicho en 03 de Mayo de 2008, 18:24:05
Gracias, lo probaré.

Javicho.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: facundo_10 en 13 de Mayo de 2008, 17:02:52
Hola me refiero a que si todavia guardas el PCB que usaste en tu ordenador, y si lo podrias poner a disposicion del foro, para que podamos hacer nuestras pruebas. Un saludo! :)
Título: Re: MMC Card : Hardware & Firmware
Publicado por: pajaro en 11 de Septiembre de 2008, 20:57:07
raus, pero yo no veo codigo?

Perdón, el link correcto era este (http://elm-chan.org/fsw/ff/00index_e.html) y esta (http://elm-chan.org/fsw/ff/ff004.zip) es la descarga directa del codigo. Lo siento

hola amigo

puedes redirecionar los link creo que estan rotos o
o no funcionan correctamente aparece una web pero creo que no se corresponde por lo menos en unos de los casos

un saludo

pd: el hilo esta genial

Título: Re: MMC Card : Hardware & Firmware
Publicado por: RICHI777 en 24 de Septiembre de 2008, 12:33:44
Hola gente, haber si alguien me puede dar una manito, estaria necesitando un programita que permita formatear tarjetas MMC/SD de diferentes tamaños pero con la salvedad que yo pueda elegir el sistema de archivos ( FAT12,FAT16,FAT32 ) y los sectores x cluster algo asi como hacia el viejo DOS. Desde ya muchas gracias !

Saludos !
Título: Re: MMC Card : Hardware & Firmware
Publicado por: pajaro en 24 de Septiembre de 2008, 15:54:13
hola amigo richi
se de una tool de hp
hp usb disk storage format se parece mucho a la util del win95 o win98

un saludo.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RICHI777 en 24 de Septiembre de 2008, 16:02:58
Gracias amigo  :mrgreen:
Título: Re: MMC Card : Hardware & Firmware
Publicado por: teleko en 16 de Octubre de 2008, 06:51:04
Estoy probando esta configuración en proteus pero no me funciona, da error en el init_mmc. Estoy harto de darle vueltas y no lo consigo hacer funcionar.
Palitroquez dice que sí, asi que te pido si puedes subir tu diseño aquí.


Gracias de antemano.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: nutriax en 23 de Diciembre de 2008, 19:33:48
Hola que tal, yo he seguido por mucho tiempo a este hilo, pero nunca tenia tiempo de ponerme a renegar con estas tarjetitas...  :(
ahora que me hice un tiempito pude tocar este tema que tanto me intrigaba...
de hecho pude hacer la inicializacion, lectura y escritura de la tarjeta, pero todo esto con el spi por hard... pero la aplicacion que quiero hacer, tambien quiero que use el usb, y como todos saben las patitas del usb se superponen con la del spi por hardware (estoy hablando del 18f4550), por lo que en mi aplicacion no me molestaria realizarl la comunicacion spi por soft (como hizo el gran maestro diego).
para lo cual he intenetado implementar el soft de diego y probarlo, pero no me dio resultado, paso a destacar las diferencias que tienen (aunque son pocas porque trate de mantenerlo para ver si andaba)
1- yo uso el 18f4550 con un xtal de 20mhz, los fuses para el clock lo puse para tener el cloc de 48mhz y anda un relojito porque lo probe con parpadeo de unos led y anda (dicho sea de paso la placa que uso es la que tiene diego en la pagina de el (rrboard2 16f877/18f4550).
2- la comunicacion serie la realizo por el usart del pic (es decir por hardware rs232 del pic).
3- le cambie como hizo diego los pines del bus spi. en mi caso tengo a do->b2; ck->b1; di->b3; cs-b5;

pongo las modificaciones realizadas en el nutriax_mmc_spi.c
/////*** USER CONFIG ***/////

//SanDisk’s MultiMediaCards clock data in on the rising edge and out on the falling edge.
#ifndef MMC_CLK
#define MMC_CLK   PIN_B1
#endif
#ifndef MMC_DI
#define MMC_DI    PIN_B4
#endif
#ifndef MMC_DO
#define MMC_DO    PIN_B2
#endif
#ifndef MMC_CS
#define MMC_CS    PIN_B5
#endif

ahora pongo el programa que uso...

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

#include <18f4550.h>
//#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,NOVREGEN,NOPBADEN,NOPUT,NOBROWNOUT,NOCPD,NOWRT
// el fuse que configuramos anteriormente
#use delay(clock=48000000)

#define LED        PIN_e0
#define BUZZER     PIN_e1
#define RELE       PIN_e2

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

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

int8  MMCBuffer[512];
int32 address=0;


#define MMC_CS    PIN_B5
#define MMC_CLK   PIN_B1
#define MMC_DI    PIN_B4
#define MMC_DO    PIN_B2

#include "pulpo_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("[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);
}


////////////////////////////////////////////////////////////////////////////////////
//
// 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);

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

         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.
      }
     
      ///////////////////////////////////////////////////////AGREGO NUTRIAX
      ////////////////////////////////////////////////////////////////////
      Cursor(Command);
            if(mmc_init()==0)
               printf("MMC init ok");
            else
               printf("MMC init fault");
            Cursor(0x00);         
   } while (TRUE);
}

como veran este es el codigo que tiene diego en la pagina, pero con una leve modificacion (como por ejemplo le saque el conector rj45 y todas sus funciones)...
el problema es que no me inicializa, me imprime init fault...
alguien me puede ayudar o podria decirme como hizo para que le ande el spi por soft? gracias...
Título: Re: MMC Card : Hardware & Firmware
Publicado por: nutriax en 23 de Diciembre de 2008, 19:51:21
Hola que tal, yo he seguido por mucho tiempo a este hilo, pero nunca tenia tiempo de ponerme a renegar con estas tarjetitas...  :(
ahora que me hice un tiempito pude tocar este tema que tanto me intrigaba...
de hecho pude hacer la inicializacion, lectura y escritura de la tarjeta, pero todo esto con el spi por hard... pero la aplicacion que quiero hacer, tambien quiero que use el usb, y como todos saben las patitas del usb se superponen con la del spi por hardware (estoy hablando del 18f4550), por lo que en mi aplicacion no me molestaria realizarl la comunicacion spi por soft (como hizo el gran maestro diego).
para lo cual he intenetado implementar el soft de diego y probarlo, pero no me dio resultado, paso a destacar las diferencias que tienen (aunque son pocas porque trate de mantenerlo para ver si andaba)
1- yo uso el 18f4550 con un xtal de 20mhz, los fuses para el clock lo puse para tener el cloc de 48mhz y anda un relojito porque lo probe con parpadeo de unos led y anda (dicho sea de paso la placa que uso es la que tiene diego en la pagina de el (rrboard2 16f877/18f4550).
2- la comunicacion serie la realizo por el usart del pic (es decir por hardware rs232 del pic).
3- le cambie como hizo diego los pines del bus spi. en mi caso tengo a do->b2; ck->b1; di->b3; cs-b5;

pongo las modificaciones realizadas en el nutriax_mmc_spi.c
/////*** USER CONFIG ***/////

//SanDisk’s MultiMediaCards clock data in on the rising edge and out on the falling edge.
#ifndef MMC_CLK
#define MMC_CLK   PIN_B1
#endif
#ifndef MMC_DI
#define MMC_DI    PIN_B4
#endif
#ifndef MMC_DO
#define MMC_DO    PIN_B2
#endif
#ifndef MMC_CS
#define MMC_CS    PIN_B5
#endif

ahora pongo el programa que uso...

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

#include <18f4550.h>
//#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,NOVREGEN,NOPBADEN,NOPUT,NOBROWNOUT,NOCPD,NOWRT
// el fuse que configuramos anteriormente
#use delay(clock=48000000)

#define LED        PIN_e0
#define BUZZER     PIN_e1
#define RELE       PIN_e2

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

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

int8  MMCBuffer[512];
int32 address=0;


#define MMC_CS    PIN_B5
#define MMC_CLK   PIN_B1
#define MMC_DI    PIN_B4
#define MMC_DO    PIN_B2

#include "pulpo_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("[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);
}


////////////////////////////////////////////////////////////////////////////////////
//
// 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);

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

         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.
      }
     
      ///////////////////////////////////////////////////////AGREGO NUTRIAX
      ////////////////////////////////////////////////////////////////////
      Cursor(Command);
            if(mmc_init()==0)
               printf("MMC init ok");
            else
               printf("MMC init fault");
            Cursor(0x00);         
   } while (TRUE);
}

como veran este es el codigo que tiene diego en la pagina, pero con una leve modificacion (como por ejemplo le saque el conector rj45 y todas sus funciones)...
el problema es que no me inicializa, me imprime init fault...
alguien me puede ayudar o podria decirme como hizo para que le ande el spi por soft? gracias...
Título: Re: MMC Card : Hardware & Firmware
Publicado por: PalitroqueZ en 24 de Enero de 2009, 12:56:38
Hola,

Según el manual de la MMC, para la inicialización se requiere un reloj SPI máximo 400Khz, por encima de ese valor no hay garantias.

En mi caso, que trabajo con un circuito similar al tuyo, lo que hice fué bajar la velocidad del micro -en caliente- de tal forma que al ajustar la configuración del reloj spi, estuviese por debajo de los 400KHz, posteriormente a una correcta inicialización, volví a subir Fosc del pic para seguir trabajando a la máxima Frecuencia

Título: Re: MMC Card : Hardware & Firmware
Publicado por: pajaro en 14 de Febrero de 2009, 18:19:14
hola amigo Redpic
Al principio de  este hilo en el post 16, pusiste unas fotos, quisiera hacerte una pregunta,
¿que compilador de c usas tu para la programacion de los Upro y ucontroladores, usas algun entorno o ide?

esa pantalla azul se parece al del borland.

Un saludo.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 14 de Febrero de 2009, 18:32:14
Si, pájaro, yo utilizo normalmente el Borland Delphi 6, empecé con el Delphi y aún antes con sus Pascales y C's para DOS, pero es que ademas a cualquier IDE con el que trabajo le pongo los mismos colores, así al del CCS lo configuro también para que parezca igual que el de Borland.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: jonathanPIC888 en 18 de Febrero de 2009, 17:34:15
Una pregunta Redpic, vos en tu página has puesto en la parte de USB que estás trabajando en el protocolo MSDC. Quería saber si habías tenido algún avance al respecto. Por lo pronto he podido manejar los otros protocolos que posteate HID, CDC y bulk transfer.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: RedPic en 18 de Febrero de 2009, 17:58:31
No, jonathanPIC888, no he vuelto a tocar el tema del USB. El mass storage está durmiendo el sueño de los justos ... y lamentablemente no se cuando podré acometerlo.
Título: Re: MMC Card : Hardware & Firmware
Publicado por: fabito en 12 de Enero de 2010, 22:37:56
Buenas Maestro RedPic, quisiera consultarte acerca de este proyecto que lo implementas con un 18f4550; el tema es que yo lo quiero implementar con un 16f877a y al compilarlo con el CCS me da un error de "data item too big" en la linea de declaración del buffer de 512 bytes en el driver del MMC.

Esto podría ser debido a que el 16f877a no tiene suficiente RAM como para almacenar este buffer?
En caso que sea afirmativo, me convendría utilizar el SPI por Hardware utilizando las funciones spi_write(),spi_read(),setup_spi() de la librería de CCS?

Muchas gracias desde ya Maestro RedPic..
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Chenao en 12 de Enero de 2010, 23:19:53
Saludos

Creo sólo con estos microd se puede crear un arreglo de 128 bytes es decir, el bufer máximo seria de Buffer[128]="xxxxxxxxx..... ......".

En el momento también estoy implementando el manejo de una memoria sd/mmc con el 16f877 si quieres hecharle una miraita como va y cuales han sido los problemas hasta ahora te recomiendo que mires el hilo de compañero Suky llamado Iniciando con la memoria sd/mmc que esta en el sub-foro de proyectos. No pongo el hipervinculo porque no como ponerlo :mrgreen:.

Saludos

 
Título: Re: MMC Card : Hardware & Firmware
Publicado por: Power_DSP en 27 de Junio de 2010, 23:31:54
Saludos,

La inicializacion y el reseteo de la trajeta MMC esta bien pero la rutina de lectura no se que pasa q no me funciona, la rutina de lectura es la siguiente:

unsigned char readBlock(unsigned long addr, unsigned char *p){
   //LBA sector
   //pointer to buffer
   unsigned char r = 0;
   unsigned char temp;
   int i;

   CMD17_READ_SINGLE_BLOCK[1] = ((addr & 0xFF000000) >> 24);
   CMD17_READ_SINGLE_BLOCK[2] = ((addr & 0x00FF0000) >> 16);
   CMD17_READ_SINGLE_BLOCK[3] = ((addr & 0x0000FF00) >> 8);
   CMD17_READ_SINGLE_BLOCK[4] = ((addr & 0x000000FF));
   
   
   // 1. send read command
   r = sendSDCmd(CMD17_READ_SINGLE_BLOCK);
   
   //check if command was accepted
   if (r == 1){
      // abort invalid response
      PORTCbits.RC2 = 1;
      return 1; //r
   }
   
   // 2. wait a response
   for(i=0;i < 100; i++){
      r = readSPI();
      if (r == MMC_STARTBLOCK_READ)
         break;
   }
   
   PORTCbits.RC1 = 1;
   
   // 3. read 512 block
   if(i != 100){
      for(i = 0; i < 512; i++){
         temp = readSPI();
         *p = temp;
         p++;
      }
   }   
      
   // 4. ignore 16-bit CRC
   readSPI();
   readSPI();
   // data arrived
      
   // command accepted
   
   // 5. remember disable card
   SD_Disable();
   return 0;
}
// end readBlock

Título: Re: MMC Card : Hardware & Firmware
Publicado por: mikepic en 27 de Octubre de 2010, 06:04:43
Hola,

Según el manual de la MMC, para la inicialización se requiere un reloj SPI máximo 400Khz, por encima de ese valor no hay garantias.

En mi caso, que trabajo con un circuito similar al tuyo, lo que hice fué bajar la velocidad del micro -en caliente- de tal forma que al ajustar la configuración del reloj spi, estuviese por debajo de los 400KHz, posteriormente a una correcta inicialización, volví a subir Fosc del pic para seguir trabajando a la máxima Frecuencia



Hola Palitroquez,

Lo hiciste con CCS? Podrias postear, almenos el código correspondiente a estos cambios de velocidad?

Gracias