-
Notifications
You must be signed in to change notification settings - Fork 0
/
NRF24L01.c
239 lines (210 loc) · 6.29 KB
/
NRF24L01.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#include <stdint.h>
#include "NRF24L01.h"
#include "../target.h"
static uint8_t (*p_NRF_SPI_Exchange)(uint8_t);
static t_NRF_RX_PIPE NFR_RxPipes[6];
static t_NRF_Registers NRFChip;
static uint8_t NRF_Write_Register(uint8_t Register, uint8_t Bytes[], uint8_t Length);
static uint8_t NRF_Read_Register(uint8_t Register, uint8_t Bytes[], uint8_t Length);
void NRF_Set_SPI_Handler (uint8_t(*SPI_Handler)(uint8_t))
{
p_NRF_SPI_Exchange = SPI_Handler;
}
void NRF24L01_Init(uint8_t (*SPI_Exchange)(uint8_t))
{
NRF_Set_SPI_Handler(SPI_Exchange);
NRF_PIN_CE = 0;
NRF_PIN_CSN = 1;
}
static uint8_t NRF_Write_Register(uint8_t Register, uint8_t Bytes[], uint8_t Length)
{
uint8_t Status = 0, i = 0;
NRF_PIN_CSN = 0;
Status = p_NRF_SPI_Exchange(CMD_NRF_W_REGISTER | Register);
for (i = 0; i < Length; i++)
{
p_NRF_SPI_Exchange(Bytes[i]);
}
NRF_PIN_CSN = 1;
return Status;
}
static uint8_t NRF_Read_Register(uint8_t Register, uint8_t Bytes[], uint8_t Length)
{
uint8_t Status = 0, i = 0;
NRF_PIN_CSN = 0;
Status = p_NRF_SPI_Exchange(CMD_NRF_R_REGISTER | Register);
for (i = 0; i < Length; i++)
{
Bytes[i] = p_NRF_SPI_Exchange(CMD_NRF_NOP);
}
NRF_PIN_CSN = 1;
return Status;
}
void NRF_ReadPayload(uint8_t Payload[], uint8_t PayloadLength)
{
uint8_t i;
NRF_PIN_CSN = 0;
NRFChip.STATUS.byte = p_NRF_SPI_Exchange(CMD_NRF_R_RX_PAYLOAD);
for (i = 0; i < PayloadLength; i++)
{
Payload[i] = p_NRF_SPI_Exchange(CMD_NRF_NOP);
}
NRF_PIN_CSN = 1;
NRFChip.STATUS.s.RX_DR = 1;
NRF_Write_Register(REG_NRF_STATUS, &NRFChip.STATUS.byte, 1);
}
void NRF_WritePayload(uint8_t Payload[], uint8_t PayloadLength)
{
uint8_t i;
NRF_PIN_CSN = 0;
NRFChip.STATUS.byte = p_NRF_SPI_Exchange(CMD_NRF_W_TX_REGISTER);
for (i = 0; i < PayloadLength; i++)
{
p_NRF_SPI_Exchange(Payload[i]);
}
NRF_PIN_CE = 1;
__delay_us(25);
NRF_PIN_CE = 0;
NRF_PIN_CSN = 1;
}
void NRF_OpenReadingPipe(uint8_t PipeNo, uint8_t PipeAddr[], uint8_t PayloadLength, uint8_t AutoAck, uint8_t Enable)
{
uint8_t i;
uint8_t AW = NRFChip.AW.byte + 2;
NFR_RxPipes[PipeNo].PAY_LEN = PayloadLength;
for (i = 0; i < AW; i++)
{
NFR_RxPipes[PipeNo].PIPE_ADDR[i] = PipeAddr[i];
}
if (Enable != 0)
{
NRF_PipeEnable(PipeNo);
}
else
{
/* Do Nothing */
}
if (AutoAck != 0)
{
NRF_PipeEnableAA(PipeNo);
}
else
{
/* Do Nothing */
}
NRF_Write_Register(REG_NRF_RX_ADDR_P0 + PipeNo, NFR_RxPipes[PipeNo].PIPE_ADDR, (PipeNo > 1) ? 1 : AW);
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_RX_PW_P0 + PipeNo, &NFR_RxPipes[PipeNo].PAY_LEN, 1);
}
void NRF_SetTxAddr(uint8_t *PipeAddr)
{
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_TX_ADDR, PipeAddr, 5);
}
void NRF_PipeEnable(uint8_t PipeNo)
{
uint8_t EN;
NRF_Read_Register(REG_NRF_EN_RXADDR, &EN, 1);
EN |= 1 << PipeNo;
NRF_Write_Register(REG_NRF_EN_RXADDR, &EN, 1);
}
void NRF_PipeDisable(uint8_t PipeNo)
{
uint8_t EN;
NRF_Read_Register(REG_NRF_EN_RXADDR, &EN, 1);
EN &= (1 << PipeNo) ^ 0xFF;
NRF_Write_Register(REG_NRF_EN_RXADDR, &EN, 1);
}
void NRF_PipeEnableAA(uint8_t PipeNo)
{
uint8_t AA;
NRF_Read_Register(REG_NRF_EN_AA, &AA, 1);
AA |= 1 << PipeNo;
NRF_Write_Register(REG_NRF_EN_AA, &AA, 1);
}
void NRF_PipeDisableAA(uint8_t PipeNo)
{
uint8_t AA;
NRF_Read_Register(REG_NRF_EN_AA, &AA, 1);
AA &= (1 << PipeNo) ^ 0xFF;
NRF_Write_Register(REG_NRF_EN_AA, &AA, 1);
}
void NRF_SetPrimaryAs(uint8_t asPrimary)
{
NRF_Read_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
NRFChip.CONFIG.s.PRIM_RX = asPrimary;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
}
void NRF_SetCRCLen(uint8_t Len)
{
NRF_Read_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
NRFChip.CONFIG.s.CRCO = Len;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
}
void NRF_SetRFChannel(uint8_t RF_Channel)
{
NRFChip.RF_CH.byte = (RF_Channel > 125) ? 125 : RF_Channel;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_RF_CH, &NRFChip.RF_CH.byte, 1);
}
void NRF_SetRFPower(uint8_t RF_Pow)
{
NRF_Read_Register(REG_NRF_RF_SETUP, &NRFChip.RF_SETUP.byte, 1);
NRFChip.RF_SETUP.s.RF_PWR = (RF_Pow > 3) ? 3 : RF_Pow;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_RF_SETUP, &NRFChip.RF_SETUP.byte, 1);
}
void NRF_SetRFDataRate(uint8_t Datarate)
{
NRF_Read_Register(REG_NRF_RF_SETUP, &NRFChip.RF_SETUP.byte, 1);
NRFChip.RF_SETUP.s.RF_DR = Datarate & 1;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_RF_SETUP, &NRFChip.RF_SETUP.byte, 1);
}
void NRF_SetAddrWidth(uint8_t AddressWidth)
{
AddressWidth += (AddressWidth == 0) ? 1 : 0;
AddressWidth = (AddressWidth > 3) ? 3 : 0;
NRFChip.AW.byte = AddressWidth;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_SETUP_AW, &NRFChip.AW.byte, 1);
}
void NRF_SetART(uint8_t count, uint8_t delay)
{
NRFChip.SETUP_RETR.s.ARC = count;
NRFChip.SETUP_RETR.s.ARD = delay;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_SETUP_RETR, &NRFChip.SETUP_RETR.byte, 1);
}
void NRF_StartListening(void)
{
NRF_Read_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
NRFChip.CONFIG.s.PRIM_RX = 1;
NRFChip.CONFIG.s.PWR_UP = 1;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
NRF_PIN_CE = 1;
}
void NRF_StopListening(void)
{
NRF_Read_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
NRFChip.CONFIG.s.PRIM_RX = 0;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
NRF_PIN_CE = 0;
}
uint8_t NRF_Available(void)
{
uint8_t PipiNo = 255;
NRF_GetStatus();
if (NRFChip.STATUS.s.RX_DR == 1)
{
PipiNo = NRFChip.STATUS.s.RX_P_NO;
}
return PipiNo;
}
uint8_t NRF_GetStatus(void)
{
NRF_PIN_CSN = 0;
NRFChip.STATUS.byte = p_NRF_SPI_Exchange(CMD_NRF_NOP);
NRF_PIN_CSN = 1;
return NRFChip.STATUS.byte;
}
void NRF_SetMaskIRQ(uint8_t IRQMask)
{
NRF_Read_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
NRFChip.CONFIG.byte |= IRQMask & 0xF0;
NRFChip.CONFIG.byte &= IRQMask | 0x0F;
NRFChip.STATUS.byte = NRF_Write_Register(REG_NRF_CONFIG, &NRFChip.CONFIG.byte, 1);
}