Escrito originalmente por lolos123
Hola como va eso.
Tengo una duda al trabajar con el SPI en modo maestro con un 16f876.Estoy trabajando en ensamblador.
Creo que tengo todo configurado, salidas, frecuencia reloj, flanco,etc..
Quiero sacar varios Bytes, uno después de otro por la salida SD0, ¿como se cuando ha terminado de enviar un Byte para escribirle el siguiente en el SSPBUF?
debo saberlo además porque tengo que activar otras salidas.
¿Puedo calcularlo según la frecuencia de reloj seleccionada en el SSPCON, poniendo un numero determinado de NOP para esperara que termine y escribir el siguiente Byte?
Bueno no se si ha quedado claro pero en fin, agradezco cualquier comentario.
Gracias por vuestro tiempo.
Todo depende de lo que quieras hacer.
Si tu pretendes "leer" algo del dispositivo SPI, entonces debes hacer como te dijo nuestro amigo kuauhtemok. El SSPIF indica cuando el master terminó de recibir los 8 bits de respuesta del dispositivo esclavo. Por supuesto todo esto tiene sentido si tu envias y recibes.
Hay casos en que solo quieres enviar y no te interesa recibir, incluso no conectas dicha pata del PIC. En estos casos puedes chequear si el buffer de transmisión sigue lleno, para eso te paso un código para los PIC16F.
Codigo:
movlw 0xAA ;sacara el dato 0xAA por el SPI
movwf SSPBUF
bsf STATUS,RP0
btfss SSPSTAT,BF ;registro esta en RamBank1
goto $-1
bcf STATUS,RP0
movlw 0xBB ;sacara el dato 0xBB por el SPI
movwf SSPBUF
bsf STATUS,RP0
btfss SSPSTAT,BF ;registro esta en RamBank1
goto $-1
Con esto enviarás datos sin que haya error de sobreescritura pero sin verificar lo que ingresa por el SSPBUF porque no tienes conectada la recepción.
Saludos
Escrito originalmente por lolos123
Muchas gracias por responder.
Efectivamente sólo quiero enviar Bytes, no voy a recibir nada.
maunix ¿que es eso de goto $-1?
Voy a probar ese código a ver que pasa.
El goto $-n o $+n hace un goto n líneas mas arriba o n lineas mas abajo.
Hacer goto $-1 es algo muy comodo cuando quieres chequear un bit flag solo en un momento y no llamaras a dicha rutina desde otro lado.
Por ejemplo
Codigo:
RUTINA:
btfss PIR1,RCIF
goto RUTINA
es equivalente a
Codigo:
btfss PIR1,RCIF
goto $-1
ves? me ahorre escribir el label RUTINA. Es muy util cuando tenes muchos btfss o sentencias similares de bucle y no queres que tengan un nombre de LABEL para no confundir tu software.
Si por ejemplo tuviera
Codigo:
clrwdt
btfss PIR1,RCIF
goto $-2
El código iria a la instruccion clrwdt (clear watch dog timer) con lo cual podría estar esperando mucho tiempo la interrupción pero el pic no se resetearía por tiemout del watchdog si es que lo tengo habilitado.
En fin, es solo un ejemplo espero lo hayas entendido, sino vuelveme a preguntar.