;===============================DESCRIPCION===============================================
; Escribe datos en una memoria SD, usando el protocolo de comunicación SPI
; Programador: Sergio
;=========================================================================================
;======================================INICIALIZACION=====================================
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
PROCESSOR 16F876 ;Indica el PIC a usar
INCLUDE "P16F876.INC" ;Incluye la libreria que trae el MPLAB
RADIX hex ;Define sistema de numeración por defecto
ORG 0 ;Define el comienzo del programa
goto Inicio
;----------------------------Definicion de variables internas-----------------------------
CBLOCK 0x20
cont1
ENDC
#DEFINE RB0 0
#DEFINE RB1 1
#DEFINE RB2 2
;-----------------------------------------------------------------------------------------
;====================================PROGRAMA PRINCIPAL===================================
Inicio
movlw b'00110010' ;palabra de configuracion para reg
movwf SSPCON
bsf STATUS,RP0 ;selecciona banco1
movlw b'10000000' ;palabra de configuracion para reg SSPSTAT
movwf SSPSTAT
clrf TRISB ;pone el puerto B como salida
movlw b'00111000'
movwf TRISA ;pone el puerto A como entrada
movlw b'00010000'
movwf TRISC
bcf STATUS,RP0 ;selecciona banco0
IniciaSD
loopCMD0
btfsc PORTA,4 ;espera que se active el pulsador para enviar otro comando
goto loopCMD0
bsf PORTA,0 ;activa RA0 indicando que se esta escribiendo
call Retardo_1s ;espera, para que se pueda ver el led
call CMD0 ;envia el comnado 0 a la SD para setearla en modo idle
bcf PORTA,0 ;RA0=0 (termino escritura)
movwf PORTB ;muestra la respuesta en el puerto B
loopCMD1
btfsc PORTA,4 ;espera que se active el pulsador para enviar otro comando
goto loopCMD1
bsf PORTA,0 ;activa RA0 indicando que se esta escribiendo
call Retardo_1s ;espera, para que se pueda ver el led
call CMD1 ;envia el comnado 0 a la SD para setearla en modo idle
bcf PORTA,0 ;RA0=0 (termino escritura)
movwf PORTB ;muestra la respuesta en el puerto B
loopCMD55
btfsc PORTA,4 ;espera que se active el pulsador para enviar otro comando
goto loopCMD55
bsf PORTA,0 ;activa RA0 indicando que se esta escribiendo
call Retardo_1s ;espera, para que se pueda ver el led
call CMD55 ;envia el comnado 0 a la SD para setearla en modo idle
bcf PORTA,0 ;RA0=0 (termino escritura)
movwf PORTB ;muestra la respuesta en el puerto B
loopCMD58
btfsc PORTA,4 ;espera que se active el pulsador para enviar otro comando
goto loopCMD58
bsf PORTA,0 ;activa RA0 indicando que se esta escribiendo
call Retardo_1s ;espera, para que se pueda ver el led
call CMD58 ;envia el comnado 0 a la SD para setearla en modo idle
bcf PORTA,0 ;RA0=0 (termino escritura)
movwf PORTB ;muestra la respuesta en el puerto B
loopCMD24
btfsc PORTA,4 ;espera que se active el pulsador para enviar otro comando
goto loopCMD24
bsf PORTA,0 ;activa RA0 indicando que se esta escribiendo
call Retardo_1s ;espera, para que se pueda ver el led
clrf Byte2
clrf Byte3
clrf Byte4
clrf CRC
call CMD24 ;envia el comnado 0 a la SD para setearla en modo idle
bcf PORTA,0 ;RA0=0 (termino escritura)
movwf PORTB ;muestra la respuesta en el puerto B
loopDATOS
btfsc PORTA,4 ;espera que se active el pulsador para enviar los datos
goto loopDATOS
bsf PORTA,2 ;activa RA2 indicando que se esta escribiendo datos
call Retardo_1s ;espera, para que se pueda ver el led
movlw 0xFF
movwf cont1
movlw 0xFE ;inicio del bloque de datos
call SD_dato
loop
decfsz cont1
goto envia
movlw 0xFF
movwf cont1
loop2
decfsz cont1
goto envia2
goto fin
envia
movlw 0xF0
call SD_dato
goto loop
envia2
movlw 0xF1
call SD_dato
goto loop2
fin
movlw 0xFF ;envia los dos bytes de CRC que como esta en modo
call SD_dato ;SPI puede tomar cualquier valor
call SD_dato
bcf PORTA,2 ;RA2=0 (termino escritura)
bcf PORTA,1 ;RA2=1 fin del programa
INCLUDE "SD.INC"
INCLUDE "RETARDOS.INC"
END
aqui les paso tambien la libreria que hice yo mismo "SD.INC"
;***********************************Libreria "SD.INC"**********************************
;include los comandos para operar una tarjeta SD en modo SPI con sus respuestas
;
;********************************ZONA DE DATOS Y VARIABLES********************************
CBLOCK
Byte2
Byte3
Byte4
Byte5
R1
R12
R13
R21
R22
R31
R32
R33
CRC
ENDC
;******************************COMIENZO DE LOS SUB-PROGRAMAS******************************
CMD0 ;por respuesta se obtiene R1
movlw b'01000000'
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x95
call SD_dato
call SD_respuesta
movwf R1
return
CMD1 ;por respuesta se obtiene R1
movlw b'01000001'
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0xFF
call SD_dato
call SD_respuesta
movwf R1
return
CMD9 ;por respuesta se obtiene R1
movlw b'01001001'
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
movwf SSPBUF
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0xFF
call SD_dato
call SD_respuesta
movwf R1
return
CMD10 ;por respuesta se obtiene R1
movlw b'01001010'
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
movwf SSPBUF
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0xFF
call SD_dato
call SD_respuesta
movwf R1
return
CMD13 ;por respuesta se obtiene R2
movlw b'01001101'
call SD_dato
movlw 0x00
movwf SSPBUF
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0xFF
call SD_dato
call SD_respuesta
movwf R21
call SD_respuesta
movwf R22
return
CMD16 ;por respuesta se obtiene R1
movlw b'01010000'
call SD_dato
movfw Byte2
call SD_dato
movfw Byte3
call SD_dato
movfw Byte4
call SD_dato
movfw Byte5
call SD_dato
movfw CRC
call SD_dato
call SD_respuesta
movwf R1
return
CMD17 ;por respuesta se obtiene R1
movlw b'01010001'
call SD_dato
movfw Byte2
call SD_dato
movfw Byte3
call SD_dato
movfw Byte4
call SD_dato
movfw Byte5
call SD_dato
movfw CRC
call SD_dato
call SD_respuesta
movwf R1
return
CMD24 ;por respuesta se obtiene 3 R1 (R1, R12, R13)
movlw b'01011000'
call SD_dato
movfw Byte2
call SD_dato
movfw Byte3
call SD_dato
movfw Byte4
call SD_dato
movfw Byte5
call SD_dato
movfw CRC
call SD_dato
call SD_respuesta
movwf R1
call SD_respuesta
movwf R12
call SD_respuesta
movwf R13
return
CMD55 ;por respuesta se obtiene R1
movlw b'01110111'
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0xFF
call SD_dato
call SD_respuesta
movwf R1
return
CMD58 ;por respuesta se obtiene R3
movlw b'01111010'
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0x00
call SD_dato
movlw 0xFF
call SD_dato
call SD_respuesta
movwf R31
call SD_respuesta
movwf R32
call SD_respuesta
movwf R33
return
SD_respuesta
movlw 0x00 ;w=0
SD_dato
movwf SSPBUF ;w->SSPBUF y comienza la lectura/escritura
bsf STATUS,RP0 ;selecciona el banco1
loop_SD_dato
btfss SSPSTAT,BF ;¿buffer lleno? ¿termino lectura/escritura?
goto loop_SD_dato ;no, pregunta de nuevo
bcf STATUS,RP0 ;selecciona banco0
movf SSPBUF,W ;SSPBUF->w borrando automaticamente SSPSTAT,BF
return