'jleblanc 4.11.06
'mod of code sent to me by leif

DEFINE OSC 20  'OSC MUST BE SET TO HS

'include modedefs.bas for shiftin and out modes
INCLUDE "modedefs.bas"

'general purpose variables
    i VAR BYTE
    counter VAR BYTE

'pin definitions for comm w/ Laipec TRW-24G
    RF_CE   VAR    PORTD.7 'yellow
    RF_CS   VAR    PORTD.3 'dark green
    RF_DR   VAR    PORTD.2 'blue
'channel 1
    RF_CLK1 VAR    PORTD.1 'black
    RF_DATA_In VAR PORTD.0  'light blue
    RF_DATA_Out VAR PORTD.0

    switch  VAR portc.4
    receiveLED  VAR portc.3
    sendLED VAR portc.2

' THIS IS THE ADDRESS FOR THE w/ Laipec TRW-24G
    WhichAddress1 VAR BYTE     'Channel 1
    WhichAddress2 VAR BYTE    'Channel 2

' DEFINE VARIABLES FOR SERIAL TO PC
    inv9600 CON 16468   ' baudmode for serin2 and serout2: 9600 8-N-1 inverted
    non9600 CON 84      ' baudmode for serin2 and serout2: 9600 8-N-1 non-inverted

'constants for RF configuration modes
    CONRFRX VAR BYTE
    CONRFTX VAR BYTE

'indicates state of current RF configuration - TX is 0, RX is 1
    RFCurrentState VAR BIT

'hold data for RF message
    RFDataArrayIN VAR BYTE[4]
    RFDataArrayOUT VAR BYTE[4]

'hold data for RF configuration
    RFConfigArray VAR BYTE[16]

'variables for each received or sent message
    msgFromID VAR BYTE
    msgToID VAR BYTE
    msgData1 VAR BYTE
    msgData2 VAR BYTE

    me  VAR BYTE
    friend  VAR BYTE
    me = 1      'change this for the correct jar
    friend = 2
    
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
bootup:
   WhichAddress1 =$BA 'These are things maybe to change????
   WhichAddress2 =$BA
   PORTA = %00000000;
   TRISA = %00000001;  ' 0 = Output, 1 = Input  (A.1 is RxPC)

   PORTB = %00000000;
   TRISB = %01101010;  ' 0 = Output, 1 = Input (C.1 is RF_DATA_In, C.3 is RF_DR)


main:

   'intialize RF module configuration
   'constants to define receive/transmit modes at 2402 Mhz frequency
   CONRFRX = $05
   CONRFTX = $04
   RFCurrentState = CONRFRX

   GOSUB initRFConfig

   msgToID = 0   ' CHANGE THIS TO WHO SHOULD RECIEVE MESSAGE
   msgFromID = me   '  CHANGE THIS TO ID OF SENDER
   'Initializes Data Out
   msgData1  = 0    ' DATA SENT
   msgData2  =0    ' DATA SENT


'************************BEGIN MAIN LOOP**************************************'
'***************************************************************************

   WHILE 1   'Run Forever

       LOW RF_CS   ' bring CS low before turning CE high - only one high at a time!
       HIGH RF_CE  ' bring CE high to bring RF into active mode

       'if there's a message waiting in the RX buffer, read it
       IF RF_DR = 1 THEN
           INPUT RF_DATA_In 'This makes that pin an Input PIN
           GOSUB receiveRF
       ENDIF

       'here's where we send our data
       IF switch = 1 THEN  'if the switch is closed send a message
           msgToID = friend   ' CHANGE THIS TO WHO SHOULD RECIEVE MESSAGE
           msgData1  = "y"    ' DATA SENT
           msgData2  =4       'random data
           GOSUB sendData    ' goto the sendData function

       'RESET SEND OUT INFORMATION
       msgToID = 0   ' CHANGE THIS TO WHO SHOULD RECIEVE MESSAGE
           msgData1  =0    ' DATA SENT
           msgData2  =0

       ENDIF

   WEND

'***************************************************************************

'***************************************************************************

receiveRF:

    INPUT RF_DATA_In 'Redudant? given we say this in main loop?
   'power down RF front-end for current conservation
   LOW RF_CE
   'clock in data from RF-24G to PIC
   FOR i=0 TO 3
       'clock should follow data by at least 50nsec
       ''This basically sends out a clock signal
       ''SHIFTIN  DataPin,ClockPin,Mode,[Var{\Bits}...]
       SHIFTIN RF_DATA_In, RF_CLK1, MSBPRE, [RFDataArrayIN[i]\8]
   NEXT

   'send received data to PC for serial debugging 
        FOR i=0 TO 3
        SEROUT2 PORTC.6, 16468, [DEC RFDataArrayIN[i], 10, 13]
        NEXT
        
   'power up RF front-end again
  HIGH RF_CE
  'Absorb the incoming Message
  msgToID = RFDataArrayIN[0]       'the receiver is in msgToID
  msgFromID = RFDataArrayIN[1]    'sender information in msgFromID
  msgData1 = RFDataArrayIN[2]    'incoming data stored in variable msgData1
  msgData2 = rfdataArrayIN[3]      ' and in msgData2

  'Here we blink to acknowledge we have received the message
  HIGH receiveLED
  PAUSE 500
  LOW receiveLED
  PAUSE 500
  HIGH receiveLED
  PAUSE 500
  LOW receiveLED
  PAUSE 500

RETURN



sendData:
    'Load the RF data out array with our message
       RFDataArrayOUT[0] = msgToID
       RFDataArrayOUT[1] = msgFromID
       RFDataArrayOUT[2] = msgData1
       RFDataArrayOUT[3] = msgData2

       'set RF to transmit mode...
        RFCurrentState = CONRFTX
        GOSUB setRFConfig

' for shockburst TX, the sum of RX address, payload, and CRC must be less than 256 bits long
' the chip then tacks on a preamble to this message, and the total msg is 266 bits

       OUTPUT RF_DATA_Out   'Makes the pin an Output

       'get back into active mode
       HIGH RF_CE

       'Need pause between CE high and DATA clock out
       PAUSEUS 100

       'clock out 5 byte RF address of recipient
       FOR i = 8 TO 12
           'clock out this byte
           SHIFTOUT RF_DATA_Out, RF_CLK1, MSBFIRST, [RFConfigArray[i]\8]
       NEXT

       'clock out 4 bytes of data payload
       FOR i = 0 TO 3
           'clock out this byte
           SHIFTOUT RF_DATA_Out, RF_CLK1, MSBFIRST, [RFDataArrayOUT[i]\8]
       NEXT

       'start shockburst transmission
       LOW RF_CE
       PAUSEUS 300

       'flash LED to indicate that we transmitted
       HIGH sendLED
       PAUSE 500
       LOW sendLED
       PAUSE 500
       HIGH sendLED
       PAUSE 500
       LOW sendLED
       PAUSE 500

       'afterward, set RF back to its default receive state
       RFCurrentState = CONRFRX
       GOSUB setRFConfig
RETURN




setRFConfig: '  THIS IS USED TO SWITCH BETWEEN RECIEVE AND TRANSMIT MODES

   'during configuration of the transmitter, we need RF_DATA as an output
   OUTPUT RF_DATA_Out

   'set chip to configure mode (CE low, CS high)
   LOW RF_CE
   HIGH RF_CS

   'pause between CS high and DATA clockout
   PAUSEUS 100

   'RFCurrentState indicates 2402 Mhz frequency and either RX or TX state
   'clock out new configuration data from PIC to RF-24G
   SHIFTOUT RF_DATA_Out, RF_CLK1, MSBFIRST, [RFCurrentState\8]

   'configuration set on falling edge of CS
   LOW RF_CS
   LOW RF_CE

   'for consistency with the rx, stick this here
   INPUT RF_DR

   'flash the LED on B6 to indicate that we configured
   'high DEBUG_LED1
  ' pause 250
   'low DEBUG_LED1

RETURN





initRFConfig:
   'configuration is a 144 bit word
   'must be clocked in MSB first
   'bit map
   '143:120 - reserved for testing
   '119:112 - length of data payload section RX channel 2
   '111-104 - length of data payload section RX channel 1
   '103:64  - up to 5 byte address for RX channel 2
   '63:24   - up to 5 byte address for RX channel 1
   '23:18   - number of address bits (both RX channels)
   '17      - 8 or 16 bit CRC
   '16      - enable on-chip CRCD generation/checking
   '15      - enable two channel receive mode
   '14      - communication mode (direct or shockburst)
   '13      - RF data rate (1Mbps requires 16Mhz crystal)
   '12:10   - crystal frequency
   '9:8     - RF output power
   '7:1     - frequency channel
   '0       - RX or TX operation

   'setup RFConfigArray with config bytes, see datasheet for default configuration
   'this array is backwards so we can clock from MSB to LSB by increasing the index
   'Data bits 119-112: Max data width on channel 2 (excluding CRC and adrs)
    RFConfigArray[1] = $20 'payloadSize, 4 BYTES
   'Data bits 111-104: Max data width on channel 1 (excluding CRC and adrs)
    RFConfigArray[2] = $20 'payloadSize, 4 BYTES
   'Data bits 103-64: Channel 2 address, 5 bytes (40 bits)
    RFConfigArray[3] = WhichAddress2
    RFConfigArray[4] = WhichAddress2
    RFConfigArray[5] = WhichAddress2
    RFConfigArray[6] = WhichAddress2
    RFConfigArray[7] = WhichAddress2
   'Data bits 63-24: Channel 1 address, 5 bytes (40 bits)
    RFConfigArray[8] = WhichAddress1
    RFConfigArray[9] = WhichAddress1
    RFConfigArray[10] = WhichAddress1
    RFConfigArray[11] = WhichAddress1
    RFConfigArray[12] = WhichAddress1
   'Data bits 23-16: Address width and CRC  - 40 bit addr, 16 bit CRC, CRC enabled
    RFConfigArray[13] = $A3
   'Data bits 15-8: One Channel Receive, Shockburst Enabled, 250 kilobits, etc
    RFConfigArray[14] = $4F
   'Data bits 7-0: 2402 Mhz frequency, RX enabled/disabled (depending on RFCurrentState)
    RFConfigArray[15] = RFCurrentState

   '===================================================================
   'During configuration of the transmitter, we need RF_DATA as an output
   INPUT RF_DR
   INPUT RF_DATA_In
   OUTPUT RF_DATA_Out

   'set chip to configure mode (CE low, CS high)
   LOW RF_CE
   HIGH RF_CS

   'pause between CS high and DATA clockout
   PAUSEUS 100

   'clock out configuration bytes from PIC to RF-24G
   FOR i = 1 TO 15
       'set config one byte at a time from MSB to LSB
       SHIFTOUT RF_DATA_Out, RF_CLK1, MSBFIRST, [RFConfigArray[i]\8]
   NEXT
   'configuration is set on the falling edge of CS, bring it low
   LOW RF_CS
   LOW RF_CE

   'flash LED on pin B6 to debug that we configured
   HIGH sendLED
   PAUSE 250
   LOW sendLED
   PAUSE 250
   HIGH receiveLED
   PAUSE 250
   LOW receiveLED
   PAUSE 250
   HIGH sendLED
   PAUSE 250
   LOW sendLED
   HIGH receiveLED
   PAUSE 250
   LOW receiveLED
   PAUSE 250

RETURN