Vous êtes sur la page 1sur 3

;

===================================================================================
========================================
;========RUTINA DE ENVIO DE COMANDO DE MEMORIA MicroSD
==============================================================================
;
===================================================================================
========================================

COMANDO_SD movwf SSPBUF ;mueve el contenido de W a SSPBUF


para ser enviado
bcf SSPIF ;SSPIF=0 para trasferir el contenido de
SSPBUF a SSPSR
LOOP_SD2 btfss SSPIF ;ESPERA QUE SE TRASFIERA TODO EL
CONTENIDO DEL BUFFER
goto LOOP_SD2
return

;
===================================================================================
========================================
;========RUTINAS DE ESPERA DE RESPUESTA DE MEMORIA MicroSD
==================================================================================
;
===================================================================================
========================================

RESPUESTA_00 clrf contador


manda bcf RP0 ;conmuta al banco 0
bcf RP1
movlw 0xFF
call COMANDO_SD
incf contador
movlw .2 ;espera 2 bytes para leer la respuesta
xorwf contador,w
btfss ZERO
goto manda
bsf RP0 ;conmuta al banco 1
bcf RP1
btfss BUFFER_FULL
goto manda
bcf BUFFER_FULL ;borra la bandera de buffer lleno para
una proxima recepcion
bcf RP0 ;conmuta al banco 0
bcf RP1
movfw SSPBUF ;muevo el contenido del Buffer al
registro W
movwf DATO_SPI
movwf DatoRS232 ;carga el dato que lleg de la tarjeta al
registro DatoRS232
movlw 0x00 ;para mandarla por el puerto serie a la
PC
xorwf DATO_SPI,w
btfss ZERO
return
call EnviaRS232 ;si la respuesta es cero la manda a la
pc,... sino retorna
return
;
===================================================================================
========================================
;========ESCRITURA DE MEMORIA MicroSD
===================================================================================
========
;
===================================================================================
========================================

WRITE_SD clrf contador


no24 movlw 0xFF ;carga W=0xFF
call COMANDO_SD
incf contador
movlw .2 ;estabilizacion del clock
xorwf contador,w
btfss ZERO
goto no24

CMD24 movlw 0x58


call COMANDO_SD
movlw 0x00
call COMANDO_SD
movlw 0x00
call COMANDO_SD
movlw b'00000010' ;SE INDICA UN BLOQUE DE 512 BYTES
call COMANDO_SD ;B'00000010' B'00000000'
movlw b'00000000'
call COMANDO_SD
movlw 0xFF
call COMANDO_SD ;termina de enviar los 6 bytes del
comando 0

call RESPUESTA_00 ;espera Respuesta R1


bsf LED_ERROR
movlw b'00000000' ;el 0x00 significa OK!!!
xorwf DATO_SPI,w
btfss ZERO
goto WRITE_SD
bcf LED_ERROR

espera0xFE2 clrf contador


mandaff2 movlw 0xFF
call COMANDO_SD
incf contador
movlw .2 ;manda 0xFF,0xFF
xorwf contador,w
btfss ZERO
goto mandaff2

movlw 0xFE ;manda Start byte


call COMANDO_SD

;----------- BUCLE QUE MANDA LOS 512 CARACTERES A ALMACENAR -----------------

bsf LED_WmSD ;enciande led que indica escritura


clrf contador1
clrf contador
lazo512 movlw 'M' ;ESTA RUTINA MANDA 512 'M'...
call COMANDO_SD
incf contador
movlw .64
xorwf contador,w
btfss ZERO
goto lazo512
clrf contador
incf contador1
movlw .8
xorwf contador1,w
btfss ZERO
goto lazo512
bcf LED_WmSD ;apaga led que indica escritura
;-----------------------------------------------------------------------------

CRC1 movlw 0xFF ;manda CRC1 ----> 0xFF


call COMANDO_SD
movfw SSPBUF
movwf DATO_SPI
movwf DatoRS232
call EnviaRS232

CRC2 movlw 0xFF ;manda CRC1 ----> 0xFF


call COMANDO_SD
movfw SSPBUF
movwf DATO_SPI
movwf DatoRS232
call EnviaRS232

OK05 movlw 0xFF


call COMANDO_SD
movfw SSPBUF
movwf DATO_SPI

movlw 0x0F ;filtra el nible alto del byte de llegada


de la respuesta
andwf DATO_SPI,1
movlw b'00000101' ;pregunta si es el 0x05
xorwf DATO_SPI,w
btfss ZERO
goto OK05 ;si no es vuelve a mandar 0xFF
movfw DATO_SPI ;si es el 0x05 lo envia por el puerto
seria a la pc
movwf DatoRS232
call EnviaRS232
return