Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
pub
hello-world
nrf52
Commits
a8e816fb
Commit
a8e816fb
authored
Oct 01, 2017
by
Sam Calisch
Browse files
added hello world radio
parent
ffd1f29d
Pipeline
#861
passed with stage
in 1 second
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
modules/radio/radio.ino
0 → 100644
View file @
a8e816fb
//sec,2017
#define PACKET_BASE_ADDRESS_LENGTH (2UL) //Packet base address length field size in bytes
#define PACKET_LENGTH 4
#define REDUNDANCY_COUNT 10 //number of transmissions to ensure delivery... hack.
static
int16_t
radio_buffer
[
PACKET_LENGTH
]
=
{
0
};
void
radio_setup
(){
NRF_RADIO
->
POWER
=
RADIO_POWER_POWER_Disabled
;
//turn off radio to reset registers
delay
(
10
);
NRF_RADIO
->
POWER
=
RADIO_POWER_POWER_Enabled
;
//turn on radio
delay
(
10
);
NRF_RADIO
->
TXPOWER
=
(
RADIO_TXPOWER_TXPOWER_Pos3dBm
<<
RADIO_TXPOWER_TXPOWER_Pos
);
NRF_RADIO
->
FREQUENCY
=
11UL
;
// 2400 + X MHz
NRF_RADIO
->
MODE
=
(
RADIO_MODE_MODE_Nrf_2Mbit
<<
RADIO_MODE_MODE_Pos
);
NRF_RADIO
->
PREFIX0
=
((
uint32_t
)
0xC0
<<
0
);
// Prefix byte of address 0
NRF_RADIO
->
BASE0
=
0x01234567UL
;
// Base address for prefix 0
NRF_RADIO
->
BASE1
=
0x02345678UL
;
// Base address for prefix 0
NRF_RADIO
->
TXADDRESS
=
0x00UL
;
// Set device address 0 to use when transmitting
NRF_RADIO
->
RXADDRESSES
=
0x03UL
;
// Enable device addresses 0 and 1 to receive on
// Packet configuration
NRF_RADIO
->
PCNF0
=
(
0
<<
RADIO_PCNF0_S1LEN_Pos
)
|
(
0
<<
RADIO_PCNF0_S0LEN_Pos
)
|
(
0
<<
RADIO_PCNF0_LFLEN_Pos
);
NRF_RADIO
->
PCNF1
=
(
RADIO_PCNF1_WHITEEN_Enabled
<<
RADIO_PCNF1_WHITEEN_Pos
)
|
((
PACKET_LENGTH
)
<<
RADIO_PCNF1_STATLEN_Pos
)
|
(
RADIO_PCNF1_ENDIAN_Big
<<
RADIO_PCNF1_ENDIAN_Pos
)
|
(
2
<<
RADIO_PCNF1_BALEN_Pos
);
NRF_RADIO
->
CRCCNF
=
(
RADIO_CRCCNF_LEN_Three
<<
RADIO_CRCCNF_LEN_Pos
);
// Number of checksum bits
NRF_RADIO
->
CRCINIT
=
0xFFFFUL
;
// Initial value
NRF_RADIO
->
CRCPOLY
=
0x18D
;
//x8 + x7 + x3 + x2 + 1 = 110001101
NRF_RADIO
->
MODECNF0
|=
RADIO_MODECNF0_RU_Fast
<<
RADIO_MODECNF0_RU_Pos
;
//turn on fast ramp up
NRF_RADIO
->
SHORTS
=
0
;
//turn off all shortcuts, for debug
NRF_RADIO
->
PACKETPTR
=
(
uint32_t
)
&
radio_buffer
;
//set pointer to packet buffer
//start HFCLK
NRF_CLOCK
->
TASKS_HFCLKSTART
=
1
;
while
(
!
(
NRF_CLOCK
->
HFCLKSTAT
&
CLOCK_HFCLKSTAT_STATE_Msk
));
//wait for hfclk to start
delay
(
10
);
}
void
radio_wait_for_end
(){
while
(
!
(
NRF_RADIO
->
EVENTS_END
));
NRF_RADIO
->
EVENTS_END
=
0
;}
//clear end event
void
radio_wait_for_ready
(){
while
(
!
(
NRF_RADIO
->
EVENTS_READY
));
NRF_RADIO
->
EVENTS_READY
=
0
;}
//clear ready event
void
radio_disable
(){
NRF_RADIO
->
EVENTS_DISABLED
=
0
;
//clear disabled event
NRF_RADIO
->
TASKS_DISABLE
=
1
;
while
(
!
(
NRF_RADIO
->
EVENTS_DISABLED
));
}
void
radio_send
(){
NRF_RADIO
->
EVENTS_READY
=
0
;
//clear ready event
NRF_RADIO
->
TASKS_TXEN
=
1
;
//trigger tx enable task
delayMicroseconds
(
20
);
//radio_wait_for_ready(); //only generated when actually switching to tx mode
NRF_RADIO
->
TASKS_START
=
1
;
//start
radio_wait_for_end
();
}
void
radio_send_redundant
(){
for
(
int
i
=
0
;
i
<
REDUNDANCY_COUNT
;
i
++
){
radio_send
();
}
}
int
radio_recv
(){
//return number of packets before CRC match
NRF_RADIO
->
EVENTS_CRCOK
=
0
;
//NRF_RADIO->EVENTS_CRCERROR = 0;
int
i
=
1
;
while
(
true
){
NRF_RADIO
->
EVENTS_READY
=
0
;
//clear ready event
NRF_RADIO
->
TASKS_RXEN
=
1
;
//trigger rx enable task
delayMicroseconds
(
20
);
//radio_wait_for_ready(); //only generated when actually switching to rx mode
NRF_RADIO
->
TASKS_START
=
1
;
radio_wait_for_end
();
if
(
NRF_RADIO
->
EVENTS_CRCOK
==
1
){
break
;}
i
++
;
}
return
i
;
}
void
setup
()
{
radio_setup
();
NRF_RADIO
->
TXADDRESS
=
0x00UL
;
// Set address to send to device 0
radio_buffer
[
0
]
=
1
;
radio_buffer
[
1
]
=
2
;
radio_buffer
[
2
]
=
3
;
radio_buffer
[
3
]
=
4
;
//set up packet 1,2,3,4
radio_send_redundant
();
//send with redundant tx to device 0
NRF_RADIO
->
TXADDRESS
=
0x01UL
;
// Set address to send to device 1
radio_buffer
[
0
]
=
5
;
radio_buffer
[
1
]
=
6
;
radio_buffer
[
2
]
=
7
;
radio_buffer
[
3
]
=
8
;
//set up packet 5,6,7,8
radio_send_redundant
();
//send with redundant tx to device 1
int
result
=
radio_recv
();
//wait until recieve
//which pipe a packet arrive on is available in the RXMATCH register
}
void
loop
()
{}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment