TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: virolay en 17 de Abril de 2007, 16:39:54
-
Hola a todos
Tengo dos simples rutinillas de SPI. El master envía una M, el Esclavo la recibe y le envía una "S" Y EL MASTER RECIBE BASURA. Os pongo lo básico para no cansaros. Por faver, echarle un vistazo, llevo tres días y cada vez me lío más (creo que ya estoy viejo para esto).
Gracias y saludos.
Master:
DEVICE 16F877
DECLARE XTAL 4
all_digital on
portb_pullups on
SYMBOL SSPIF = PIR1.3 ' interrupt flag - last bit set
SYMBOL BF = SSPSTAT.0 ' Buffer Full Status flag
DIM MasterOUT AS byte ' Byte a enviar al ESCLAVO
DIM SlaveIN AS byte ' Byte recibida desde el ESCLAVO
dim dummy as byte
' DEFINIR el /SS (Slave Select)
symbol SS0 = portC.0
' Configuración Puertos SPI
trisc = %10010000
portc.0=1
' Configuración módulo SPI
sspstat = $40
sspcon = $31
'=== PRINCIPAL =================================================================
WHILE 1
MasterOUT = "M"
GOSUB SPI_TRANS
DELAYuS 10
WEND
'--- SUBRUTINA DE TRANSACCION --------------------------------------------------
' Envía una "M" y debería recibir una "S" PERO RECIBE CUALQUIER COSA
SPI_TRANS:
low SS0 ' Activa el Selector de Esclavo
SSPIF = 0 ' Borra la interrupción SSPIF
' Envía el Byte AL esclavo
SSPBUF = MasterOUT ' => ENVIA BYTE
While SSPIF=0:Wend ' Espera a que la trnasmisión termine
DELAYUS 10 ' Retardo mínimo de 10uS
' Recibe el Byte DESDE el esclavo
while bf=0: wend ' BF: (Buffer de recepción lleno) Sólo lectura
SlaveIN = SSPBUF ' <= RECIBE BYTE
high SS0
RETURN
'-------------------------------------------------------------------------------
END
Esclavo:
device 16f873
xtal 4
all_digital = true
portb_pullups = true
' CONFIGURAR VARIABLES
DIM MasterIN AS byte ' Byte recibido desde el MASTER
DIM SlaveOUT AS byte ' Byte a enviar al MASTER
DIM dummy as byte
SYMBOL BF = SSPSTAT.0 ' Buffer Full Status flag
'SYMBOL RBIF = INTCON.0 ' RB Port Interrupt Flag (Ojo, será necesaria)
SYMBOL SSPIF = PIR1.3 ' Synchronous Serial Port (SSP) Interrupt Flag
SYMBOL SSPIE = PIE1.3 ' Synchronous Serial Port Interrupt Enable
SYMBOL PEIE = INTCON.6 ' Peripheral Interrupt Enable
SYMBOL GIE = INTCON.7 ' Global Interrupt Enable
' CONFIGURACION SPI ESCLAVO
trisa = %00100000 ' Bit 5 es el /SS, deberá configurarse como entrada
trisc = %11011111 'Bit 3:SCK, Bit 4:SDI, Bit 5:SDO
sspcon = $34
sspstat = $40
on_interrupt goto SPI_ISR
goto SPI_INIT
'--- RUTINA SPI_ISR ------------------------------------------------------------
SPI_ISR:
sspie = 0 ' Se deshabilita la interrupción del módulo SSP
' Recibe el Byte DESDE el Master
while bf=0: wend ' BF: (Buffer de recepción lleno) Sólo lectura
MasterIN = SSPBUF ' <= RECIBE BYTE
'
delayus 10
' Envía el Byte AL Master
SSPIF = 0 ' Borra la interrupción SSPIF
SSPBUF = SlaveOUT ' => ENVIA BYTE
While SSPIF=0:Wend ' Espera a que la trnasmisión termine
DELAYUS 10 ' Retardo mínimo de 10uS
sspie = 1 ' Se habilita la interrupción del módulo SSP
context restore
'--- RUTINA DE INICIALIZACION DEL ESCLAVO --------------------------------------
SPI_INIT:
SSPIF = 0 ' Flag de interrupción del módulo SSP
SSPIE = 1 ' Habilitación a la interrupción del SSP
PEIE = 1 ' Habilitación de interrupciones periféricas
GIE = 1 ' Habilitación global de interrupciones
'=== PRINCIPAL =================================================================
MAIN:
SlaveOUT = "S"
delayus 500
goto main
End
-
:shock: Hummm, pues vaya éxito que he tenido.
Bueno, pues lo he resuelto yo solito, con "truco", pero funciona. En cuanto lo tenga más presentable lo pondré por si acaso le interesa a alguien.
Saludos,
-
jeje, no es que no interese, es que puede que no se haya utilizado el modulo como me pasa a mi, o simplemente que en este sub-foro hay varias versiones de basic
y cuesta trabajo leer el codigo de otra version. Pero tu ejemplo es muy interesante, es un buen inicio para no empezar desde cero... :mrgreen: