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.
Necessary defines (copied from PRSTEIN's code - http://www.picbasic.co.uk/forum/showthread.php?t=12766):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
The WriteSPI and ReadSPI functions below can be GOSUBs, or INLINED (i.e. pasted directly where the functions appear) for faster performance.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 '-------------------------------------------------------------------------------
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.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
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