# pic16f877, picbasicpro, mirfV2, can someone proof my code?

**URL:** <https://community.sparkfun.com/t/pic16f877-picbasicpro-mirfv2-can-someone-proof-my-code/6969>\
**Category:** Wireless & IoT\
**Created:** [April 7, 2008, 3:24pm UTC](https://community.sparkfun.com/t/pic16f877-picbasicpro-mirfv2-can-someone-proof-my-code/6969 "2008-04-07T15:24:08Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![hgoodric](https://avatars.discourse-cdn.com/v4/letter/h/ccd318/32.png) [@hgoodric](https://community.sparkfun.com/u/hgoodric)\
**Post date:** [April 7, 2008, 3:24pm UTC](https://community.sparkfun.com/t/pic16f877-picbasicpro-mirfv2-can-someone-proof-my-code/6969/1 "2008-04-07T15:24:08Z")

</div>

Ok, I have done my homework. This is my"I’m Learning" setup, of which when I get it working, I will be able transmute the code into a bigger system I am working on. I have a sender pic16f877 with a switch for sending a single payload to a pic16f877 receiver. I have the SPI code working where I know that the pics are talking to the MirfV2’s. I have verified this with my HobbyLAB PC Oscillo/Logic anaylizer. My goal is real simple in this code: send 5 bytes and receive 5 bytes. I have been working on this since january…had to teach myself SPI…and doing it on about 5-10 hrs/week. Been through much frustration and success (with SPI), but I am sure that all i need is a few tweeks for probably obvious reasons.

ANY HELP!! would be much appreciated!!

THnx in Advance

Harold G. :?:

Here’s the code:

SENDER:

'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

'\* Name : MirfTransT2.BAS \*

'\* Author : Harold Goodrich \*

'\* Notice : Copyright (c) 2008 Harold Goodrich \*

'\* : All Rights Reserved \*

'\* Date : 4/2/2008 \*

'\* Version : 1.0 \*

'\* Notes : \*

'\* : \*

'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

define OSC 10

INCLUDE “modedefs.bas”

spin VAR PORTD.6

LED VAR PORTD.2

LED1 VAR PORTD.3

TRISD.2=0

TRISD.3=0

TRISD.6=0

low LED

low LED1

i VAR BYTE 'loop counter

ThisReg var byte

ThisCmd var byte

Temp var byte

RecData var byte[4]

SendData var byte[4]

'Mirf Config

REG\_CONFIG var byte

REG\_CONFIG=%00000000

PRIM\_RX var REG\_CONFIG.0

PWR\_UP var REG\_CONFIG.1

CRC0 var REG\_CONFIG.2

EN\_CRC var REG\_CONFIG.3

R\_REG\_CONFIG con %00000000

W\_REG\_CONFIG con %00100000

REG\_EN\_AA var byte

REG\_EN\_AA = %0011111

ENAA\_P5 var REG\_EN\_AA.5

ENAA\_P4 var REG\_EN\_AA.4

ENAA\_P3 var REG\_EN\_AA.3

ENAA\_P2 var REG\_EN\_AA.2

ENAA\_P1 var REG\_EN\_AA.1

ENAA\_P0 var REG\_EN\_AA.0

R\_REG\_EN\_AA con %00000001

W\_REG\_EN\_AA con %00100001

REG\_EN\_RXADDR var byte

REG\_EN\_RXADDR=%0000000

ERX\_P5 var REG\_EN\_RXADDR.5

ERX\_P4 var REG\_EN\_RXADDR.4

ERX\_P3 var REG\_EN\_RXADDR.3

ERX\_P2 var REG\_EN\_RXADDR.2

ERX\_P1 var REG\_EN\_RXADDR.1

ERX\_P0 var REG\_EN\_RXADDR.0

R\_REG\_EN\_RXADDR con %00000010

W\_REG\_EN\_RXADDR con %00100010

REG\_SETUP\_AW var byte

REG\_SETUP\_AW=%00000011

R\_REG\_SETUP\_AW con %00000011

W\_REG\_SETUP\_AW con %00100011

REG\_SETUP\_RETR var byte

REG\_SETUP\_RETR=%00000011

'ARD: 7:4 250Us each increment

'This is the time the PTX is waiting for an ACK packet before a retransmit is made. The PTX is in RX mode

'for a minimum of 250?S, but it stays in RX mode to the end of the packet if that is longer than 250?S. Then

'it goes to standby-I mode for the rest of the specified ARD. After the ARD it goes to TX mode and then

'retransmits the packet.

'ARC 3:0 retry count 0 to 15, 0 is disabled

R\_REG\_SETUP\_RETR con %00000100

W\_REG\_SETUP\_RETR con %00100100

RF\_CH var byte

RF\_CH=%00000010

R\_REG\_RF\_CH con %00000101

W\_REG\_RF\_CH con %00100101

REG\_RF\_SETUP var byte

REG\_RF\_SETUP=%00001111

LNA\_HCURR var REG\_RF\_SETUP.0 'gain

'RF\_PWR 2:1, 11=0db, 10:-6db, 01:-12db, 00:-18db

R\_REG\_RF\_SETUP con %00000110

W\_REG\_RF\_SETUP con %00100110

REG\_STATUS var byte

REG\_STATUS=%00001100

RX\_DR var REG\_STATUS.6

'The RX\_DR IRQ is asserted by a new packet arrival event. The procedure for handling this interrupt

'should be: 1) read payload through SPI, 2) clear RX\_DR IRQ, 3) read FIFO\_STATUS to check if there

'are more payloads available in RX FIFO, 4) if there are more data in RX FIFO, repeat from 1)

TX\_DS VAR REG\_STATUS.5

MAX\_RT var REG\_STATUS.4

'RX\_P\_NO is bits 3:1 000-101 DataPipe#, 110=not used, 111=FIFO empty

TX\_FULL var REG\_STATUS.0

R\_REG\_STATUS con %00000110

W\_REG\_STATUS con %00100110

'TX\_ADDR 39:0

TX\_ADDR VAR byte[5]

R\_TX\_ADDR con %00010000

W\_TX\_ADDR con %00110000

'RX\_ADDR\_P0 39:0

RX\_ADDR\_P0 VAR byte[5]

R\_RX\_ADDR\_P0 con %00001010

W\_RX\_ADDR\_P0 con %00101010

'RX\_ADDR\_P1 39:0

RX\_ADDR\_P1 VAR byte[5]

R\_RX\_ADDR\_P1 con %00001011

W\_RX\_ADDR\_P1 con %00101011

RX\_ADDR\_P2 var byte

RX\_ADDR\_P2=%00000000

R\_RX\_ADDR\_P2 con %00001100

W\_RX\_ADDR\_P2 con %00101100

RX\_ADDR\_P3 var byte

RX\_ADDR\_P3=%00000000

R\_RX\_ADDR\_P3 con %00001101

W\_RX\_ADDR\_P3 con %00101101

RX\_ADDR\_P4 var byte

RX\_ADDR\_P4=%00000000

R\_RX\_ADDR\_P4 con %00001110

W\_RX\_ADDR\_P4 con %00101110

RX\_ADDR\_P5 var byte

RX\_ADDR\_P5=%00000000

R\_RX\_ADDR\_P5 con %00001111

W\_RX\_ADDR\_P5 con %00101111

RX\_PW\_P0 var byte '5:0 is #bytes in payload, 1 to 32 bytes

RX\_PW\_P0=%00000000

R\_RX\_PW\_P0 con %00010001

W\_RX\_PW\_P0 con %00110001

RX\_PW\_P1 var byte '5:0 is #bytes in payload, 1 to 32 bytes

RX\_PW\_P1=%00000000

R\_RX\_PW\_P1 con %00010010

W\_RX\_PW\_P1 con %00110010

RX\_PW\_P2 var byte '5:0 is #bytes in payload, 1 to 32 bytes

RX\_PW\_P2=%00000000

R\_RX\_PW\_P2 con %00010011

W\_RX\_PW\_P2 con %00110011

RX\_PW\_P3 var byte '5:0 is #bytes in payload, 1 to 32 bytes

RX\_PW\_P3=%00000000

R\_RX\_PW\_P3 con %00010100

W\_RX\_PW\_P3 con %00110100

RX\_PW\_P4 var byte '5:0 is #bytes in payload, 1 to 32 bytes

RX\_PW\_P4=%00000000

R\_RX\_PW\_P4 con %00010101

W\_RX\_PW\_P4 con %00110101

RX\_PW\_P5 var byte '5:0 is #bytes in payload, 1 to 32 bytes

RX\_PW\_P5=%00000000

R\_RX\_PW\_P5 con %00010110

W\_RX\_PW\_P5 con %00110110

REG\_FIFO\_STATUS var byte

REG\_FIFO\_STATUS=%00000000

TX\_REUSE var REG\_FIFO\_STATUS.6

FIFO\_TX\_FULL var REG\_FIFO\_STATUS.5

FIFO\_TX\_EMPTY var REG\_FIFO\_STATUS.4

RX\_FULL var REG\_FIFO\_STATUS.1

RX\_EMPTY var REG\_FIFO\_STATUS.0

R\_REG\_FIFO\_STATUS con %00010111

W\_REG\_FIFO\_STATUS con %00110111

DYNPD var byte

DYNPD = %00000000

DPL\_P0 var DYNPD.0

DPL\_P1 var DYNPD.1

DPL\_P2 var DYNPD.2

DPL\_P3 var DYNPD.3

DPL\_P4 var DYNPD.4

DPL\_P5 var DYNPD.5

R\_DYNPD con %00011100

W\_DYNPD con %00111100

FEATURE var byte

'To activate this feature use the ACTIVATE SPI command followed by data 0x73.(1110011) The corresponding bits

'in the FEATURE register must be set.

FEATURE = %00000000

EN\_DYN\_ACK var FEATURE.0

EN\_ACK\_PAY var FEATURE.1

'If ACK packet payload is activated, ACK packets have dynamic payload lengths and the Dynamic Payload

'Length feature should be enabled for pipe 0 on the PTX and PRX. This is to ensure that they receive

'the ACK packets with payloads. If the payload in ACK is more than 15 byte in 2Mbps mode the ARD must

'be 500?S or more, and if the payload is more than 5byte in 1Mbps mode the ARD must be 500?S or more.

EN\_DPL var FEATURE.2

R\_FEATURE con %00011101

W\_FEATURE con %00111101

R\_RX\_PAYLOAD con %01100001

W\_TX\_PAYLOAD con %10100000

FLUSH\_TX con %11100001

FLUSH\_RX con %11100010

ACTIVATE CON %01010000

R\_RX\_PL\_WID con %01100000

W\_ACK\_PL\_P0 con %10101000

W\_ACK\_PL\_P1 con %10101001

W\_ACK\_PL\_P2 con %10101010

W\_ACK\_PL\_P3 con %10101011

W\_ACK\_PL\_P4 con %10101100

W\_ACK\_PL\_P5 con %10101101

W\_TX\_PL\_NO\_ACK con %10110000

NOP con %11111111

CE var PORTC.0

CSN var PORTC.1

IRQ var PORTB.4

TRISB.4=1

high CSN

low CE

'SPI Config

TRISC=%00010000

SSPEN VAR SSPCON.5 'SSP Enable bit

CKP VAR SSPCON.4 'Clock Polarity Select

SMP VAR SSPSTAT.7 'Data input sample phase

CKE VAR SSPSTAT.6 'Clock Edge Select bit

SSPIF VAR PIR1.3 'SPI interrupt flag

BF var SSPSTAT.0 'Buffer Full

SSPCON.0=0

SSPCON.1=1

SSPCON.2=0

SSPCON.3=0

SSPEN = 1 'enable SPI pins

CKP = 0 'clock idle low

CKE = 0 'transmit on idle to active transition

SSPIF = 0 'clear buffer full status

SMP = 0 'sample in middle of data

'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

Bttn VAR PORTD.0

TRISD.0=1

TxSent var bit

TxSent=0

WaitForMirf:

High LED

if IRQ=0 then WaitForMirf

pause 500

Low LED

PRIM\_RX=1

gosub SetUPMirfV2

SendData[0]=“A”

SendData[1]=“B”

SendData[2]=“C”

SendData[3]=“D”

SendData[4]=“E”

loop:

if Bttn=1 then

gosub SendTXPayload

TxSent=1

endif

if TxSent=1 then

pause 1000

TxSent=0

endif

goto loop

end

GetIncoming:

high LED

if SSPIF=0 then GetIncoming

if BF=0 then GetIncoming

PauseUs 25 '25uS fudge factor

Temp=SSPBUF

SSPIF=0

Low LED

return

SetForRXTXNoSB:

'PRIM\_RX=1 or PRIM\_RX=0 set before sub called

pauseus 10

if PRIM\_RX=1 then

'CE for RX mode

high CE

else

'CE for TX Mode

low CE

endif

return

GetRegister:

low CSN

pauseus 10

SSPBUF=ThisCmd

gosub GetIncoming

pauseus 10

SSPBUF=NOP

gosub GetIncoming

ThisReg=Temp

High CSN

return

SetGetReg:

low CSN

pauseus 10

SSPBUF=ThisCmd

gosub GetIncoming

pauseus 10

SSPBUF=ThisReg

gosub GetIncoming

High CSN

return

Set5byteAddress:

LOW CSN

pauseus 10

SSPBUF=W\_TX\_ADDR

gosub GetIncoming

for i = 0 to REG\_SETUP\_AW

SSPBUF=TX\_ADDR

- gosub GetIncoming\*  
_next_  
_HIGH CSN_  
_pauseus 10_  
_LOW CSN_  
_for i = 0 to REG\_SETUP\_AW_
- SSPBUF=RX\_ADDR\_P0_\*  
 \* gosub GetIncoming\*  
 next  
 HIGH CSN  
 return  
 CheckIRQLED:  
 if IRQ =0 then  
 low LED1  
 SerOut spin,N2400,[“I”,10,13]  
 else  
 high LED1  
 endif  
 SendTXPayload:  
 high led  
 low CSN  
 pauseus 10  
 SSPBUF=W\_TX\_Payload  
 Gosub GetIncoming  
 for i = 0 to 4  
 \* SSPBUF=SendData\*  
 \* Gosub GetIncoming\*  
 next  
 high CE  
 pauseus 20  
 low CE  
 pauseus 20  
 high CSN  
 low led  
 return  
 ReadRXPayload:  
 low CE  
 low CSN  
 SSPBUF=R\_RX\_Payload  
 Gosub GetIncoming  
 for i = 0 to 4  
 \* SSPBUF=NOP\*  
 \* Gosub GetIncoming\*  
 \_ RecData=Temp  
 SerOut spin,N2400,[“R”,#RecData\*,“D”,10,13] \*  
 next  
 high CSN  
 RX\_DR=1  
 ThisCmd=W\_REG\_STATUS  
 ThisReg=REG\_STATUS  
 gosub SetGetReg  
 high CE  
 return  
 SetUPMirfV2:  
 REG\_SETUP\_AW=5  
 ThisCmd=W\_REG\_SETUP\_AW  
 ThisReg=REG\_SETUP\_AW  
 gosub SetGetReg  
 TX\_ADDR[0]=%01001001  
 TX\_ADDR[1]=%10001101  
 TX\_ADDR[2]=%00111001  
 TX\_ADDR[3]=%11001101  
 TX\_ADDR[4]=%01101100  
 RX\_ADDR\_P0=TX\_ADDR  
 gosub Set5byteAddress  
 ENAA\_P0=1  
 ThisCmd=W\_REG\_EN\_AA  
 ThisReg=REG\_EN\_AA  
 gosub SetGetReg  
 ERX\_P0=1  
 ThisCmd=W\_REG\_EN\_RXADDR  
 ThisReg=REG\_EN\_RXADDR  
 gosub SetGetReg  
 REG\_SETUP\_RETR=%00011010  
 '500µs + 86µs, 10 retrans  
 ThisCmd=W\_REG\_SETUP\_RETR  
 ThisReg=REG\_SETUP\_RETR  
 gosub SetGetReg  
 RF\_CH=40  
 ThisCmd=W\_REG\_RF\_CH  
 ThisReg=RF\_CH  
 gosub SetGetReg  
 REG\_RF\_SETUP=%00001111  
 'TX\_PWR:0dBm, Datarate:2Mbps, LNA:HCURR  
 ThisCmd=W\_REG\_RF\_SETUP  
 ThisReg=REG\_RF\_SETUP  
 gosub SetGetReg  
 'PRIM\_RX=1 or PRIM\_RX=0 set before sub called  
 PWR\_UP=1  
 CRC0=1  
 EN\_CRC=1  
 ThisCmd=W\_REG\_CONFIG  
 ThisReg=REG\_CONFIG  
 gosub SetGetReg  
 pause 2  
 return  
 RECEIVER:  
 '  
 **’ Name : MirfRecT2.BAS   
 ’ Author : Harold Goodrich   
 ’ Notice : Copyright (c) 2008 Harold Goodrich   
 ’ : All Rights Reserved   
 ’ Date : 4/2/2008   
 ’ Version : 1.0   
 ’ Notes :   
 ’ :   
 '**  
 define OSC 10  
 INCLUDE “modedefs.bas”  
 spin VAR PORTD.6  
 LED VAR PORTD.2  
 LED1 VAR PORTD.3  
 TRISD.2=0  
 TRISD.3=0  
 TRISD.6=0  
 low LED  
 low LED1  
 i VAR BYTE 'loop counter  
 ThisReg var byte  
 ThisCmd var byte  
 Temp var byte  
 RecData var byte[4]  
 SendData var byte[4]  
 'Mirf Config  
 REG\_CONFIG var byte  
 REG\_CONFIG=%00000000  
 PRIM\_RX var REG\_CONFIG.0  
 PWR\_UP var REG\_CONFIG.1  
 CRC0 var REG\_CONFIG.2  
 EN\_CRC var REG\_CONFIG.3  
 R\_REG\_CONFIG con %00000000  
 W\_REG\_CONFIG con %00100000  
 REG\_EN\_AA var byte  
 REG\_EN\_AA = %0011111  
 ENAA\_P5 var REG\_EN\_AA.5  
 ENAA\_P4 var REG\_EN\_AA.4  
 ENAA\_P3 var REG\_EN\_AA.3  
 ENAA\_P2 var REG\_EN\_AA.2  
 ENAA\_P1 var REG\_EN\_AA.1  
 ENAA\_P0 var REG\_EN\_AA.0  
 R\_REG\_EN\_AA con %00000001  
 W\_REG\_EN\_AA con %00100001  
 REG\_EN\_RXADDR var byte  
 REG\_EN\_RXADDR=%0000000  
 ERX\_P5 var REG\_EN\_RXADDR.5  
 ERX\_P4 var REG\_EN\_RXADDR.4  
 ERX\_P3 var REG\_EN\_RXADDR.3  
 ERX\_P2 var REG\_EN\_RXADDR.2  
 ERX\_P1 var REG\_EN\_RXADDR.1  
 ERX\_P0 var REG\_EN\_RXADDR.0  
 R\_REG\_EN\_RXADDR con %00000010  
 W\_REG\_EN\_RXADDR con %00100010  
 REG\_SETUP\_AW var byte  
 REG\_SETUP\_AW=%00000011  
 R\_REG\_SETUP\_AW con %00000011  
 W\_REG\_SETUP\_AW con %00100011  
 REG\_SETUP\_RETR var byte  
 REG\_SETUP\_RETR=%00000011  
 'ARD: 7:4 250Us each increment  
 'This is the time the PTX is waiting for an ACK packet before a retransmit is made. The PTX is in RX mode  
 'for a minimum of 250?S, but it stays in RX mode to the end of the packet if that is longer than 250?S. Then  
 'it goes to standby-I mode for the rest of the specified ARD. After the ARD it goes to TX mode and then  
 'retransmits the packet.  
 'ARC 3:0 retry count 0 to 15, 0 is disabled  
 R\_REG\_SETUP\_RETR con %00000100  
 W\_REG\_SETUP\_RETR con %00100100  
 RF\_CH var byte  
 RF\_CH=%00000010  
 R\_REG\_RF\_CH con %00000101  
 W\_REG\_RF\_CH con %00100101  
 REG\_RF\_SETUP var byte  
 REG\_RF\_SETUP=%00001111  
 LNA\_HCURR var REG\_RF\_SETUP.0 'gain  
 'RF\_PWR 2:1, 11=0db, 10:-6db, 01:-12db, 00:-18db  
 R\_REG\_RF\_SETUP con %00000110  
 W\_REG\_RF\_SETUP con %00100110  
 REG\_STATUS var byte  
 REG\_STATUS=%00001100  
 RX\_DR var REG\_STATUS.6  
 'The RX\_DR IRQ is asserted by a new packet arrival event. The procedure for handling this interrupt  
 'should be: 1) read payload through SPI, 2) clear RX\_DR IRQ, 3) read FIFO\_STATUS to check if there  
 'are more payloads available in RX FIFO, 4) if there are more data in RX FIFO, repeat from 1)  
 TX\_DS VAR REG\_STATUS.5  
 MAX\_RT var REG\_STATUS.4  
 'RX\_P\_NO is bits 3:1 000-101 DataPipe#, 110=not used, 111=FIFO empty  
 TX\_FULL var REG\_STATUS.0  
 R\_REG\_STATUS con %00000110  
 W\_REG\_STATUS con %00100110  
 'TX\_ADDR 39:0  
 TX\_ADDR VAR byte[5]  
 R\_TX\_ADDR con %00010000  
 W\_TX\_ADDR con %00110000  
 'RX\_ADDR\_P0 39:0  
 RX\_ADDR\_P0 VAR byte[5]  
 R\_RX\_ADDR\_P0 con %00001010  
 W\_RX\_ADDR\_P0 con %00101010  
 'RX\_ADDR\_P1 39:0  
 RX\_ADDR\_P1 VAR byte[5]  
 R\_RX\_ADDR\_P1 con %00001011  
 W\_RX\_ADDR\_P1 con %00101011  
 RX\_ADDR\_P2 var byte  
 RX\_ADDR\_P2=%00000000  
 R\_RX\_ADDR\_P2 con %00001100  
 W\_RX\_ADDR\_P2 con %00101100  
 RX\_ADDR\_P3 var byte  
 RX\_ADDR\_P3=%00000000  
 R\_RX\_ADDR\_P3 con %00001101  
 W\_RX\_ADDR\_P3 con %00101101  
 RX\_ADDR\_P4 var byte  
 RX\_ADDR\_P4=%00000000  
 R\_RX\_ADDR\_P4 con %00001110  
 W\_RX\_ADDR\_P4 con %00101110  
 RX\_ADDR\_P5 var byte  
 RX\_ADDR\_P5=%00000000  
 R\_RX\_ADDR\_P5 con %00001111  
 W\_RX\_ADDR\_P5 con %00101111  
 RX\_PW\_P0 var byte '5:0 is #bytes in payload, 1 to 32 bytes  
 RX\_PW\_P0=%00000000  
 R\_RX\_PW\_P0 con %00010001  
 W\_RX\_PW\_P0 con %00110001  
 RX\_PW\_P1 var byte '5:0 is #bytes in payload, 1 to 32 bytes  
 RX\_PW\_P1=%00000000  
 R\_RX\_PW\_P1 con %00010010  
 W\_RX\_PW\_P1 con %00110010  
 RX\_PW\_P2 var byte '5:0 is #bytes in payload, 1 to 32 bytes  
 RX\_PW\_P2=%00000000  
 R\_RX\_PW\_P2 con %00010011  
 W\_RX\_PW\_P2 con %00110011  
 RX\_PW\_P3 var byte '5:0 is #bytes in payload, 1 to 32 bytes  
 RX\_PW\_P3=%00000000  
 R\_RX\_PW\_P3 con %00010100  
 W\_RX\_PW\_P3 con %00110100  
 RX\_PW\_P4 var byte '5:0 is #bytes in payload, 1 to 32 bytes  
 RX\_PW\_P4=%00000000  
 R\_RX\_PW\_P4 con %00010101  
 W\_RX\_PW\_P4 con %00110101  
 RX\_PW\_P5 var byte '5:0 is #bytes in payload, 1 to 32 bytes  
 RX\_PW\_P5=%00000000  
 R\_RX\_PW\_P5 con %00010110  
 W\_RX\_PW\_P5 con %00110110  
 REG\_FIFO\_STATUS var byte  
 REG\_FIFO\_STATUS=%00000000  
 TX\_REUSE var REG\_FIFO\_STATUS.6  
 FIFO\_TX\_FULL var REG\_FIFO\_STATUS.5  
 FIFO\_TX\_EMPTY var REG\_FIFO\_STATUS.4  
 RX\_FULL var REG\_FIFO\_STATUS.1  
 RX\_EMPTY var REG\_FIFO\_STATUS.0  
 R\_REG\_FIFO\_STATUS con %00010111  
 W\_REG\_FIFO\_STATUS con %00110111  
 DYNPD var byte  
 DYNPD = %00000000  
 DPL\_P0 var DYNPD.0  
 DPL\_P1 var DYNPD.1  
 DPL\_P2 var DYNPD.2  
 DPL\_P3 var DYNPD.3  
 DPL\_P4 var DYNPD.4  
 DPL\_P5 var DYNPD.5  
 R\_DYNPD con %00011100  
 W\_DYNPD con %00111100  
 FEATURE var byte  
 'To activate this feature use the ACTIVATE SPI command followed by data 0x73.(1110011) The corresponding bits  
 'in the FEATURE register must be set.  
 FEATURE = %00000000  
 EN\_DYN\_ACK var FEATURE.0  
 EN\_ACK\_PAY var FEATURE.1  
 'If ACK packet payload is activated, ACK packets have dynamic payload lengths and the Dynamic Payload  
 'Length feature should be enabled for pipe 0 on the PTX and PRX. This is to ensure that they receive  
 'the ACK packets with payloads. If the payload in ACK is more than 15 byte in 2Mbps mode the ARD must  
 'be 500?S or more, and if the payload is more than 5byte in 1Mbps mode the ARD must be 500?S or more.  
 EN\_DPL var FEATURE.2  
 R\_FEATURE con %00011101  
 W\_FEATURE con %00111101  
 R\_RX\_PAYLOAD con %01100001  
 W\_TX\_PAYLOAD con %10100000  
 FLUSH\_TX con %11100001  
 FLUSH\_RX con %11100010  
 ACTIVATE CON %01010000  
 R\_RX\_PL\_WID con %01100000  
 W\_ACK\_PL\_P0 con %10101000  
 W\_ACK\_PL\_P1 con %10101001  
 W\_ACK\_PL\_P2 con %10101010  
 W\_ACK\_PL\_P3 con %10101011  
 W\_ACK\_PL\_P4 con %10101100  
 W\_ACK\_PL\_P5 con %10101101  
 W\_TX\_PL\_NO\_ACK con %10110000  
 NOP con %11111111  
 CE var PORTC.0  
 CSN var PORTC.1  
 IRQ var PORTB.4  
 TRISB.4=1  
 high CSN  
 low CE  
 'SPI Config  
 TRISC=%00010000  
 SSPEN VAR SSPCON.5 'SSP Enable bit  
 CKP VAR SSPCON.4 'Clock Polarity Select  
 SMP VAR SSPSTAT.7 'Data input sample phase  
 CKE VAR SSPSTAT.6 'Clock Edge Select bit  
 SSPIF VAR PIR1.3 'SPI interrupt flag  
 BF var SSPSTAT.0 'Buffer Full  
 SSPCON.0=0  
 SSPCON.1=1  
 SSPCON.2=0  
 SSPCON.3=0  
 SSPEN = 1 'enable SPI pins  
 CKP = 0 'clock idle low  
 CKE = 0 'transmit on idle to active transition  
 SSPIF = 0 'clear buffer full status  
 SMP = 0 'sample in middle of data  
 'Bttn VAR PORTD.0  
 'TRISD.0=1  
 High LED  
 WaitForMirf:  
 if IRQ=0 then WaitForMirf  
 pause 500  
 Low LED  
 PRIM\_RX=0  
 gosub SetUPMirfV2  
 loop:  
 if IRQ=1 then  
 ThisCmd=R\_REG\_STATUS  
 ThisReg=NOP  
 gosub SetGetReg  
 REG\_STATUS=Temp  
 if RX\_DR=1 then  
 high LED  
 gosub ReadRXPayload  
 low LED  
 endif  
 endif  
 goto loop  
 end  
 GetIncoming:  
 high LED  
 if SSPIF=0 then GetIncoming  
 if BF=0 then GetIncoming  
 PauseUs 25 '25uS fudge factor  
 Temp=SSPBUF  
 SSPIF=0  
 Low LED  
 return  
 SetForRXTXNoSB:  
 'PRIM\_RX=1 or PRIM\_RX=0 set before sub called  
 pauseus 10  
 if PRIM\_RX=1 then  
 'CE for RX mode  
 high CE  
 else  
 'CE for TX Mode  
 low CE  
 endif  
 return  
 GetRegister:  
 low CSN  
 pauseus 10  
 SSPBUF=ThisCmd  
 gosub GetIncoming  
 pauseus 10  
 SSPBUF=NOP  
 gosub GetIncoming  
 ThisReg=Temp  
 High CSN  
 return  
 SetGetReg:  
 low CSN  
 pauseus 10  
 SSPBUF=ThisCmd  
 gosub GetIncoming  
 pauseus 10  
 SSPBUF=ThisReg  
 gosub GetIncoming  
 High CSN  
 return  
 Set5byteAddress:  
 LOW CSN  
 pauseus 10  
 SSPBUF=W\_TX\_ADDR  
 gosub GetIncoming  
 for i = 0 to REG\_SETUP\_AW  
 \* SSPBUF=TX\_ADDR\*  
 \* gosub GetIncoming\*  
 next  
 HIGH CSN  
 pauseus 10  
 LOW CSN  
 for i = 0 to REG\_SETUP\_AW  
 \* SSPBUF=RX\_ADDR\_P0\*  
 \* gosub GetIncoming\*  
 next  
 HIGH CSN  
 return  
 CheckIRQLED:  
 if IRQ =0 then  
 low LED1  
 SerOut spin,N2400,[“I”,10,13]  
 else  
 high LED1  
 endif  
 SendTXPayload:  
 high led  
 low CSN  
 pauseus 10  
 SSPBUF=W\_TX\_Payload  
 Gosub GetIncoming  
 for i = 0 to 4  
 \* SSPBUF=SendData  
  Gosub GetIncoming\*  
 next  
 high CE  
 pauseus 20  
 low CE  
 pauseus 20  
 high CSN  
 low led  
 return  
 ReadRXPayload:  
 low CE  
 low CSN  
 SSPBUF=R\_RX\_Payload  
 Gosub GetIncoming  
 for i = 0 to 4  
 \* SSPBUF=NOP\*  
 \* Gosub GetIncoming\*  
  RecData=Temp  
 SerOut spin,N2400,[“R”,#RecData\*,“D”,10,13] \*  
 next  
 high CSN  
 RX\_DR=1  
 ThisCmd=W\_REG\_STATUS  
 ThisReg=REG\_STATUS  
 gosub SetGetReg  
 high CE  
 return  
 SetUPMirfV2:  
 REG\_SETUP\_AW=5  
 ThisCmd=W\_REG\_SETUP\_AW  
 ThisReg=REG\_SETUP\_AW  
 gosub SetGetReg  
 TX\_ADDR[0]=%01001001  
 TX\_ADDR[1]=%10001101  
 TX\_ADDR[2]=%00111001  
 TX\_ADDR[3]=%11001101  
 TX\_ADDR[4]=%01101100  
 RX\_ADDR\_P0=TX\_ADDR  
 gosub Set5byteAddress  
 ENAA\_P0=1  
 ThisCmd=W\_REG\_EN\_AA  
 ThisReg=REG\_EN\_AA  
 gosub SetGetReg  
 ERX\_P0=1  
 ThisCmd=W\_REG\_EN\_RXADDR  
 ThisReg=REG\_EN\_RXADDR  
 gosub SetGetReg  
 REG\_SETUP\_RETR=%00011010  
 '500µs + 86µs, 10 retrans  
 ThisCmd=W\_REG\_SETUP\_RETR  
 ThisReg=REG\_SETUP\_RETR  
 gosub SetGetReg  
 RF\_CH=40  
 ThisCmd=W\_REG\_RF\_CH  
 ThisReg=RF\_CH  
 gosub SetGetReg  
 REG\_RF\_SETUP=%00001111  
 'TX\_PWR:0dBm, Datarate:2Mbps, LNA:HCURR  
 ThisCmd=W\_REG\_RF\_SETUP  
 ThisReg=REG\_RF\_SETUP  
 gosub SetGetReg  
 'PRIM\_RX=1 or PRIM\_RX=0 set before sub called  
 PWR\_UP=1  
 CRC0=1  
 EN\_CRC=1  
 ThisCmd=W\_REG\_CONFIG  
 ThisReg=REG\_CONFIG  
 gosub SetGetReg  
 pause 2  
 return __\__

---

<div class="post-metadata">

**Author:** ![hgoodric](https://avatars.discourse-cdn.com/v4/letter/h/ccd318/32.png) [@hgoodric](https://community.sparkfun.com/u/hgoodric)\
**Post date:** [April 8, 2008, 12:35pm UTC](https://community.sparkfun.com/t/pic16f877-picbasicpro-mirfv2-can-someone-proof-my-code/6969/2 "2008-04-08T12:35:14Z")

</div>

in the receiver code i found one code error…in the main loop when I am checking the IRQ pin: if “IRQ=1 then” should be “if IRQ=0 then”.

However the setup is still not working.

do I need pauses at certain places?

Basically the code before and after the main loop are constant/variable setups and subroutines respectively, and are the same for both files. (I had them in a library, but PBP didnt like it…something Ill work out later).

I modeled the setup of sender and receiver after the C example of setup in nordic’s documentation. I chose a different address, but otherwise I think my PBP setup is the same…and I have been pouring through the tutorials from [www.diyembedded.com](http://www.diyembedded.com). (over and over again) and i think Im close, but I have something wrong with setup.

The setup from nordic documentation is (here is receiver only):

void RX\_Mode(void)

{

SPI\_Write\_Buf(WRITE\_REG + RX\_ADDR\_P0, TX\_ADDRESS, TX\_ADR\_LENGTH);

// Use the same address on the RX device as the TX device

SPI\_RW\_Reg(WRITE\_REG + EN\_AA, 0x01);

// Enable Auto.Ack:Pipe0

SPI\_RW\_Reg(WRITE\_REG + EN\_RXADDR, 0x01);

// Enable Pipe0

SPI\_RW\_Reg(WRITE\_REG + RF\_CH, 40);

// Select RF channel 40

SPI\_RW\_Reg(WRITE\_REG + RX\_PW\_P0, TX\_PLOAD\_WIDTH);

// Select same RX payload width as TX Payload width

SPI\_RW\_Reg(WRITE\_REG + RF\_SETUP, 0x0f);

// TX\_PWR:0dBm, Datarate:2Mbps, LNA:HCURR

SPI\_RW\_Reg(WRITE\_REG + CONFIG, 0x0f);

// Set PWR\_UP bit, enable CRC(2 bytes) & Prim:RX. RX\_DR enabled

// Add a delay of 1.5ms before setting CE high if the device was in power down mode.

CE = 1; // Set CE pin high to enable RX device

// This device is now ready to receive one packet of 16 bytes payload from a TX device sending to address

// ‘3443101001’, with auto acknowledgment, retransmit count of 10, RF channel 40 and datarate = 2Mbps.

}

I would like to get my code working so I can continue work on my project…and also because of the lack of Pic Basic Pro code out there for the Nrf24L01, i would like to share the code with othe PBP developers. I am learning java right now at work and I know I will be able to use that to move to C, but i’m not there yet…and I need to finish my project up before june.

Please. please help if you can.

---

<div class="post-metadata">

**Author:** ![hgoodric](https://avatars.discourse-cdn.com/v4/letter/h/ccd318/32.png) [@hgoodric](https://community.sparkfun.com/u/hgoodric)\
**Post date:** [April 8, 2008, 12:53pm UTC](https://community.sparkfun.com/t/pic16f877-picbasicpro-mirfv2-can-someone-proof-my-code/6969/3 "2008-04-08T12:53:10Z")

</div>

I changed the code slightly on the transmitter side to show me the status of TX\_DS by turning on a second LED when the TX\_DS reg shows transmitted.

When I press the button, there is a 10 second delay before the LED light for the TX\_DS lights up…but nothing happens at the receiver.

Now, I am in an environment (at work) where we do have a TCPIP wireless network for laptop users.

Harold

---

<div class="post-metadata">

**Author:** ![leon\_heller](https://yyz1.discourse-cdn.com/sparkfun/user_avatar/community.sparkfun.com/leon_heller/32/7602_2.png) [@leon\_heller](https://community.sparkfun.com/u/leon_heller)\
**Post date:** [April 8, 2008, 2:19pm UTC](https://community.sparkfun.com/t/pic16f877-picbasicpro-mirfv2-can-someone-proof-my-code/6969/4 "2008-04-08T14:19:00Z")

</div>

You’d find it easier to use an 18F PIC with the C18 compiler, there is some software available that works OK.

Leon
