View Full Version : MRF24J40MA with a PIC18LF13K50
  
scumari
- 4th October 2012, 11:47
Hi
Trying to create a universal code for a MRF24J40MA with a PIC18LF13K50 controller in MELabs PICBASIC PRO 2.6, that should work as a receiver aswell as a transmitter, I encountered a few problems.
The code I use and the drawing can be downloaded here (http://www.scumari.nl/www/mcu/MRF/MRF.zip).
Pressing the send button should send one randomized byte in the air. The receiving unit shout receive it and copy it to the LEDS on the C-port. 
The point is, I can't get it to work at all!
Did anyone have it working in PICBASIC?
Thanx in advance
Normnet
- 6th October 2012, 03:01
It's been done in Basic. 
See MRF24J40MA RF Code working. (http://www.protonbasic.co.uk/showthread.php/60614-MRF24J40MA-RF-Code-working?highlight=MRF24J40MA)
Warning other compiler.
I thought I saw it also on the WiKi but can't find it now.
Norm
scumari
- 9th October 2012, 10:51
Translated that one for PICBASIC, did't work at all!
Thanx anyway
mackrackit
- 9th October 2012, 16:11
Maybe if you show you translated code someone might be able to help.  And please do not expect folks to download and open a ZIP, just post the info.
Normnet
- 9th October 2012, 20:29
Translated that one for PICBASIC, did't work at all!
Thanx anyway
It does work, I have it working but not in PicBasicPro.
Norm
scumari
- 10th October 2012, 08:26
It is a ZIP because it exsists of three files, the basic source, an inc file and a pdf with the drawing of the connections.
If you are scared of downloading ZIP files, a good virus scanner should be more than sufficient to be save.
It's downloadable from my own site and should be save..............
The Proton listing uses a different microcontroller and gives me SPI.inc errors while compiling from the start! Unusable for me.
At first I used an old proton source and translated it directly to PICBASIC PRO. It compiled but was not complete.
Then I recreated the Initializing, transmitting and receiving code with the MRF pdf file as guide.
Now I'm stuck.
scumari
- 10th October 2012, 09:05
For those still affraid of ZIP files:
'************************************************* ***************
'*  Name    : MRF.BAS                                           *
'*  Author  : SCUMARI Tec                                       *
'*  Notice  :                                                            *
'*          : All Rights Reserved                               *
'*  Date    : 7-6-2012                                          *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'************************************************* ***************
'                            PIC18LF13K50
'                              ___ ___
'                       VDD  O|1  - 20|O  VSS
'            RA5 OSC1 OSCIN  O|2    19|O  RA0  +    PGD
'       RA4 AN3 OSC2 CLKOUT  O|3    18|O  RA1  D-   PGC
'              RA3 MCLR VPP  O|4    17|O  VUSB
'         RC5 CCP P1A T0CKI  O|5    16|O  RC0  AN4  C12IN+  INT0    VREF+
'        RC4 P1B C12OUT SRQ  O|6    15|O  RC1  AN5  C12IN1- INT1    VREF-
'   RC3 AN7 P1C C12IN3- PGM  O|7    14|O  RC2  AN6  P1D     C12IN2- CVREF INT2
' RC6 AN8 SS  T13CKI T1OSCI  O|8    13|O  RB4  AN10 SDI     SDA
'        RC7 AN9 SDO T1OSCO  O|9    12|O  RB5  AN11 RX      DT          
'                RB7 TX  CK  O|10   11|O  RB6  SCK  SCL
'                              -------
'18F14K50
@        __CONFIG    _CONFIG1L, 000h
@        __CONFIG    _CONFIG1H, 018h
@        __CONFIG    _CONFIG2L, 000h
@        __CONFIG    _CONFIG2H, 000h
@        __CONFIG    _CONFIG3H, 080h    ;080h is MCLRE
@        __CONFIG    _CONFIG4L, 000h
@        __CONFIG    _CONFIG5L, 003h
@        __CONFIG    _CONFIG5H, 0C0h
@        __CONFIG    _CONFIG6L, 003h
@        __CONFIG    _CONFIG6H, 0E0h
@        __CONFIG    _CONFIG7L, 003h
@        __CONFIG    _CONFIG7H, 040h
    'INCLUDE "modedefs.bas"
    include "MRF24J40def.inc"
    DEFINE OSC 16			
    
    OSCCON =  %01100010     '4550 op $FE / K50 op 118 / 689 op 112
    OSCTUNE = $1F           '4550 op $0F / K50 op 31  / 689 op 15
    ADCON0 = 0
    ANSEL = 0
    ANSELH = 0
    UCON = 0
    IOCA = 3
    IOCB = 0
    INTCON = 0
    PORTA = 0
    TRISA  = %00001111
    PORTB = 0
    TRISB  = %01000000
    PORTC = 0
    TRISC  = 0
    intx	    VAR 	PORTA.1	
    res	        VAR	    PORTA.4	 
    cs	        VAR 	PORTA.5	
    sdi	        VAR 	PORTB.4		
    sck	        VAR 	PORTB.5		
    sdo	        VAR	    PORTB.6		
    wake	    vAR 	PORTB.7	
    butt        var     PORTA.0
    
    addr        var  byte
    addrm       var  word
    temp	    VAR	 word	
    tmp 	    VAR	 BYTE	
    indat       VAR  BYTE
    outdat      VAR  BYTE
    i           VAR  BYTE
    channel         var byte
    txRadioBuffer   var byte[128]	
    rxRadioBuffer   var byte[128]	
    txDestination   VAR	 word
    txPayLoad       VAR  BYTE
    HeaderLength    VAR  BYTE
    FrameLength     VAR  BYTE 
    FrameControl    VAR	 word
    IEEEseqNumber   VAR  BYTE
    wcnt            VAR  BYTE
    bRetVal         VAR  BYTE
    IntStatus       var  Byte
    
    TX_BUFFER_SIZE  con 128
    RX_BUFFER_SIZE  con 128
    
    'Times
    tlong  con 100
    tmid   con 50
    tshort con 25
    
    cs = 1
    res = 1
    
    pause 100
    PORTC = 129
    pause 50
    PORTC = 66
    pause 50
    PORTC = 36
    pause 50
    PORTC = 24
    pause 50
    PORTC = 24
    pause 50
    PORTC = 36
    pause 50
    PORTC = 66
    pause 50
    PORTC = 129
    pause 50
    PORTC = 0
    pause 100
    'IntFlag = 0 'remember to remove this
    gosub initialize
    'ON INTERRUPT GOTO ReceiveData
    'disable
    'INTCON = %10010000 ' Enable RB0 interrupt 
    'On_Hardware_Interrupt GoTo Radio_ISR
'    GIE = 0     'disable global int
'    IPEN = 0    'disable high pri interupts
'    INT2IP =0   'disable int2 high pri  not using priorty
'    INT2IE = 0  'disable int2 portb.2
'    INTEDG2 = 0 'rising
main:
    enable
    if butt = 0 then 
        'PORTC = 255
        GoSub SendMessage
        pause 100
    endif
    'goto main    
    'disable
ReceiveData:
    if intx = 1 then
        'DISABLE             ' Disable interrupts in handler
        'PORTC = 255
        gosub RecMessage
        'RESUME              ' Return to main program
        'ENABLE              ' Enable interrupts after handler
    endif
    goto main
    
Initialize:
    res = 0
    pause 10
    res = 1
    pause 10
    
    'Example steps to initialize the MRF24J40:
    '1. SOFTRST (0x2A) = 0x07 – Perform a software Reset. The bits will be automatically cleared to ‘0’ by hardware.
    '2. PACON2 (0x18) = 0x98 – Initialize FIFOEN = 1 and TXONTS = 0x6.
    '3. TXSTBL (0x2E) = 0x95 – Initialize RFSTBL = 0x9.
    '4. RFCON1 (0x201) = 0x01 – Initialize VCOOPT = 0x01.
    '5. RFCON2 (0x202) = 0x80 – Enable PLL (PLLEN = 1).
    '6. RFCON6 (0x206) = 0x90 – Initialize TXFIL = 1 and 20MRECVR = 1.
    '7. RFCON7 (0x207) = 0x80 – Initialize SLPCLKSEL = 0x2 (100 kHz Internal oscillator).
    '8. RFCON8 (0x208) = 0x10 – Initialize RFVCO = 1.
    '9. SLPCON1 (0x220) = 0x21 – Initialize CLKOUTEN = 1 and SLPCLKDIV = 0x01.
    addr = SOFTRST: gosub ShAddr: outdat = 7: gosub DataWr
    addr = PACON2: gosub ShAddr: outdat = $98: gosub DataWr
    addr = TXSTBL: gosub ShAddr: outdat = $95: gosub DataWr
    addrm = RFCON1: gosub LoAddr: outdat = $01: gosub LDataWr
    addrm = RFCON2: gosub LoAddr: outdat = $80: gosub LDataWr
    addrm = RFCON6: gosub LoAddr: outdat = $90: gosub LDataWr
    addrm = RFCON7: gosub LoAddr: outdat = $80: gosub LDataWr
    addrm = RFCON8: gosub LoAddr: outdat = $10: gosub LDataWr
    addrm = SLPCON1: gosub LoAddr: outdat = $21: gosub LDataWr
    '3.8.2.1 Configuring Nonbeacon-Enabled PAN Coordinator
    'The following steps configure the MRF24J40 as a coordinator in a nonbeacon-enabled network:
    '1. Set the PANCOORD (RXMCR 0x00<3>) bit = 1 to configure as the PAN coordinator.
    '2. Clear the SLOTTED (TXMCR 0x11<5>) bit = 0 to configure Unslotted CSMA-CA mode.
    '3. Configure BO (ORDER 0x10<7:4>) value = 0xF.
    '4. Configure SO (ORDER 0x10<3:0>) value = 0xF.
    addr = RXMCR: gosub ShAddr: gosub DataRd
    outdat = indat or 8         'bit 3 = 1
    addr = RXMCR: gosub ShAddr: gosub DataWr
    addr = TXMCR: gosub ShAddr: gosub DataRd
    outdat = indat and 223      'bit 5 = 0
    addr = TXMCR: gosub ShAddr: gosub DataWr
    
'>>> 3.8.2.2 Configuring Nonbeacon-Enabled Device
    'As above but comment out the line below
    addr = ORDER: gosub ShAddr: outdat = $FF: gosub DataWr
    
    '(see Section 3.8 “Beacon-Enabled and Nonbeacon-Enabled Networks”):
    '10. BBREG2 (0x3A) = 0x80 – Set CCA mode to ED.
    '11. RSSITHCCA (0x3F) = 0x60 – Set CCA ED threshold.
    '12. BBREG6 (0x3E) = 0x40 – Set appended RSSI value to RXFIFO.
    '13. Enable interrupts – See Section 3.3 “Interrupts”.
    '14. Set channel – See Section 3.4 “Channel Selection”.
    '15. RFCTL (0x36) = 0x04 – Reset RF state machine.
    '16. RFCTL (0x36) = 0x00.
    '17. Delay at least 192 ms.
    addr = BBREG2: gosub ShAddr: outdat = $80: gosub DataWr
    addr = RSSITHCCA: gosub ShAddr: outdat = $60: gosub DataWr
    addr = BBREG6: gosub ShAddr: outdat = $60: gosub DataWr
    addr = INTCON: gosub ShAddr: outdat = 8: gosub DataWr
    addrm = RFCON0: gosub ShAddr: outdat = $82: gosub DataWr    'Channel 19
    addr = RFCTL: gosub ShAddr: outdat = 4: gosub DataWr
    addr = RFCTL: gosub ShAddr: outdat = 0: gosub DataWr
    
    pauseUS 200  'as per datasheet wait at least 192uS
    For i = 0 To TX_BUFFER_SIZE
        txRadioBuffer[i] = i '0x00   put in some data
    Next
    For i = 0 To RX_BUFFER_SIZE
        rxRadioBuffer[i] = 0
    Next
  
    return
SendMessage:
    For i = 0 To 127      'make sure there is valid data in array
        txRadioBuffer[i] = i
    Next
    txDestination = $FFFF    ' Set the destination address
    txPayLoad = 16 ' set amount of data to xmitt from array(payload)
  
    're-write first 11 bytes with hdrLen, frm Len and Header 
    '// Compute and send header and frame length
    HeaderLength = 9  '(index 2 to 10, 9 bytes)
    FrameLength = HeaderLength + txPayLoad  '9 (0-8)+ 16 (0-15) = 25   
    ''address 0-1 '2 bytes
    txRadioBuffer[0] = HeaderLength 
    txRadioBuffer[1] = FrameLength  
    txRadioBuffer[2] = FrameControl.LowByte     'framecontrol[0]  0x26
    txRadioBuffer[3] = FrameControl.HighByte    'framecontrol[1]  0x22
    txRadioBuffer[4] = IEEEseqNumber            'IEEEseqNumber++ 
    txRadioBuffer[5] = $01                      'myPANID[0]    
    txRadioBuffer[6] = $02                      'myPANID[1] 
    txRadioBuffer[7] = txDestination.LowByte    'networkTX.dest & 0x00FF
    txRadioBuffer[8] = txDestination.HighByte   'networkTX.dest >> 8
    txRadioBuffer[9] = $cd                      'myShortAddress[0]
    txRadioBuffer[10] = $ab                     'myShortAddress[1] 
    random temp
    txRadioBuffer[11] = temp.Byte0
    IEEEseqNumber = IEEEseqNumber + 1
    wcnt = 0
    'fifo = 0 = i
    For i = 0 To FrameLength +1
        addrm = i: gosub LoAddr: outdat = txRadioBuffer[i]: gosub LDataWr 
    Next   
'2. If the packet requires an Acknowledgment, the Acknowledgment request bit in the frame control
' field should be set to ‘1’ in the MAC Header (MHR) when the host microcontroller loads the TX
' Normal FIFO, and set the TXNACKREQ (TXNCON 0x1B<2>) bit = 1. Refer to Section 3.13 “Acknowledgement”
' for more information about Acknowledgment configuration.
    addr = TXSTAT: gosub ShAddr: gosub DataRd
    outdat = indat or 192         'bit 6 and 7 = 1
    addr = TXSTAT: gosub ShAddr: gosub DataWr
'3. If the frame is to be encrypted, the security enabled bit in the frame control field should be
' set to ‘1’ in the MAC Header (MHR) when the host microcontroller loads the TX Normal FIFO,
' and set the TXNSECEN (TXNCON 0x1B<1>) bit = 1. Refer to Section 3.17 “Security” for
' more information about Security modes.
'4. Transmit the packet by setting the TXNTRIG (TXNCON 0x1B<0>) bit = 1. The bit will be
' automatically cleared by hardware.
    addr = TXNCON: gosub ShAddr: gosub DataRd
    outdat = indat or 5         'bit 0 and 2 = 1
    addr = TXNCON: gosub ShAddr: gosub DataWr
SendMessage1:
'5. A TXNIF (INTSTAT 0x31<0>) interrupt will be issued. The TXNSTAT (TXSTAT 0x24<0>) bit
' indicates the status of the transmission:
'TXNSTAT = 1: Transmission was successful
'TXNSTAT = 0: Transmission failed, retry count exceeded
'The number of retries of the most recent transmission is contained in the TXNRETRY
'(TXSTAT 0x24<7:6>) bits. The CCAFAIL
'(TXSTAT 0x24<5>) bit = 1 indicates if the failed transmission was due to the channel busy
' (CSMA-CA timed out).    '// Transmission acknowledgement request      
    addr = INTSTAT: gosub ShAddr: gosub DataRd
    if indat.0 = 1 then goto SendMessage1
    
    addr = TXSTAT: gosub ShAddr: gosub DataRd
    tmp = PORTC
    if indat.0 = 1 then
        PORTC = 255
    else
        PORTC = 0
    endif
    pause 100     
    PORTC = txRadioBuffer[11]
    
    Return         
    
RecMessage:
    addr = INTSTAT: gosub ShAddr: gosub DataRd
    IntStatus = indat
    
    if INTSTAT and 8 = 8 then return
    
'*************receive packet**********************
getMACframe:
'   Example steps to read the RXFIFO:
'   1. Receive RXIF interrupt. (INSTAT.3)
'   2. Disable host microcontroller interrupts.
'   3. Set RXDECINV = 1; disable receiving packets off air. (BBREG1.2)
'   4. Read address, 0x300; get RXFIFO frame length value.
'   5. Read RXFIFO addresses, 0x301 through (0x300 + Frame Length + 2); read packet data plus LQI and RSSI.
'   6. Clear RXDECINV = 0; enable receiving packets.
'   7. Enable host microcontroller interrupts.
'// Disable interrupts, disable reception
'    'RFIE = 0;
    
    addr = BBREG1: gosub ShAddr: outdat = $04: gosub DataWr
 
    bRetVal = 0
    addrm = RX_FIFO: gosub loAddr: gosub LDataRd
    rxRadioBuffer[0] = indat + 2
   
    For i = 1  To  rxRadioBuffer[0]
        addrm = (RX_FIFO + i): gosub loAddr: gosub LDataRd
        rxRadioBuffer[i] = indat
    Next
    addr = BBREG1: gosub shAddr: outdat = $00: gosub DataWr     
    
    PORTC = rxRadioBuffer[11]
 
    Return
'**************** releaseRXbuffer *************
releaseRXbuffer:
  
    'INT2IE = 0 'disable interrupt
    addr = RXFLUSH: gosub shAddr: outdat = $01: gosub DataWr  'flush buffer
    addr = RXMCR: gosub shAddr: outdat = $00: gosub DataWr    're-enable Ack response
    'radioStatus_rxFifoHasData = 0 'reset
    'rxsize = 0    don't have yet
    'INT2IE = 1 'enable interrupt
    Return
''################################################ ###########################
ShAddr:
    cs = 0
    pauseus tlong
    sdi = 0
    sck = 1
    pauseus tmid
    sck = 0
    for tmp = 0 to 5
        sdi = addr.5
        sck = 1
        pauseus tmid
        sck = 0
        addr = addr << 1
        pauseus tmid
    next tmp
    return
LoAddr:
    cs = 0
    pauseus tlong
    sdi = 1
    sck = 1
    pauseus tmid
    sck = 0
    for tmp = 0 to 9
        sdi = addrm.9
        sck = 1
        pauseus tmid
        sck = 0
        addrm = addrm << 1
        pauseus tmid
    next tmp
    return
DataRd:
    sdi = 0
    sck = 1
    pauseus tmid
    sck = 0
    indat = 0
    for tmp = 0 to 7
        sck = 1
        pauseus tmid
        indat = indat + sdo
        sck = 0
        indat = indat << 1
        pauseus tmid
    next tmp
    cs = 1
    return
   
DataWr:
    sdi = 1
    sck = 1
    pauseus tmid
    sck = 0
    'Read data
    indat = 0
    for tmp = 0 to 7
        sdi = outdat.7
        sck = 1
        pauseus tmid
        sck = 0
        outdat = outdat << 1
        pauseus tmid
    next tmp
    cs = 1
    return
LDataRd:
    sdi = 0
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    indat = 0
    for tmp = 0 to 7
        sck = 1
        pauseus tmid
        indat = indat + sdo
        sck = 0
        indat = indat << 1
        pauseus tmid
    next tmp
    cs = 1
    return
LDataWr:
    sdi = 1
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    indat = 0
    for tmp = 0 to 7
        sdi = outdat.7
        sck = 1
        pauseus tmid
        sck = 0
        outdat = outdat << 1
        pauseus tmid
    next tmp
    cs = 1
    return
Maybe someone can point me in the right direction......................
Thanx
scumari
- 6th June 2013, 06:05
I have it working !
Demon
- 6th June 2013, 23:43
Any chance of sharing your code?
Robert
scumari
- 7th June 2013, 06:53
Sure, here is the PicBasic listing for a DEVICE, for a COORDINATOR just comment the device line (line 219) and uncomment  line 212 in the initialization routine.
One must be a coordinator, all others should be devices.
'************************************************* ***************************
'*  Name    : MRFshort.BAS                                                  *
'*  Author  : SCUMARI Tec                                                   *
'*  Notice  : Copyright (c) 2013 SCUMARI Group                              *
'*          : All Rights Reserved                                           *
'*  Date    : 3-6-2013                                                      *
'*  Version : 1.0                                                           *
'*  Notes   : PIC18LF13K50 controller for the MRF24J40MA module             *
'*          : This is standard software for both sender and receiver.       *
'*          : Both modules start in receive mode.When the button is pressed,*
'*          :  a byte is randomized and send over. Both receiver and sender *
'*          :  displays the value of 1 byte on a LED bar.                   *
'************************************************* ***************************
'                            PIC18LF13K50
'                              ___ ___
'                       VDD  O|1  - 20|O  VSS
'            RA5 OSC1 OSCIN  O|2    19|O  RA0  +    PGD
'       RA4 AN3 OSC2 CLKOUT  O|3    18|O  RA1  D-   PGC
'              RA3 MCLR VPP  O|4    17|O  VUSB
'         RC5 CCP P1A T0CKI  O|5    16|O  RC0  AN4  C12IN+  INT0    VREF+
'        RC4 P1B C12OUT SRQ  O|6    15|O  RC1  AN5  C12IN1- INT1    VREF-
'   RC3 AN7 P1C C12IN3- PGM  O|7    14|O  RC2  AN6  P1D     C12IN2- CVREF INT2
' RC6 AN8 SS  T13CKI T1OSCI  O|8    13|O  RB4  AN10 SDI     SDA
'        RC7 AN9 SDO T1OSCO  O|9    12|O  RB5  AN11 RX      DT          
'                RB7 TX  CK  O|10   11|O  RB6  SCK  SCL
'                              -------
'18F13K50
@        __CONFIG    _CONFIG1L, 000h
@        __CONFIG    _CONFIG1H, 018h
@        __CONFIG    _CONFIG2L, 000h
@        __CONFIG    _CONFIG2H, 000h
@        __CONFIG    _CONFIG3H, 080h    ;080h is MCLRE
@        __CONFIG    _CONFIG4L, 000h
@        __CONFIG    _CONFIG5L, 003h
@        __CONFIG    _CONFIG5H, 0C0h
@        __CONFIG    _CONFIG6L, 003h
@        __CONFIG    _CONFIG6H, 0E0h
@        __CONFIG    _CONFIG7L, 003h
@        __CONFIG    _CONFIG7H, 040h
    INCLUDE "modedefs.bas"
    include "MRF24J40def.inc"
    DEFINE OSC 16			
    
    OSCCON =  %01100010     '4550 op $FE / K50 op 118 / 689 op 112
    OSCTUNE = $1F           '4550 op $0F / K50 op 31  / 689 op 15
    ADCON0 = 0
    ANSEL = 0
    ANSELH = 0
    UCON = 0
    IOCA = 3
    IOCB = 0
    INTCON = 0
    PORTA = 0
    TRISA  = %00111111
    PORTB = 0
    TRISB  = %00000000
    PORTC = 0
    TRISC  = 0
    intx	    VAR 	PORTA.4	
    res	        VAR	    PORTB.4	 
    sdi	        VAR 	PORTB.5		
    sck	        VAR 	PORTB.6		
    sdo	        VAR	    PORTA.5		
    cs	        VAR 	PORTB.7	
    'wake	    vAR 	PORTB.7	
    butt        var     PORTA.0
    
    addr        var  byte
    addrm       var  word
    addrl       VAR  addrm.byte0
    addrh       VAR  addrm.byte1
    temp	    VAR	 word	
    tmp 	    VAR	 BYTE	
    indat       VAR  BYTE
    outdat      VAR  BYTE
    i           VAR  BYTE
    channel         var byte
    txRadioBuffer   var byte[128]	
    rxRadioBuffer   var byte[128]
    txHeader        var Byte[11]	
    txDestination   VAR	 word
    txPayLoad       VAR  BYTE
    HeaderLength    VAR  BYTE
    FrameLength     VAR  BYTE 
    FrameControl    VAR	 word
    IEEEseqNumber   VAR  BYTE
    wcnt            VAR  BYTE
    bRetVal         VAR  BYTE
    IntStatus       var  Byte
    fifo            var  word
    sdata           var  word
    RadioState      var  byte
    
'    '******** Setup interrupt 18F4520**********
'    GIE         var INTCON.7        'global interrupt enable
'    INT0IE      var INTCON.4        'enable int0, portb.0
'    INT0IF      var INTCON.1        'interrupt flag
'    INTEDG0     var INTCON2.6       'SLPCON0.1   'Interrupt Edge Select
'    'Symbol INT0IP con INTCON3.7
'    IPEN        var RCON.7
'    GIE = 0
'    INT0IE = 0
'    '**********************************
    TX_BUFFER_SIZE  con 127
    RX_BUFFER_SIZE  con 127
    
    'Times
    tlong  con 50
    tmid   con 25
    tshort con 15
    
'FrameControl = %0010001000100110
FrameControl = %1001100001000001
'index               Value
'                     frametype        3  bits   001
'                     securityEnabled  1           0
'                     framepending     1           0
'                     ackRequest       1           0
'                     intraPAN         1           1
'                     don't care       1           0
'                     don't care       2          00
'                     destAddressMode  2          10  0x02
'                     frameVersion     2          01  datasheet says this is reserved
'                     sourceAddressMode 2         10
    cs = 1
    res = 1
    
    pause 100
    PORTC = 129
    pause 50
    PORTC = 66
    pause 50
    PORTC = 36
    pause 50
    PORTC = 24
    pause 50
    PORTC = 24
    pause 50
    PORTC = 36
    pause 50
    PORTC = 66
    pause 50
    PORTC = 129
    pause 50
    PORTC = 0
    pause 100
    'IntFlag = 0 'remember to remove this
    gosub initialize
main:
    addr = INTSTAT: gosub DataRd
    'PORTC = indat
    'pause 100
    if indat.3 = 1 then gosub receive
    'if intx = 0 then gosub Receive
    If butt = 0 Then gosub Send
    'pause 250
    GoTo main
'>>>>>> SUBROUTINES <<<<<<<<<<<<<<<<<<    
Initialize:
    res = 0
    pause 10
    res = 1
    pause 10
    'Example steps to initialize the MRF24J40:
    '1. SOFTRST (0x2A) = 0x07 – Perform a software Reset. The bits will be automatically cleared to ‘0’ by hardware.
    '2. PACON2 (0x18) = 0x98 – Initialize FIFOEN = 1 and TXONTS = 0x6.
    '3. TXSTBL (0x2E) = 0x95 – Initialize RFSTBL = 0x9.
    '4. RFCON1 (0x201) = 0x01 – Initialize VCOOPT = 0x01.
    '5. RFCON2 (0x202) = 0x80 – Enable PLL (PLLEN = 1).
    '6. RFCON6 (0x206) = 0x90 – Initialize TXFIL = 1 and 20MRECVR = 1.
    '7. RFCON7 (0x207) = 0x80 – Initialize SLPCLKSEL = 0x2 (100 kHz Internal oscillator).
    '8. RFCON8 (0x208) = 0x10 – Initialize RFVCO = 1.
    '9. SLPCON1 (0x220) = 0x21 – Initialize CLKOUTEN = 1 and SLPCLKDIV = 0x01.
    addr = SOFTRST: outdat = 7: gosub DataWr
init2:    
    Indat = 0
    addr = SOFTRST:  gosub DataRd
    if indat <> 0 then goto init2
    
    addr = PACON2:  outdat = $98: gosub DataWr
    addr = TXSTBL:  outdat = $95: gosub DataWr
    addrm = RFCON1:  outdat = $01: gosub LDataWr
    addrm = RFCON2:  outdat = $80: gosub LDataWr
    addrm = RFCON6:  outdat = $90: gosub LDataWr
    addrm = RFCON7:  outdat = $80: gosub LDataWr
    addrm = RFCON8:  outdat = $10: gosub LDataWr
    addrm = SLPCON1:  outdat = $21: gosub LDataWr
'** Device or Coordinator ************************************************** ****
    '3.8.2.1 Configuring Nonbeacon-Enabled PAN Coordinator
    'The following steps configure the MRF24J40 as a coordinator in a nonbeacon-enabled network:
    '1. Set the PANCOORD (RXMCR 0x00<3>) bit = 1 to configure as the PAN coordinator.
    '2. Clear the SLOTTED (TXMCR 0x11<5>) bit = 0 to configure Unslotted CSMA-CA mode.
    '3. Configure BO (ORDER 0x10<7:4>) value = 0xF.
    '4. Configure SO (ORDER 0x10<3:0>) value = 0xF.
    'addr = TXMCR:  gosub DataRd
    'outdat = indat: indat.5 = 0     'bit 5 = 0
    'addr = TXMCR:  gosub DataWr
'    addr = RXMCR: outdat = 8:  gosub DataWr    'PROMI & COORD To make it a Coordinator
    'addr = ORDER: outdat = $FF:  gosub DataWr
    '3.8.2.1 Configuring Nonbeacon-Enabled device
    'The following steps configure the MRF24J40 as a coordinator in a nonbeacon-enabled network:
    '1. Set the PANCOORD (RXMCR 0x00<3>) bit = 0 to configure as the device.
    '2. Clear the SLOTTED (TXMCR 0x11<5>) bit = 0 to configure Unslotted CSMA-CA mode.
    addr = RXMCR: outdat = 0:  gosub DataWr     'PROMI To make it a Device
    addr = TXMCR:  gosub DataRd
    outdat = indat: indat.5 = 0      'bit 5 = 0
    addr = TXMCR:  gosub DataWr
    addr = ORDER: outdat = $FF:  gosub DataWr
'** Device or Coordinator ************************************************** ****
    
    '(see Section 3.8 “Beacon-Enabled and Nonbeacon-Enabled Networks”):
    '10. BBREG2 (0x3A) = 0x80 – Set CCA mode to ED.
    '11. RSSITHCCA (0x3F) = 0x60 – Set CCA ED threshold.
    '12. BBREG6 (0x3E) = 0x40 – Set appended RSSI value to RXFIFO.
    '13. Enable interrupts – See Section 3.3 “Interrupts”.
    '14. Set channel – See Section 3.4 “Channel Selection”.
    '15. RFCTL (0x36) = 0x04 – Reset RF state machine.
    '16. RFCTL (0x36) = 0x00.
    '17. Delay at least 192 ms.
    addr = BBREG2:  outdat = $80: gosub DataWr
    addr = CCAEDTH:  outdat = $60: gosub DataWr
    addr = BBREG6:  outdat = $60: gosub DataWr
    addr = INTCON:  outdat = 8: gosub DataWr        'RXIE
    addrm = RFCON0:  outdat = $82: gosub LDataWr    'Channel 19
    addr = RFCTL:  outdat = 4: gosub DataWr
    'pauseUS 10
    addr = RFCTL:  outdat = 0: gosub DataWr
    addr = PANIDL:  outdat = $01: gosub DataWr
    addr = PANIDH:  outdat = $02: gosub DataWr
    addr = SADRL:  outdat = $CD: gosub DataWr
    addr = SADRH:  outdat = $AB: gosub DataWr
    
    pauseUS 10  'as per datasheet wait at least 192uS
    For i = 0 To TX_BUFFER_SIZE
        txRadioBuffer[i] = i '0x00   put in some data
    Next
    For i = 0 To RX_BUFFER_SIZE
        rxRadioBuffer[i] = 0
    Next
    addr = RXFLUSH:  outdat = 1: gosub DataWr
    return
'***** RECEIVING ************************************************** ***************
Receive:
    'Indat = 0
    'addr = INTSTAT:  gosub DataRd 'what caused the interrupt
    addr = BBREG1: outdat = 4:  gosub DataWr      'RXDECINV = 1
 
    bRetVal = 0
    addrm = RX_FIFO:  gosub LDataRd
    rxRadioBuffer[0] = indat
    For i = 1  To  (rxRadioBuffer[0] + 2)
        addrm = (RX_FIFO + i):  gosub LDataRd
        rxRadioBuffer[i] = indat
    Next
    PORTC = rxRadioBuffer[10] 
    
    addr = RXFLUSH:  outdat = 1: gosub DataWr
    
    addr = BBREG1: outdat = 0:  gosub DataWr     'RXDECINV = 0
    
    pause 250
    Return
'***** SENDING ************************************************** ***************
Send:
    
    For i = 0 To 127      'make sure there is valid data in array
        txRadioBuffer[i] = i
    Next
    txDestination = $FFFF    ' Set the destination address
    txPayLoad = 16 ' set amount of data to xmitt from array(payload)
  
    're-write first 11 bytes with hdrLen, frm Len and Header 
    '// Compute and send header and frame length
    HeaderLength = 9  '(index 2 to 10, 9 bytes)
    FrameLength = HeaderLength + txPayLoad  '9 (0-8)+ 16 (0-15) = 25   
    'address 0-1 '2 bytes
    txHeader[0] = HeaderLength 
    txHeader[1] = FrameLength  
    'address 2-10 '8 bytes
    txHeader[2] = FrameControl.LowByte     'framecontrol[0]  0x26
    txHeader[3] = FrameControl.HighByte    'framecontrol[1]  0x22
    txHeader[4] = IEEEseqNumber            'IEEEseqNumber++ 
    txHeader[5] = $01                      'myPANID[0]    
    txHeader[6] = $02                      'myPANID[1] 
    txHeader[7] = txDestination.LowByte    'networkTX.dest & 0x00FF
    txHeader[8] = txDestination.HighByte   'networkTX.dest >> 8
    txHeader[9] = $cd                      'myShortAddress[0]
    txHeader[10] = $ab                     'myShortAddress[1] 
    IEEEseqNumber = IEEEseqNumber + 1
    fifo = 0 
    For i = 0 To HeaderLength + 1   'header & hdr len & frame len  =11
        addrm = fifo: outdat = txHeader[i]:  gosub LDataWr
        fifo = fifo + 1 
    Next   
    
    random temp
    PORTC = temp
    For i = 0 To txPayLoad-1  'FrameLength +1
        addrm = fifo: outdat = temp:  gosub LDataWr
        fifo = fifo + 1
    Next   
    addr = TXNCON: outdat = 1:  gosub DataWr
    pause 250
    
    return
'################################################# ##########################
DataWr:
    cs = 0
    sdi = 0
    pauseus tshort
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    for tmp = 0 to 5
        sdi = addr.5
        pauseus tshort
        sck = 1
        pauseus tmid
        sck = 0
        pauseus tmid
        addr = addr << 1
    next tmp
    sdi = 1
    pauseus tshort
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    'Read data
    indat = 0
    for tmp = 0 to 7
        sdi = outdat.7
        pauseus tshort
        sck = 1
        pauseus tmid
        sck = 0
        outdat = outdat << 1
        pauseus tmid
    next tmp
    cs = 1
    return
DataRd:
    indat = 0
    cs = 0
    sdi = 0
    pauseus tshort
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    for tmp = 0 to 5
        sdi = addr.5
        pauseus tshort
        sck = 1
        pauseus tmid
        sck = 0
        pauseus tmid
        addr = addr << 1
    next tmp
    sdi = 0
    pauseus tshort
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    indat = 0
    for tmp = 0 to 7
        indat = indat << 1
        sck = 1
        pauseus tmid
        indat = indat + sdo
        sck = 0
        pauseus tmid
    next tmp
    cs = 1
    return
LDataWr:
    cs = 0
    sdi = 1
    pauseus tshort
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    for tmp = 0 to 9
        sdi = addrm.9
        pauseus tshort
        sck = 1
        pauseus tmid
        sck = 0
        addrm = addrm << 1
        pauseus tmid
    next tmp
    sdi = 1
    pauseus tshort
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    indat = 0
    for tmp = 0 to 7
        sdi = outdat.7
        pauseus tshort
        sck = 1
        pauseus tmid
        sck = 0
        outdat = outdat << 1
        pauseus tmid
    next tmp
    cs = 1
    return
LDataRd:
    indat = 0
    cs = 0
    sdi = 1
    pauseus tshort
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    for tmp = 0 to 9
        sdi = addrm.9
        pauseus tshort
        sck = 1
        pauseus tmid
        sck = 0
        addrm = addrm << 1
        pauseus tmid
    next tmp
    sdi = 0
    pauseus tshort
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    sck = 1
    pauseus tmid
    sck = 0
    pauseus tmid
    indat = 0
    for tmp = 0 to 7
        indat = indat << 1
        sck = 1
        pauseus tmid
        indat = indat + sdo
        sck = 0
        pauseus tmid
    next tmp
    cs = 1
    return
Below is the MFR24J40def.inc include file
''================================================ =============================
''  MRF24J40 Definitions
''
''  This file is similar to the original MRF24J40.h provided by Microchip.
''  The register names have been modified to reflect the names used in the
''  documentation (DS39776B).  Also the Short Address Register definitions
''  are NOT pre-formatted for SPI transmission to the transceiver.  In other
''  words, they are just addresses.  This is, in my opinion, much easier to
''  comprehend.
''  Also included in this file are individual register definitions to be added
''  as needed.  They are each defined as a union of an symbol byte and an
''  anonymous structure defining the individual fields.  This eliminates the
''  tedious task of including a ".bits" member qualifier with each reference to
''  a member field.  This is compatible with the MPLAB C18 compiler; other
''  compilers...maybe not so much.
Symbol BEACON_FRAME = 0
Symbol DATA_FRAME   = 1
Symbol ACK_FRAME    = 2
Symbol MAC_CMD_FRAME = 3
Symbol NO_ADDR      = 0
Symbol ADDR_16      = 2
Symbol ADDR_64      = 3
'' Define FIFO addresses
Symbol NORMAL_TX_FIFO  = $0
Symbol BEACON_TX_FIFO  = $80
Symbol GTS1_TX_FIFO    = $100
Symbol GTS2_TX_FIFO    = $180
Symbol RX_FIFO         = $300
Symbol SECURITY_FIFO   = $280
'//Long Address Control Registers
Symbol RFCON0          = $200
Symbol RFCON1          = $201
Symbol RFCON2          = $202
Symbol RFCON3          = $203
Symbol RFCON4          = $204
Symbol RFCON5          = $205
Symbol RFCON6          = $206
Symbol RFCON7          = $207
Symbol RFCON8          = $208
Symbol SLPCAL1         = $209
Symbol SLPCAL2         = $20a
Symbol SLPCAL3         = $20b
Symbol SFCNTRH         = $20c ' Now reserved?
Symbol SFCNTRM         = $20d ' Now reserved?
Symbol SFCNTRL         = $20e ' Now reserved?
Symbol RFSTATE         = $20f
Symbol RSSI            = $210
Symbol SLPCON0         = $211
Symbol SRCADRMODE      = $212 ' Now reserved?
Symbol SRCADDR0        = $213 ' Now reserved?
Symbol SRCADDR1        = $214 ' Now reserved?
Symbol SRCADDR2        = $215 ' Now reserved?
Symbol SRCADDR3        = $216 ' Now reserved?
Symbol SRCADDR4        = $217 ' Now reserved?
Symbol SRCADDR5        = $218 ' Now reserved?
Symbol SRCADDR6        = $219 ' Now reserved?
Symbol SRCADDR7        = $21a ' Now reserved?
Symbol RXFRAMESTATE    = $21b ' Now reserved?
Symbol SECSTATUS       = $21c ' Now reserved?
Symbol STCCMP          = $21d ' Now reserved?
Symbol HLEN            = $21e ' Now reserved?
Symbol FLEN            = $21f ' Now reserved?
Symbol SLPCON1         = $220
Symbol WAKETIMEL       = $222
Symbol WAKETIMEH       = $223
Symbol REMCNTL         = $224
Symbol REMCNTH         = $225
Symbol MAINCNT0        = $226
Symbol MAINCNT1        = $227
Symbol MAINCNT2        = $228
Symbol MAINCNT3        = $229
Symbol RFMANUALCTRLEN  = $22a ' Now reserved?
Symbol RFMANUALCTRL    = $22b ' Now reserved?
'symbol RFRXCTRL    RFMANUALCTRL
Symbol TxDACMANUALCTRL = $22c ' Now reserved?
Symbol RFMANUALCTRL2   = $22d ' Now reserved?
Symbol TESTRSSI        = $22e ' Now reserved?
Symbol TESTMODE        = $22f
Symbol ASSOEADR0       = $230
Symbol ASSOEADR1       = $231
Symbol ASSOEADR2       = $232
Symbol ASSOEADR3       = $233
Symbol ASSOEADR4       = $234
Symbol ASSOEADR5       = $235
Symbol ASSOEADR6       = $236
Symbol ASSOEADR7       = $237
Symbol ASSOSADR0       = $238
Symbol ASSOSADR1       = $239
Symbol UPNONCE0        = $240
Symbol UPNONCE1        = $241
Symbol UPNONCE2        = $242
Symbol UPNONCE3        = $243
Symbol UPNONCE4        = $244
Symbol UPNONCE5        = $245
Symbol UPNONCE6        = $246
Symbol UPNONCE7        = $247
Symbol UPNONCE8        = $248
Symbol UPNONCE9        = $249
Symbol UPNONCE10       = $24A
Symbol UPNONCE11       = $24B
Symbol UPNONCE12       = $24C
'' Short Address Register definitions:
Symbol RXMCR    = $0
Symbol PANIDL   = $01
Symbol PANIDH   = $02
Symbol SADRL    = $03
Symbol SADRH    = $04
Symbol EADR0    = $05
Symbol EADR1    = $06
Symbol EADR2    = $07
Symbol EADR3    = $08
Symbol EADR4    = $09
Symbol EADR5    = $0A
Symbol EADR6    = $0B
Symbol EADR7    = $0C
Symbol RXFLUSH  = $0D
Symbol TXSTATE0 = $0E
Symbol TXSTATE1 = $0F
Symbol ORDER    = $10
Symbol TXMCR    = $11
Symbol ACKTMOUT = $12
Symbol ESLOTG1  = $13
Symbol SYMTICKL = $14
Symbol SYMTICKH = $15
Symbol PACON0   = $16
Symbol PACON1   = $17
Symbol PACON2   = $18
Symbol CSMACR   = $19
Symbol TXBCON0  = $1A
Symbol TXNCON   = $1B
Symbol TXG1CON  = $1C
Symbol TXG2CON  = $1D
Symbol ESLOTG23 = $1E
Symbol ESLOTG45 = $1F
Symbol ESLOTG67 = $20
Symbol TXPEND   = $21
Symbol WAKECON  = $22
Symbol FRMOFFSET = $23
Symbol TXSTAT   = $24
Symbol TXBCON1  = $25
Symbol GATECLK  = $26
Symbol TXTIME   = $27
Symbol HSYMTMRL = $28
Symbol HSYMTMRH = $29
Symbol SOFTRST  = $2A
Symbol BISTCR   = $2B
Symbol SECCON0  = $2C
Symbol SECCON1  = $2D
Symbol TXSTBL   = $2E
Symbol SECISR   = $2F
Symbol RXSR     = $30
Symbol INTSTAT  = $31
Symbol INTCONT  = $32
Symbol GPIO     = $33
Symbol TRISGPIO = $34
Symbol SLPACK   = $35
Symbol RFCTL    = $36
Symbol SECCR2   = $37
Symbol BBREG0   = $38
Symbol BBREG1   = $39
Symbol BBREG2   = $3A
Symbol BBREG3   = $3B
Symbol BBREG4   = $3C
Symbol BBREG5   = $3D
Symbol BBREG6   = $3E
Symbol CCAEDTH  = $3F
'' TXSTAT: TX MAC STATUS REGISTER (ADDRESS: 0x24)
'symbol TXNSTAT =     ' TX Normal FIFO Release Status bit
'symbol TXG1STAT:1;    ' TX GTS1 FIFO Release Status bit
'symbol TXG2STAT:1;    ' TX GTS2 FIFO Release Status bit
'symbol TXG1FNT:1;     ' TX GTS1 FIFO transmission failed (timeout
'symbol TXG2FNT:1;     ' TX GTS2 FIFO transmission failed (timeout
'symbol CCAFAIL:1;     ' Clear Channel Assessment Status of last transmit
'symbol TXNRETRY:2;    ' TX Normal FIFO Retry Times
'' INTSTAT: INTERRUPT STATUS REGISTER (ADDRESS: 0x31
'symbol TXNIF = ISRSTS.0      ' TX Normal FIFO Release Interrupt bit
'symbol TXG1IF = ISRSTS.1    ' TX GTS1 FIFO Transmission Interrupt bit
'symbol TXG2IF = ISRSTS.2     ' TX GTS2 FIFO Transmission Interrupt bit
'symbol RXIF = ISRSTS.3       ' RX FIFO Reception Interrupt bit
'symbol SECIF = ISRSTS.4    ' Security Key Request Interrupt bit
'symbol HSYMTMRIF = ISRSTS.5  ' Half Symbol Timer Interrupt bit
'symbol WAKEIF = ISRSTS.6    ' Wake-up Alert Interrupt bit
'symbol SLPIF = ISRSTS.7     ' Sleep Alert Interrupt bit
'' INTCON: INTERRUPT CONTROL REGISTER (ADDRESS: 0x32
'symbol TXNIE:1;     ' TX Normal FIFO Transmission Interrupt Enable bit
'symbol TXG1IE:1;    ' TX GTS1 FIFO Transmission Interrupt Enable bit
'symbol TXG2IE:1;    ' TX GTS2 FIFO Transmission Interrupt Enable bit
'symbol RXIE:1;      ' RX FIFO Reception Interrupt Enable bit
'symbol SECIE:1;     ' Security Key Request Interrupt Enable bit
'symbol HSYMTMRIE:1; ' Half Symbol Timer Interrupt Enable bit
'symbol WAKEIE:1;    ' Wake-up Alert Interrupt Enable bit
'symbol SLPIE:1;     ' Sleep Alert Interrupt Enable bit
Have fun with it
Normnet
- 7th June 2013, 13:30
scumari
Thanks for the MRF24J40MA code.
Tip: Select the code and press the quote button in the editor to display in a compact format.
My code
Norm
Demon
- 7th June 2013, 15:36
Thanks for sharing!
Robert
 
Powered by vBulletin® Version 4.1.7 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.