This is by no means complete code, but a starting point would be something like shown below...
The SERIN/SEROUT are defined by you application.
Code:
getData:
'[SRAM BANK 0]
'BANK SELECT
SRAM1_CS = 0 'SRAM CHIP #1 ENABLED
SRAM2_CS = 1 'SRAM CHIP #2 DISABLED
'BANK WRITE ADDRESS
spi_data = WRITE_INSTR
WriteSPI
tx_spi_data = addr.HIGHBYTE
WriteSPI
tx_spi_data = addr.LOWHBYTE
WriteSPI
'GET SERIN INTO FIRST BANK
For i = 0 to DATA_LENGTH
SERIN tx_spi_data
WriteSPI
Next i
'[SRAM BANK 1]
'BANK SELECT
SRAM1_CS = 1 'SRAM CHIP #2 DISABLED
SRAM2_CS = 0 'SRAM CHIP #1 ENABLED
'BANK WRITE ADDRESS
tx_spi_data = WRITE_INST
WriteSPI
tx_spi_data = addr.HIGHBYTE
WriteSPI
tx_spi_data = addr.LOWHBYTE
WriteSPI
'GET SERIN INTO SECOND BANK
For i = 0 to DATA_LENGTH
SERIN tx_spi_data
WriteSPI
Next i
sendData:
'[SRAM BANK 0]
'BANK SELECT
SRAM1_CS = 0 'SRAM CHIP #1 ENABLED
SRAM2_CS = 1 'SRAM CHIP #2 DISABLED
'BANK WRITE ADDRESS
spi_data = WRITE_INSTR
WriteSPI
tx_spi_data = addr.HIGHBYTE
WriteSPI
tx_spi_data = addr.LOWHBYTE
WriteSPI
'SEND SEROUT FROM FIRST BANK
For i = 0 to DATA_LENGTH
ReadSPI
SEROUT rx_spi_data
Next i
'[SRAM BANK 1]
'BANK SELECT
SRAM1_CS = 1 'SRAM CHIP #2 DISABLED
SRAM2_CS = 0 'SRAM CHIP #1 ENABLED
'BANK WRITE ADDRESS
spi_data = WRITE_INSTR
WriteSPI
tx_spi_data = addr.HIGHBYTE
WriteSPI
tx_spi_data = addr.LOWHBYTE
WriteSPI
'SEND SEROUT FROM SECOND BANK
For i = 0 to DATA_LENGTH
ReadSPI
SEROUT rx_spi_data
Next i
Necessary defines (copied from PRSTEIN's code - http://www.picbasic.co.uk/forum/showthread.php?t=12766):
Code:
' Definations for the SPI communication protocal
'------------------------------------------------------------------
SRAM1_CS VAR PORTC.0 ' SPI SRAM CHIP #1 CS PIN
SRAM1_CS_TRIS VAR TRISC.0 ' SPI SRAM CHIP #1 CS PIN DIRECTION
SRAM2_CS VAR PORTC.1 ' SPI SRAM CHIP #2 CS PIN
SRAM2_CS_TRIS VAR TRISC.1 ' SPI SRAM CHIP #2 CS PIN DIRECTION
SCK VAR PORTC.3 ' SPI CLOCK
SCK_TRIS VAR TRISC.3 ' SPI CLOCK PIN DIRECTION CONTROL
SDI VAR PORTC.4 ' SPI DATA IN
SDI_TRIS VAR TRISC.4 ' SPI DATA IN PIN DIRECTION
SDO VAR PORTC.5 ' SPI DATA OUT PIN
SDO_TRIS VAR TRISC.5 ' SPI DATA OUT PIN
WCOL VAR SSPCON.7 'SSP WRITE COLLISION
SSPEN VAR SSPCON.5 'SSP ENABLE
SSPIF VAR PIR1.3 'SSP INTERRUPT FLAG
'---------------------------------------------------------------------
'-------------SPI PORT REGISTERS SETUP----------------------------------------
SSPSTAT = %01000000 ' SAMPLE AT THE MIDDLE OF DATA OUTPUT TIME, TRANSMIT ON IDLE RISING EDGE OF SCK
SSPCON = %00100000 ' SPI MASTER MODE, CLOCK=Fosc/4 ENABLE HARDWARE SPI PORT
SSPEN = 1 ' ENABLE HARDWARE SPI PORT
'-------------------------------------------------------------------------------
'-------------INITIALIZATION--------------------------------------------------
SRAM1_CS = 1 'SRAM CHIP #1 DISABLED
SRAM2_CS = 1 'SRAM CHIP #2 DISABLED
SRAM1_CS_TRIS = 0 'OUTPUT
SRAM2_CS_TRIS = 0 'OUTPUT
SDO = 1 'START SPI PIN WITH HIGH
SDO_TRIS = 0 'OUTPUT
SDI_TRIS = 1 'INPUT
'-------------VARIABLES---------------------------------------------------------
i VAR WORD
addr VAR WORD
tx_spi_data VAR BYTE
rx_spi_data VAR BYTE
DATA_LENGTH CON 30716
'-------------------------------------------------------------------------------
The WriteSPI and ReadSPI functions below can be GOSUBs, or INLINED (i.e. pasted directly where the functions appear) for faster performance.
Code:
WriteSPI:
SSPIF = 0 'CLEAR INTERRUP FLAG
WCOL = 0 'CLEAR COLLISION BIT BEFORE WRITING TO SPI
SSPBUF = tx_spi_data 'SEND BYTE
WHILE(!SSPIF) 'WAIT FOR BYTE TO BE CLOCKED-OUT/CLOCKED-IN - THIS HAPPENS SIMULTANEOUSLY
WEND
rx_spi_data = SSPBUF 'STORE RECEIVED DATA
SSPIF = 0 'CLEAR INTERRUP FLAG
RETURN
ReadSPI:
SSPIF = 0 'CLEAR INTERRUP FLAG
WCOL = 0 'CLEAR COLLISION BIT BEFORE WRITING TO SPI
SSPBUF = 0 'SEND/CLOCK-OUT DUMMY BYTE TO CLOCK-IN RECEIVED BYTE
WHILE(!SSPIF) 'WAIT FOR 8-BITS TO BE CLOCKED-OUT/CLOCKED-IN - THIS HAPPENS SIMULTANEOUSLY
WEND
rx_spi_data = SSPBUF 'STORE RECEIVED DATA
SSPIF = 0 'CLEAR INTERRUP FLAG
RETURN
Note that there is quite a bit of optimization possible. In the places where you will be accessing the RS232 port right after the SPI commands; you could remove the wait states on the SPI commands (i.e. WHILE-WEND). All you need to make sure is that you allow sufficient time for the 8-bits to clock out; which the RS232 processing takes care of.
Also note that during this whole process you are buffering data into SRAM (or out of SRAM) sequentially (e.g. you receive an RS232 byte and store it, and again). This means that if you have qualifiers required to be read (or transmitted) at the beginning or end of your packet, then you have to handle this separately (e.g. receive-process-validate first, then enter the buffering routine).
Bookmarks