SPI_BYTE EQU 0x30 ;Dejar lugar para los siguientes o definirlo, todos seguidos
CONTADOR_BIT EQU 0x29 ;Presupongo ademas que los contadores/temp estan en el banco 0 o ACCESS y no BANKED. Por ende no modifico BSR
CONTADOR_BYTE EQU 0x28
TEMP EQU 0x27 ;Registro temporal usado para rotar el byte. Que lo podes usar en cualquier otra cosa tambien, a no ser que tengas un RTOS.
Lectura
BCF CS1
MOVLW 0x03 ;Inicio mi contador ( contador = bytes - 1 )
MOVWF CONTADOR_BYTE
LFSR 0,SPI_BYTE ;Inicio el puntero
Aux1
MOVLW 0x08 ;Inicio mi contador de bits ( contador = bits )
MOVWF CONTADOR_BITS
CLRF TEMP ;Pongo a 0 el registro auxiliar
Cargarbyte ;Empiezo a cargar el byte
BCF CLK
NOP
BSF CLK
RLNCF TEMP,F ;Roto el registro sin carry , roto aca de paso me queda un NOP menos y mas simple el programa (si lo roto cuando tiene 0x00 no importa )
BTFSC MISO
BSF TEMP,0
DECFSZ CONTADOR_BITS,F
BRA Cargarbyte ;BRA ocupa un lugar de la memoria de instrucciones vs 2 de GOTO, pero lo limita a un rango de -1024<x<1023
MOVFF TEMP,POSTINC0 ;Termino de cargar el byte, TEMP -> [SPI_BYTE + Offset] y FSR0 = FSR0 + 1
DECFSZ CONTADOR_BYTE,F
BRA Aux1 ;Tengo mas bytes por rellenar
BSF CS1 ;Finalizo y pongo a 1 CS1
RETURN