vamos a ver, voy a sacar las partes fundamentales.Decir que en distintas placas he probado con diversos pines y siempre me ha funcionado (ojo con los colectores abiertos).
ojo tambien con el pin de salida de la mmc, no dejarlo libre de conexión ya que si no inicia, ese pin se queda inestable y con las señales del ambiente recibe 0 y 1 y te indica que los cmd estan bien cuando simplemente son interferencias que coinciden. estaría bien poner 47k o algo asi a positivo.(ahora no recuerdo cuanto le puse)
Faltarán definir quizas algunas variables que ya las ireis viendo.
Jeje ahi queda eso, admito críticas constructivas. Esparando sea de utilidad y si hay alguna duda, intentaré resolverla.
Ah, yo lo he probado con 16F876 y con un 18f258 . si mal no recuerdo funcionó hasta con 4 Mhz. Yo usaré 12 por que creo que es la primra frecuencia para trasmitir a 19200 por serie.
Ahhhhhhhhhhh se me olvidaba, por fin he conseguido poner un bootloader en marcha............. Si es que cuando me pongo ......................
DEFINE OSC 10
DEFINE HSER_BAUD 9600
ADCON1 = 7 ' puerto A adigital
'SPBRG=71 '9600 baudios con cristal de 110592
'TXSTA.2=1 '9600 baudios con cristal de 110592
TRISA=%010000
TRISB=%11001111
TRISC=%10110000
'TRISB.4 = 0
addr_H VAR WORD
addr_L VAR WORD
dat VAR BYTE ' variable para gosubs de recoger dato MMC
'Conexiones MMC
SS VAR PORTA.0 ' pin select (pin 1)
SI VAR PORTA.1 ' Dato hacia MMC (pin 2)
SCK VAR PORTA.2 ' Clock hacia MMC (pin 5)
SO VAR PORTA.4 ' Datos desde la MMC (pin 7)
sck=0
si=1
' ************************ INICIO DE LECTURA MMC ****************
cabecera:
si=1
ss=1
For i=1 TO 100
sck=1:sck=0
Next i
Pause 50
'******************************** CMD0 **************************
inicio_cmds:
'HSerout ["inicio cmd0",13,10]
intento=0
ss=0
dat=$40
GoSub mandar_dat' manda la variable dat
dat=0
GoSub mandar_dat' manda la variable dat
dat=0
GoSub mandar_dat' manda la variable dat
dat=0
GoSub mandar_dat' manda la variable dat
dat=0
GoSub mandar_dat' manda la variable dat
dat=$95
GoSub mandar_dat' manda la variable dat
While dat<>1
GoSub recibir_dat' recibir dat desde la MMC
Wend
GoSub recibir_dat' resto de clock
ss=1
HSerout ["cmd0 ok",13,10]
'******************* CMD1 **************************
'ss=1
'mamdar 2x $FF
'ss=0
'mandar cmd41
'mandar 4x $00
'mandar 2x $FF
'si no contesta 0 volver a mandar cmd
dat=255
While dat<>0
dat=$FF
ss=1
GoSub mandar_dat
GoSub recibir_dat
ss=0
dat=$41
GoSub mandar_dat' manda la variable dat
dat=0
GoSub mandar_dat' manda la variable dat
dat=0
GoSub mandar_dat' manda la variable dat
dat=0
GoSub mandar_dat' manda la variable dat
dat=0
GoSub mandar_dat' manda la variable dat
dat=$ff
GoSub mandar_dat' manda la variable dat
GoSub mandar_dat' manda la variable dat
GoSub recibir_dat' recibir dat desde la MMC
ss=1
Wend
HSerout ["cmd1 ok",13,10]
LCDOut $FE,1
LCDOut $FE,2," cmd1 ok"
Pause 50
'******************* CMD 16 **************************
cMD16:
addr_H = $0000
addr_L = $0200
ss=1
dat=$FF
GoSub mandar_dat
GoSub recibir_dat
ss=0
dat=$50
GoSub mandar_dat' manda la variable dat
dat=addr_H.BYTE1
GoSub mandar_dat' manda la variable dat
dat=addr_H.BYTE0
GoSub mandar_dat' manda la variable dat
dat=addr_l.BYTE1
GoSub mandar_dat' manda la variable dat
dat=addr_l.BYTE0
GoSub mandar_dat' manda la variable dat
dat=$ff
GoSub mandar_dat' manda la variable dat
GoSub mandar_dat' manda la variable dat
GoSub recibir_dat' recibir dat desde la MMC
While dat<>0
GoSub recibir_dat' recibir dat desde la MMC
Wend
HSerout ["cmd16 ok",13,10]
LCDOut $FE,1
LCDOut $FE,2," cmd16 ok"
'*************************** subrrutinas ***********************************
'En estas subrrutinas, entre flancos puse retardos tanto al subir como bajar, pero funciana igual sin ellos.
mandar_dat:
si=dat.bit7:sck=1:sck=0
si=dat.bit6:sck=1:sck=0
si=dat.bit5:sck=1:sck=0
si=dat.bit4:sck=1:sck=0
si=dat.bit3:sck=1:sck=0
si=dat.bit2:sck=1:sck=0
si=dat.bit1:sck=1:sck=0
si=dat.bit0:sck=1:sck=0
Return
recibir_dat:
sck=1:dat.bit7=so:sck=0
sck=1:dat.bit6=so:sck=0
sck=1:dat.bit5=so:sck=0
sck=1:dat.bit4=so:sck=0
sck=1:dat.bit3=so:sck=0
sck=1:dat.bit2=so:sck=0
sck=1:dat.bit1=so:sck=0
sck=1:dat.bit0=so:sck=0
Return
el estatus segun la memoria devuelve distinto valor (con las que poseo), con las mmc de 32 lo hace bien, sin embargo con la de 128 no devuelve el mismo nº pero cuando el intento pasa de 222 siguo leyendo y va bien, quizas con menos intentos tambien (esta por probar).
****************************** MS STATUS ************************************
mstatus:
ss = 1
dat = $ff
GoSub mandar_dat
GoSub recibir_dat
intento=0
ss = 0
dat=$4d
GoSub mandar_dat
dat=0
GoSub mandar_dat
dat=0
GoSub mandar_dat
dat=0
GoSub mandar_dat
dat=0
GoSub mandar_dat
dat=$FF
GoSub mandar_dat
While dat=$FF AND intento<222
GoSub recibir_dat
intento=intento+1
Wend
ss=1