hace mas de 1 año trabajé con el vdip1 en modo spi y luego de renegar mas de 1 mes los de ftdi me dijeron que con el firmware cdc no trabajaba en modo spi. pero probé con otros firmwares y mis rutinas andaban bien. Ya no las uso (ahora trabajo con la uart) por lo que se las paso. (pueden optimizarlas un poco sacando algunos nop)(mi ciclo de reloj es de 0,16666666 us). Antes les quiero decir que el vdip1 trabaja con 3,3v. Tiene una entrada de 5v pero enseguida pasa por un regulador de 3,3v. A estos 3,3 v los pueden utilizar ustedes para alimentar un micro, pero teniendo en cuenta de no cargar demasiado pues el regulador es pequeño.
De todas formas, el VNC1L es tolerante a los 5v (se puede hacer trabajar derecho con un micro de 5v)
Acá van las rutinas
;--------------------------------------------------------------------------------------------------------
;rutina para escribir un BYTE de datos desde el micro SPI virtual al módulo VDIP1 SPI slave. El byte a TX viene en "W_VDIP1"
;para TX (escribir en el VDIP1) un dato se debe transmitir 1ero 100 y luego el dato. Se debe leer el ultimo bit de lo recibido (STATUS)
R_TX_DATO_VDIP1 BCF VDIP1_STAT,0
BSF VDIP1_CS ;habilita VDIP1
BSF SDO
BSF SCK ;WRITE "1"
BCF SCK
BCF SDO
BSF SCK ;WRITE "0"
BCF SCK
BSF SCK ;WRITE "0"
BCF SCK
BCF SDO
BTFSC W_VDIP1,7
BSF SDO
BSF SCK ;WRITE "bit7"
BCF SCK
BCF SDO
BTFSC W_VDIP1,6
BSF SDO
BSF SCK ;WRITE "bit6"
BCF SCK
BCF SDO
BTFSC W_VDIP1,5
BSF SDO
BSF SCK ;WRITE "bit5"
BCF SCK
BCF SDO
BTFSC W_VDIP1,4
BSF SDO
BSF SCK ;WRITE "bit4"
BCF SCK
BCF SDO
BTFSC W_VDIP1,3
BSF SDO
BSF SCK ;WRITE "bit3"
BCF SCK
BCF SDO
BTFSC W_VDIP1,2
BSF SDO
BSF SCK ;WRITE "bit2"
BCF SCK
BCF SDO
BTFSC W_VDIP1,1
BSF SDO
BSF SCK ;WRITE "bit1"
BCF SCK
BCF SDO
BTFSC W_VDIP1,0
BSF SDO
BSF SCK ;WRITE "bit0"
BCF SCK
BCF SDO ;pone un "0"
BSF SCK
BTFSC SDI ;lee bit de STATUS
BSF VDIP1_STAT,0
BCF SCK
BCF VDIP1_CS ;deshabilita VDIP1
RETURN
;--------------------------------------------------------------------------------------------------------
;rutina para leer un BYTE de datos desde el módulo VDIP1 (el byte leido retornará en "R_VDIP1"). (El bit de estado retornará en VDIP1_STAT,0)
;para RX (leer desde el VDIP1) un dato se debe transmitir 1ero 110 0000 0000 0 Y LEER EL DATO
R_RX_DATO_VDIP1 CLRF R_VDIP1 ;
BCF VDIP1_STAT,0 ;limpia variables
BSF VDIP1_CS ;habilita VDIP1
NOP
NOP
BSF SDO
NOP
NOP
RCALL R_SPI_CLK_PULSO ;WRITE "1"
NOP
RCALL R_SPI_CLK_PULSO ;WRITE "1"
NOP
BCF SDO
NOP
RCALL R_SPI_CLK_PULSO ;WRITE "0"
BTFSC SDI ;leo el 1er bit
BSF R_VDIP1,7
RCALL R_SPI_CLK_PULSO
BTFSC SDI
BSF R_VDIP1,6
RCALL R_SPI_CLK_PULSO
BTFSC SDI
BSF R_VDIP1,5
RCALL R_SPI_CLK_PULSO
BTFSC SDI
BSF R_VDIP1,4
RCALL R_SPI_CLK_PULSO
BTFSC SDI
BSF R_VDIP1,3
RCALL R_SPI_CLK_PULSO
BTFSC SDI
BSF R_VDIP1,2
RCALL R_SPI_CLK_PULSO
BTFSC SDI
BSF R_VDIP1,1
RCALL R_SPI_CLK_PULSO
BTFSC SDI
BSF R_VDIP1,0
RCALL R_SPI_CLK_PULSO
BTFSC SDI ;lee bit de STATUS
BSF VDIP1_STAT,0
NOP
NOP
BCF VDIP1_CS ;deshabilita VDIP1
NOP
RETURN
;
R_SPI_CLK_PULSO BCF SCK
NOP
NOP
BSF SCK
NOP
NOP
BCF SCK
NOP
RETURN
;-------------------------------------------------------------------------------------------------
;rutina para leer buffer de RX del módulo VDIP1 y guardarlos en ram posiciones desde H'400'
;cont3 es la cantidad de bytes que se quiere leer
R_RBUF_VDIP1 MOVLW d'20'
MOVWF CONT3 ;número de posiciones a leer
LFSR FSR1,h'0400' ;posicion de USB_1
R_RBUF_VDIP1_S1 RCALL R_RX_DATO_VDIP1
BTFSS VDIP1_STAT,0 ;DATA NEW or OLD?
RETURN ;OLD
MOVFF R_VDIP1,INDF1 ;NEW
DCFSNZ CONT3,1
RETURN
INCF FSR1L,1
BRA R_RBUF_VDIP1_S1
;--------------------------------------------------------------------------------------------------------
;rutina para escribir el buffer del VDIP1 con un comando que estará depositado en memoria RAM (por ahora)
;tanto CONT3 (cant bytes a escribir) como FSR1 vienen cargados según el comando que se desee transmitir
R_WBUF_VDIP1 MOVF INDF1,W
MOVWF W_VDIP1
R_WBUF_VDIP1_S1 RCALL R_TX_DATO_VDIP1
BTFSC VDIP1_STAT,0 ;se aceptó el dato?
BRA R_WBUF_VDIP1_S1 ;NO.
DCFSNZ CONT3,1 ;SI.
RETURN
INCF FSR1L,1
BRA R_WBUF_VDIP1
;--------------------------------------------------------------------------------------------------------