ATY_LIB V2_102_230218
ATY_LIB for general devices or ALGO
 
Loading...
Searching...
No Matches
xl2400.c
Go to the documentation of this file.
1// Copyright 2021 IOsetting <iosetting(at)outlook.com>
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "xl2400.h"
16
18
19
24{
25 uint8_t i = 0;
28 for (i = 0; i < 8; i++)
29 {
31 if (value & 0x80)
32 {
34 }
35 else
36 {
38 }
40 value = value << 1;
41 }
43}
44
49{
50 uint8_t i = 0, RxData;
51
54 for (i = 0; i < 8; i++)
55 {
56 RxData = RxData << 1;
58 if (XL2400_DATA_READ())
59 {
60 RxData |= 0x01;
61 }
62 else
63 {
64 RxData &= 0xfe;
65 }
67 }
69 return RxData;
70}
71
73{
78}
79
81{
82 uint8_t reg_val;
85 reg_val = XL2400_ReadByte();
87 return reg_val;
88}
89
90void XL2400_WriteFromBuf(uint8_t reg, const uint8_t *pBuf, uint8_t len)
91{
92 uint8_t ctr;
95 for (ctr = 0; ctr < len; ctr++)
96 {
97 XL2400_WriteByte(*pBuf++);
98 }
100}
101
103{
104 uint8_t ctr;
106 XL2400_WriteByte(reg);
107 for (ctr = 0; ctr < len; ctr++)
108 {
109 pBuf[ctr] = XL2400_ReadByte();
110 }
112}
113
115{
117 *(cbuf + 1) &= 0xBF;
119}
120
122{
124 *(cbuf + 1) |= 0x40;
126}
127
129{
130 uint8_t i;
131 const uint8_t *ptr = (const uint8_t *)XL2400_TEST_ADDR;
134 for (i = 0; i < 5; i++) {
135 UART1_TxHex(*(xbuf + i));
136 if (*(xbuf + i) != *ptr++) return HAL_ERROR;
137 }
138 return HAL_OK;
139}
140
141void XL2400_Init(void)
142{
143 // Analog config
145 *(xbuf + 4) &= ~0x04;
146 *(xbuf + 12) |= 0x40;
148 // Switch to software CE control, wake up RF
150 // Enable Auto ACK Pipe 0
152 // Enable Pipe 0
154 // Address Width, 5 bytes
156 // Retries and interval
158 // RF Data Rate 1Mbps
160 // Number of bytes in RX payload, pipe 0 and pipe 1
161 *(cbuf + 0) = XL2400_PLOAD_WIDTH;
162 *(cbuf + 1) = XL2400_PLOAD_WIDTH;
164 // Dynamic payload width: off
166 // Other features
167 //bit7&6=00 return status when send register address
168 //bit5=0 long data pack off
169 //bit4=1 FEC off
170 //bit3=1 FEATURE on
171 //bit2=0 Dynamic length off
172 //bit1=0 ACK without payload
173 //bit0=0 W_TX_PAYLOAD_NOACK off
175 // Enable RSSI
176 *(cbuf + 0) = 0x10;
177 *(cbuf + 1) = 0x00;
179}
180
182{
183 if (channel > 80) channel = 80;
184 // AFC reset
186 // AFC on
188 // Frequency(MHz) 2400:0x960 -> 2480:0x9B0
189 *(cbuf + 0) = 0x60 + channel;
190 *(cbuf + 1) = 0x09;
192 // AFC Locked
193 *(cbuf + 1) |= 0x20;
195}
196
198{
201}
202
204{
206}
207
209{
211 *(xbuf + 2) = power;
213}
214
215void XL2400_Sleep(void)
216{
219
220 *(xbuf + 0) = 0x7C;
221 *(xbuf + 1) = 0x82;
222 *(xbuf + 2) = 0x03;
224}
225
227{
228 *(xbuf + 0) = 0x7E;
229 *(xbuf + 1) = 0x82;
230 *(xbuf + 2) = 0x0B;
234}
235
237{
238 uint8_t i, j;
239 for (i = 0; i < 10; i++)
240 {
241 SYS_Delay(2);
243 *(cbuf + 1) |= 0x90;
244 *(cbuf + 1) &= ~0x20;
246 *(cbuf + 1) |= 0x40;
248 SYS_Delay(1);
250
251 if (*(cbuf + 1) & 0x20)
252 {
253 j = *(cbuf + 1) << 3;
255 *(cbuf + 1) &= 0x8F;
256 *(cbuf + 1) |= 0x20;
257 *(cbuf + 0) &= 0x07;
258 *(cbuf + 0) |= j;
260 return HAL_OK;
261 }
262 }
263 return HAL_ERROR;
264}
265
267{
272 SYS_Delay(2);
273}
274
276{
280 // XL2400_RxCalibrate();
282 SYS_Delay(1);
283}
284
285uint8_t XL2400_Tx(uint8_t *ucPayload, uint8_t length)
286{
287 uint8_t y = 100, status = 0;
291 // Retry until timeout
292 while (y--)
293 {
294 SYS_DelayUs(100);
295 status = XL2400_ReadStatus();
296 // If TX successful or retry timeout, exit
297 if ((status & (MAX_RT_FLAG | TX_DS_FLAG)) != 0)
298 {
299 break;
300 }
301 }
303 return status;
304}
305
307{
308 uint8_t i, status, rxplWidth;
309 status = XL2400_ReadStatus();
310 if (status & RX_DR_FLAG)
311 {
316 // UART1_TxChar('>');
317 // for (i = 0; i < rxplWidth; i++)
318 // {
319 // UART1_TxHex(*(xbuf + i));
320 // }
321 }
322 return status;
323}
324
326{
328}
329
331{
335}
336
338{
341}
342
344{
347 *(xbuf + 12) |= 0x40;
348 *(xbuf + 4) &= ~0x04;
351 *(xbuf + 0) = 0x01;
352 *(xbuf + 1) = 0x00;
355}
356
358{
359 uint8_t i, status;
360
361 UART1_TxString("Bytes from low to high: 0,1,2,3,...\r\n[Config]");
363 for (i = 0; i < 3; i++) {
364 UART1_TxHex(*(xbuf + i));
365 }
366
367 UART1_TxString(" [EN_AA]");
369
370 UART1_TxString(" [EN_RxAddr]");
372
373 UART1_TxString(" [AddrWidth]");
375
376 UART1_TxString(" [Retry]");
378 for (i = 0; i < 4; i++) {
379 UART1_TxHex(*(xbuf + i));
380 }
381
382 UART1_TxString("\r\n[RF_Channel]");
384 for (i = 0; i < 3; i++) {
385 UART1_TxHex(*(xbuf + i));
386 }
387
388 UART1_TxString(" [RF_Setup]");
390 for (i = 0; i < 2; i++) {
391 UART1_TxHex(*(xbuf + i));
392 }
393
394 UART1_TxString(" [Observe_Tx]");
396 for (i = 0; i < 4; i++) {
397 UART1_TxHex(*(xbuf + i));
398 }
399
400 UART1_TxString(" [RSSI]");
402 for (i = 0; i < 2; i++) {
403 UART1_TxHex(*(xbuf + i));
404 }
405
406 UART1_TxString("\r\n[TxAddr] ");
408 for (i = 0; i < 5; i++) {
409 UART1_TxHex(*(xbuf + i));
410 }
411
412 UART1_TxString("\r\n[RxAddrP0]");
414 for (i = 0; i < 5; i++) {
415 UART1_TxHex(*(xbuf + i));
416 }
417 UART1_TxString(" [RxAddrP1]");
419 for (i = 0; i < 5; i++) {
420 UART1_TxHex(*(xbuf + i));
421 }
422 UART1_TxString(" [RxAddrP2-P5]");
424 for (i = 0; i < 4; i++) {
425 UART1_TxHex(*(xbuf + i));
426 }
427
428 UART1_TxString("\r\n[RxPloadWidth_P0-P5]");
430 for (i = 0; i < 6; i++) {
431 UART1_TxHex(*(xbuf + i));
432 }
433
434 UART1_TxString("\r\n[FIFO_Status]");
436 for (i = 0; i < 3; i++) {
437 UART1_TxHex(*(xbuf + i));
438 }
439 UART1_TxString(" [DynPloadWidth]");
441 UART1_TxString(" [Feature]");
443
444 status = XL2400_ReadStatus();
445 UART1_TxString("\r\n[Status]");
446 UART1_TxHex(status);
447 UART1_TxString("\r\n\r\n");
448 return status;
449}
value
Definition: DS18B20_ATY.c:216
void SYS_Delay(uint16_t t)
Definition: fw_sys.c:65
void SYS_DelayUs(uint16_t t)
Definition: fw_sys.c:75
@ HAL_ERROR
Definition: fw_types.h:77
@ HAL_OK
Definition: fw_types.h:76
unsigned char uint8_t
Definition: fw_types.h:18
void UART1_TxString(uint8_t *str)
Definition: fw_uart.c:85
void UART1_TxHex(uint8_t hex)
Definition: fw_uart.c:79
void XL2400_SetTxMode(void)
Definition: xl2400.c:266
void XL2400_FlushRxTX(void)
Definition: xl2400.c:337
void XL2400_SetRxAddress(uint8_t *address)
Definition: xl2400.c:203
uint8_t XL2400_Rx(void)
Definition: xl2400.c:306
void XL2400_WriteReg(uint8_t reg, uint8_t value)
Definition: xl2400.c:72
__IDATA uint8_t cbuf[2]
Definition: xl2400.c:17
void XL2400_SetTxAddress(uint8_t *address)
Definition: xl2400.c:197
void XL2400_WriteFromBuf(uint8_t reg, const uint8_t *pBuf, uint8_t len)
Definition: xl2400.c:90
void XL2400_SetPower(uint8_t power)
Definition: xl2400.c:208
uint8_t XL2400_ReadStatus(void)
Definition: xl2400.c:325
void XL2400_WakeUp(void)
Definition: xl2400.c:226
void XL2400_CarrierTest(void)
Definition: xl2400.c:343
uint8_t XL2400_ReadReg(uint8_t reg)
Definition: xl2400.c:80
uint8_t XL2400_PrintStatus(void)
Definition: xl2400.c:357
void XL2400_Init(void)
Definition: xl2400.c:141
void XL2400_SetChannel(uint8_t channel)
Definition: xl2400.c:181
void XL2400_SetRxMode(void)
Definition: xl2400.c:275
void XL2400_CE_High(void)
Definition: xl2400.c:121
void XL2400_WriteByte(uint8_t value)
Definition: xl2400.c:23
void XL2400_CE_Low(void)
Definition: xl2400.c:114
void XL2400_ReadToBuf(uint8_t reg, uint8_t *pBuf, uint8_t len)
Definition: xl2400.c:102
__IDATA uint8_t xbuf[XL2400_PL_WIDTH_MAX+1]
Definition: xl2400.c:17
uint8_t XL2400_Tx(uint8_t *ucPayload, uint8_t length)
Definition: xl2400.c:285
uint8_t XL2400_SPI_Test(void)
Definition: xl2400.c:128
uint8_t XL2400_RxCalibrate(void)
Definition: xl2400.c:236
uint8_t XL2400_ReadByte(void)
Definition: xl2400.c:48
void XL2400_ClearStatus(void)
Definition: xl2400.c:330
void XL2400_Sleep(void)
Definition: xl2400.c:215
#define XL2400_TEST_ADDR
Definition: xl2400.h:116
#define XL2400_REG_TXPROC_CFG
Definition: xl2400.h:83
#define XL2400_CMD_R_RX_PAYLOAD
Definition: xl2400.h:45
#define XL2400_REG_EN_RXADDR
Definition: xl2400.h:61
#define XL2400_CLK_HIGH()
Definition: xl2400.h:34
#define XL2400_DATA_IN()
Definition: xl2400.h:28
#define MAX_RT_FLAG
Definition: xl2400.h:114
#define XL2400_CMD_FLUSH_TX
Definition: xl2400.h:47
#define XL2400_REG_ANALOG_CFG0
Definition: xl2400.h:77
#define TX_DS_FLAG
Definition: xl2400.h:112
#define XL2400_CLK_LOW()
Definition: xl2400.h:33
#define XL2400_CMD_FLUSH_RX
Definition: xl2400.h:48
#define XL2400_REG_DYNPD
Definition: xl2400.h:85
#define XL2400_REG_RF_CH
Definition: xl2400.h:64
#define XL2400_CMD_NOP
Definition: xl2400.h:56
#define XL2400_REG_FEATURE
Definition: xl2400.h:86
#define XL2400_PLOAD_WIDTH
Definition: xl2400.h:25
#define XL2400_REG_RX_ADDR_P0
Definition: xl2400.h:69
#define XL2400_REG_ANALOG_CFG3
Definition: xl2400.h:80
#define XL2400_REG_RSSI
Definition: xl2400.h:68
#define XL2400_DATA_OUT()
Definition: xl2400.h:27
#define XL2400_REG_OBSERVE_TX
Definition: xl2400.h:67
#define XL2400_CMD_R_REGISTER
Definition: xl2400.h:43
#define XL2400_REG_FIFO_STATUS
Definition: xl2400.h:81
#define XL2400_REG_STATUS
Definition: xl2400.h:66
#define XL2400_REG_RX_ADDR_P1
Definition: xl2400.h:70
#define XL2400_NSS_LOW()
Definition: xl2400.h:36
#define XL2400_REG_CFG_TOP
Definition: xl2400.h:59
#define RX_DR_FLAG
Definition: xl2400.h:111
#define XL2400_DATA_HIGH()
Definition: xl2400.h:30
#define XL2400_REG_RX_ADDR_P2_P5
Definition: xl2400.h:71
#define XL2400_REG_SETUP_RETR
Definition: xl2400.h:63
#define XL2400_CMD_W_REGISTER
Definition: xl2400.h:44
#define XL2400_REG_RF_SETUP
Definition: xl2400.h:65
#define XL2400_CMD_R_RX_PL_WID
Definition: xl2400.h:53
#define XL2400_CMD_W_TX_PAYLOAD
Definition: xl2400.h:46
#define XL2400_REG_SETUP_AW
Definition: xl2400.h:62
#define XL2400_DATA_READ()
Definition: xl2400.h:31
#define XL2400_REG_TX_ADDR
Definition: xl2400.h:75
#define XL2400_REG_EN_AA
Definition: xl2400.h:60
#define XL2400_REG_RX_PW_PX
Definition: xl2400.h:76
#define XL2400_PL_WIDTH_MAX
Definition: xl2400.h:92
#define XL2400_NSS_HIGH()
Definition: xl2400.h:37
#define XL2400_DATA_LOW()
Definition: xl2400.h:29
uint8_t __XDATA i
volatile int16_t y
Definition: main.c:34