; --------------------------------------------------------------------------------------------- ; COMUNICACAO SIMPLES ENTRE DOIS PIC18F4620 USANDO A INTERFACE SPI ; ; PROGRAMA PARA O DISPOSITIVO SLAVE ; ; Este programa recebe bytes ao dispositivo Master e os mostra nos LEDs conectados ao PORTB. ; ; O hardware para o circuito teste pode ser visto no arquivo "schematic.png" no diretorio ; deste projeto. ; ; --------------------------------------------------------------------------------------------- LIST P=18F4620 #include ; --------------------------------------------------------------------------------------------- ; CONFIGURATION BITS ; --------------------------------------------------------------------------------------------- CONFIG WDT = OFF CONFIG MCLRE = ON CONFIG debug = OFF CONFIG LVP = OFF CONFIG OSC = HS ; oscilador a cristal externo 20MHZ ; --------------------------------------------------------------------------------------------- ; REGISTRADORES E SIMBOLOS ; --------------------------------------------------------------------------------------------- UDATA 0x80 ; RAM do sistema #define SPI_TRIS TRISC ; I/O do PORTC #define SPI_PORT PORTC ; PORTC contem os bits SCK, SDI e SDO #define SPI_SCK 3 ; bit SCK -- CLock no Slave sera entrada #define SPI_SDI 4 ; bit SDI -- Entrada serial #define SPI_SDO 5 ; bit SDO -- Saida serial ; --------------------------------------------------------------------------------------------- ; Vetores de interrupcao ; --------------------------------------------------------------------------------------------- rstvec CODE 0x0000 goto inicio inth CODE 0x0008 retfie ; --------------------------------------------------------------------------------------------- ; Inicio ; --------------------------------------------------------------------------------------------- MAIN CODE inicio clrf PORTB ; PORTB=0 clrf TRISB ; I/O do PORTB --> tudo saida movlw 0x00 ; W=0 movwf SPI_PORT ; SPI_PORT=0 movlw b'11011111' ; mascara de I/O SCK=entrada, SDI=entrada e SDO=saida movwf SPI_TRIS ; configura I/O clrf SSPSTAT ; SMP sempre zero e amostragem Idle-->Act (CKE) movlw 0x35 ; habilita SPI, IDLE state high e modo slave sem SS movwf SSPCON1 ; configura SPI como slave bcf PIR1,SSPIF ; limpa o flag loop1 btfss PIR1,SSPIF ; chegou um byte do MASTER? goto loop1 ; NAO --> espera chegar um byte loop2 btfss SSPSTAT,BF ; o buffer esta completo? goto loop2 ; NAO --> espera completar movf SSPBUF,w ; SIM --> le o byte recem chegado zerando o bit SSPSTAT movwf PORTB ; mostra nos LEDs bcf PIR1,SSPIF ; limpa o flag goto loop1 ; vai receber o proximo... END