;===========================================================================================================================
;========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
	
