;------------------------------------------------------------------------------- ; FILE: SPI ; AUTH: Ed's Projects ; DATE: 24/08/2016 ; DESC: Dealing with the SPI register in master mode. ;------------------------------------------------------------------------------- LIST P=16F690, R=DEC ; All numbers Decimal format unless otherwise stated. include ; Define configurations, registers, etc. __config _FCMEN_OFF & _IESO_OFF & _BOREN_ON & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _HS_OSC ;------------------------------------------------------------------------------- ;----------------------------- Port Definitions ------------------------------ ;------------------------------------------------------------------------------- ; PortA - Output - RA0 - Pin 19 - Chip Select 1 ; PortA - Output - RA1 - Pin 18 - Chip Select 2 ; PortB - Input - RX - Pin 12 - Asynchronous Receive ; PortB - Output - TX - Pin 10 - Asynchronous Transmit ; PortB - Output - SDO - Pin 9 - SPI Data Out ; PortB - Output - SCK - Pin 11 - SPI Clock Out ; PortB - Input - SDI - Pin 13 - SPI Data In ;------------------------------------------------------------------------------- ;-------------------------------- Variables ---------------------------------- ;------------------------------------------------------------------------------- cblock h'20' temp temp2 temp3 temp4 AdrL ; Address Low AdrH ; Address High TXDATA ; Data to transmit RXDATA ; Data to Receive Command endc ;------------------------------------------------------------------------------- ;----------------------------- Define Symbols -------------------------------- ;------------------------------------------------------------------------------- #define CS1 PORTA, 0 #define CS2 PORTA, 1 ;------------------------------------------------------------------------------- ;------------------------------- Program Code -------------------------------- ;------------------------------------------------------------------------------- ORG 0 ;------------------------------------------------------------------------------- ;-------------------------- Initialisation of Ports -------------------------- ;------------------------------------------------------------------------------- Init bsf STATUS,RP0 bcf STATUS,RP1 ; Bank 1 Selected movlw b'00000000' movwf TRISA movlw b'10110000' movwf TRISB movlw b'00000000' movwf TRISC bcf STATUS,RP0 bsf STATUS,RP1 ; Bank 2 Selected clrf VRCON ; Set Vref to off clrf CM1CON0 ; Turn off comparator 1 clrf CM2CON0 ; Turn off comparator 2 clrf ANSEL ; Set analogue inputs to digital clrf ANSELH ; Set analogue inputs to digital bsf STATUS,RP0 ; Bank 3 Selected clrf SRCON ; Disable SR latch bcf STATUS,RP0 bcf STATUS,RP1 ; Bank 0 Selected clrf PORTA clrf PORTB clrf PORTC ;------------------------------------------------------------------------------- ;--------------------- Asynchronous Serial Initialisation -------------------- ;------------------------------------------------------------------------------- bsf STATUS, RP0 ; Bank 1 selected bsf BAUDCTL, BRG16 bsf TXSTA, BRGH ; Set high baud rate movlw d'1' movwf SPBRGH movlw d'3' ; 19200 baud rate at 20MHz movwf SPBRG bcf TXSTA, SYNC ; Set to asynchronous mode bsf TXSTA, TXEN ; Enable Transmit bcf STATUS, RP0 ; Bank 0 Selected bsf RCSTA, SPEN ; Enable Serial Port bsf RCSTA, CREN ; Turns on receive movf RCREG, w movf RCREG, w movf RCREG, w ;------------------------------------------------------------------------------- ;----------------------------- SPI Initialisation ---------------------------- ;------------------------------------------------------------------------------- movlw b'00100000' ; Serial port enable, 5MHz movwf SSPCON ; Clock polarity idle low bsf STATUS, RP0 ; Bank 1 selected bsf SSPSTAT, CKE bcf STATUS, RP0 ; Bank 0 selected; bsf CS1 ; Deselect chip 1 bsf CS2 ; Deselect chip 2 ;------------------------------------------------------------------------------- ;-------------------------------- Initialisaton ------------------------------ ;------------------------------------------------------------------------------- movlw d'8' call delay1 ; Wait 2 second goto Start ;------------------------------------------------------------------------------- ;------------------------------ Transmit Check ------------------------------- ;------------------------------------------------------------------------------- Transmit bsf STATUS, RP0 ; Bank 1 btfss TXSTA, TRMT goto $-1 bcf STATUS, RP0 ; Bank 0 movwf TXREG return ;------------------------------------------------------------------------------- ;-------------------------------- Delay Loops -------------------------------- ;------------------------------------------------------------------------------- delay1 movwf temp4 loopy2 movlw d'250' movwf temp3 loopy movlw d'250' movwf temp initloop goto $+1 ;400ns goto $+1 ;400ns goto $+1 ;400ns goto $+1 ;400ns goto $+1 ;400ns goto $+1 ;400ns goto $+1 ;400ns goto $+1 ;400ns nop ;200ns decfsz temp, f ;200ns goto initloop ;400ns decfsz temp3, f goto loopy ;250ms total decfsz temp4, f goto loopy2 ;Multiples of 250ms return ;------------------------------------------------------------------------------- ;-------------------------------- Main Program ------------------------------- ;------------------------------------------------------------------------------- Start clrf AdrH ; Dummy address movlw d'200' movwf AdrL ; Dummy address bcf CS2 ; Enable write mode on FRAM chip movlw b'00000110' movwf Command ; Write Command Latch call Single ; Has to be used before every write to bsf CS2 ; the FRAM chip movlw b'00000011' movwf Command ; Read Command bcf CS2 call SPI bsf CS2 call Transmit ; Transmit received data to LCD btfss PIR1, RCIF ; Check if serial received goto $-1 movf RCREG, w addlw d'48' movwf TXDATA movlw b'00000010' movwf Command ; Write Command bcf CS1 ; Select chip 1 call SPI bsf CS1 ; Deselect chip 1 bcf CS2 ; Select chip 2 call SPI bsf CS2 ; Deselect chip 2 movlw b'00000011' movwf Command ; Read Command bcf CS1 call SPI bsf CS1 movf RXDATA, w call Transmit ; Transmit received data to LCD goto Start SPI movf SSPBUF, w ; Clear buffer full flag movf Command, w movwf SSPBUF ; Send command bsf STATUS, RP0 ; Bank 1 selected btfss SSPSTAT, BF goto $-1 ; Check if sent bcf STATUS, RP0 ; Bank 0 selected movf SSPBUF, w ; Clear buffer full flag movf AdrH, w movwf SSPBUF ; Send address high bsf STATUS, RP0 ; Bank 1 selected btfss SSPSTAT, BF goto $-1 ; Check if sent bcf STATUS, RP0 ; Bank 0 selected movf SSPBUF, w ; Clear buffer full flag movf AdrL, w movwf SSPBUF ; Send address low bsf STATUS, RP0 ; Bank 1 selected btfss SSPSTAT, BF goto $-1 ; Check if sent bcf STATUS, RP0 ; Bank 0 selected movf SSPBUF, w ; Clear buffer full flag movf TXDATA, w movwf SSPBUF ; Send data bsf STATUS, RP0 ; Bank 1 selected btfss SSPSTAT, BF goto $-1 ; Check if sent bcf STATUS, RP0 ; Bank 0 selected movf SSPBUF, w movwf RXDATA ; Move received to variable return Single movf SSPBUF, w ; Clear buffer full flag movf Command, w movwf SSPBUF ; Send data bsf STATUS, RP0 ; Bank 1 selected btfss SSPSTAT, BF goto $-1 ; Check if sent bcf STATUS, RP0 ; Bank 0 selected movf SSPBUF, w movwf RXDATA ; Move received to variable return end