Aqui tienes:
Codigo:
;SUBRRUTINA "SPI":
;Envia el byte que viene en el registro "w" mediaante el protocolo spi.
;Utiliza los registro temporales "temp1" y "temp2"
spi movwf temp1 ;Salva el byte a transmitir en el registro temporal "temp1"
movlw 0x08
movwf temp2 ;Inicializa el contador
bck_spi bsf p_spi,sdin ;Sube data
btfss temp1,7 ;Comprueba el bit y lo baja si es cero
bcf p_spi,sdin
nop ;Envia el bit
bsf p_spi,sclk
nop ;Da un pulso de reloj
bcf p_spi,sclk
nop
rlf temp1,f ;Rotamos a la izquierda "temp1"
decfsz temp2,f ;Comprobamos el contador, para ver si hemos enviado los 8 bits
goto bck_spi ;Si no, repetimos el bucle
bcf p_spi,sdin
return ;Fin
Debes definir para usar esta rutina, el puerto que vayas a utilizar como "p_spi" y los bits dentro del puerto, tanto de datos como de reloj, como "sdin" y "sclk". También se utilizan dos resitros temporales "temp1" y "temp2" que debes definir. Aqui va un ejemplo:
Codigo:
;Definición de bits
sdin equ 0x00 ;Bits de control del bus spi: Datos bit 0
sclk equ 0x01 ;Reloj bit 1
;Puertos del PIC
porta equ 0x05
p_spi equ 0x05 ;Puerto A es el puerto utilizado para el spi
portb equ 0x06
;Declaración de variables
temp1 equ 0x20
temp2 equ 0x21
La rutina anterior es la que envia. Aqui tienes la que recibe:
Codigo:
;SUBRRUTINA "SPI_RX":
;Recibe un byte por el bus SPI y devuelve el resultado en el registro "w"
;Utiliza los registro temporales "temp1" y "temp2" y el bit de carry del registro "status"
spi_rx movlw 0x08
movwf temp2 ;Inicializa el contador
bck_spi btfss p_spi,sclk
goto bck_spi
bsf status,0
btfss p_spi,sdin ;Copia el valor de data en el carry
bcf status,0
rlf temp1,f ;Para guardarlo en el temporal
bck_sp2 btfsc p_spi,sclk
goto bck_sp2
decfsz temp2,f ;Comprobamos el contador, para ver si hemos recibido los 8 bits
goto bck_spi ;Si no, repetimos el bucle
movf temp1,w
return ;Fin
Ten en cuenta que esta rutina espera por 8 pulsos de reloj, por lo que si la utilizas y no se reciben los 8 pulsos se quedará el PIC esperando indefinidamente