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
19
21{
22 XL2400_CSN = 0;
23 cbuf[0] = reg;
24 cbuf[1] = value;
26 XL2400_CSN = 1;
27}
28
30{
31 XL2400_CSN = 0;
32 cbuf[0] = reg;
35 XL2400_CSN = 1;
36 return cbuf[1];
37}
38
39void XL2400_WriteFromBuf(uint8_t reg, const uint8_t *pBuf, uint8_t len)
40{
41 XL2400_CSN = 0;
42 xbuf[0] = reg;
43 memcpy(xbuf_data, pBuf, len);
44 SPI_TxRxBytes(xbuf, len + 1);
45 XL2400_CSN = 1;
46}
47
49{
50 XL2400_CSN = 0;
52 xbuf[0] = reg;
53 SPI_TxRxBytes(xbuf, len + 1);
54 XL2400_CSN = 1;
55}
56
58{
59 XL2400_CSN = 0;
60 xbuf[0] = reg;
61 SPI_TxRxBytes(xbuf, len + 1);
62 XL2400_CSN = 1;
63}
64
65void XL2400_CE_Low(void)
66{
68 *(xbuf_data + 1) &= 0xBF;
70}
71
73{
75 *(xbuf_data + 1) |= 0x40;
77}
78
80{
81 uint8_t i;
82 const uint8_t *ptr = (const uint8_t *)XL2400_TEST_ADDR;
85 for (i = 0; i < 5; i++) {
87 if (*(xbuf_data + i) != *ptr++) return HAL_ERROR;
88 }
89 return HAL_OK;
90}
91
92void XL2400_Init(void)
93{
94 // Analog config
96 *(xbuf_data + 4) &= ~0x04;
97 *(xbuf_data + 12) |= 0x40;
99 // Switch to software CE control, wake up RF
101 // Enable Auto ACK Pipe 0
103 // Enable Pipe 0
105 // Address Width, 5 bytes
107 // Retries and interval
109 // RF Data Rate 1Mbps
111 // Number of bytes in RX payload, pipe 0 and pipe 1
115 // Dynamic payload width: off
117 // Other features
118 //bit7&6=00 return status when send register address
119 //bit5=0 long data pack off
120 //bit4=1 FEC off
121 //bit3=1 FEATURE on
122 //bit2=0 Dynamic length off
123 //bit1=0 ACK without payload
124 //bit0=0 W_TX_PAYLOAD_NOACK off
126 // Enable RSSI
127 *(xbuf_data + 0) = 0x10;
128 *(xbuf_data + 1) = 0x00;
130}
131
133{
134 if (channel > 80) channel = 80;
135 // AFC reset
137 // AFC on
139 // Frequency(MHz) 2400:0x960 -> 2480:0x9B0
140 *(xbuf_data + 0) = 0x60 + channel;
141 *(xbuf_data + 1) = 0x09;
143 // AFC Locked
144 *(xbuf_data + 1) |= 0x20;
146}
147
149{
152}
153
155{
157}
158
160{
162 *(xbuf_data + 2) = power;
164}
165
166void XL2400_Sleep(void)
167{
170
171 *(xbuf_data + 0) = 0x7C;
172 *(xbuf_data + 1) = 0x82;
173 *(xbuf_data + 2) = 0x03;
175}
176
178{
179 *(xbuf_data + 0) = 0x7E;
180 *(xbuf_data + 1) = 0x82;
181 *(xbuf_data + 2) = 0x0B;
185}
186
188{
189 uint8_t i, j;
190 for (i = 0; i < 10; i++)
191 {
192 SYS_Delay(2);
194 *(xbuf_data + 1) |= 0x90;
195 *(xbuf_data + 1) &= ~0x20;
197 *(xbuf_data + 1) |= 0x40;
199 SYS_Delay(1);
201
202 if (*(xbuf_data + 1) & 0x20)
203 {
204 j = *(xbuf_data + 1) << 3;
206 *(xbuf_data + 1) &= 0x8F;
207 *(xbuf_data + 1) |= 0x20;
208 *(xbuf_data + 0) &= 0x07;
209 *(xbuf_data + 0) |= j;
211 return HAL_OK;
212 }
213 }
214 return HAL_ERROR;
215}
216
218{
223 SYS_Delay(2);
224}
225
227{
233 SYS_Delay(1);
234}
235
236uint8_t XL2400_Tx(uint8_t *ucPayload, uint8_t length)
237{
238 uint8_t y = 100, status = 0;
242 SYS_DelayUs(100);
243 // Retry until timeout
244 while (y--)
245 {
246 SYS_DelayUs(100);
247 status = XL2400_ReadStatus();
248 // If TX successful or retry timeout, exit
249 if ((status & (MAX_RT_FLAG | TX_DS_FLAG)) != 0)
250 {
251 break;
252 }
253 }
255 return status;
256}
257
259{
260 uint8_t i, status, rxplWidth;
261 status = XL2400_ReadStatus();
262 if (status & RX_DR_FLAG)
263 {
268 UART1_TxChar('>');
269 for (i = 0; i < rxplWidth; i++)
270 {
271 UART1_TxHex(*(xbuf_data + i));
272 }
273 }
274 return status;
275}
276
278{
280}
281
283{
287}
288
290{
293}
294
296{
299 *(xbuf_data + 12) |= 0x40;
300 *(xbuf_data + 4) &= ~0x04;
303 *(xbuf_data + 0) = 0x01;
304 *(xbuf_data + 1) = 0x00;
307}
308
310{
311 uint8_t i, status;
312
313 UART1_TxString("Bytes from low to high: 0,1,2,3,...\r\n[Config]");
315 for (i = 0; i < 3; i++) {
316 UART1_TxHex(*(xbuf_data + i));
317 }
318
319 UART1_TxString(" [EN_AA]");
321
322 UART1_TxString(" [EN_RxAddr]");
324
325 UART1_TxString(" [AddrWidth]");
327
328 UART1_TxString(" [Retry]");
330 for (i = 0; i < 4; i++) {
331 UART1_TxHex(*(xbuf_data + i));
332 }
333
334 UART1_TxString("\r\n[RF_Channel]");
336 for (i = 0; i < 3; i++) {
337 UART1_TxHex(*(xbuf_data + i));
338 }
339
340 UART1_TxString(" [RF_Setup]");
342 for (i = 0; i < 2; i++) {
343 UART1_TxHex(*(xbuf_data + i));
344 }
345
346 UART1_TxString(" [Observe_Tx]");
348 for (i = 0; i < 4; i++) {
349 UART1_TxHex(*(xbuf_data + i));
350 }
351
352 UART1_TxString(" [RSSI]");
354 for (i = 0; i < 2; i++) {
355 UART1_TxHex(*(xbuf_data + i));
356 }
357
358 UART1_TxString("\r\n[TxAddr] ");
360 for (i = 0; i < 5; i++) {
361 UART1_TxHex(*(xbuf_data + i));
362 }
363
364 UART1_TxString("\r\n[RxAddrP0]");
366 for (i = 0; i < 5; i++) {
367 UART1_TxHex(*(xbuf_data + i));
368 }
369 UART1_TxString(" [RxAddrP1]");
371 for (i = 0; i < 5; i++) {
372 UART1_TxHex(*(xbuf_data + i));
373 }
374 UART1_TxString(" [RxAddrP2-P5]");
376 for (i = 0; i < 4; i++) {
377 UART1_TxHex(*(xbuf_data + i));
378 }
379
380 UART1_TxString("\r\n[RxPloadWidth_P0-P5]");
382 for (i = 0; i < 6; i++) {
383 UART1_TxHex(*(xbuf_data + i));
384 }
385
386 UART1_TxString("\r\n[FIFO_Status]");
388 for (i = 0; i < 3; i++) {
389 UART1_TxHex(*(xbuf_data + i));
390 }
391 UART1_TxString(" [DynPloadWidth]");
393 UART1_TxString(" [Feature]");
395
396 status = XL2400_ReadStatus();
397 UART1_TxString("\r\n[Status]");
398 UART1_TxHex(status);
399 UART1_TxString("\r\n\r\n");
400 return status;
401}
value
Definition: DS18B20_ATY.c:216
void SPI_TxRxBytes(uint8_t *pBuf, uint8_t len)
Definition: fw_spi.c:28
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_TxChar(char dat)
Definition: fw_uart.c:72
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_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
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 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_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_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_CSN
Definition: xl2400.h:21
#define XL2400_REG_RX_ADDR_P1
Definition: xl2400.h:70
#define XL2400_REG_CFG_TOP
Definition: xl2400.h:59
#define RX_DR_FLAG
Definition: xl2400.h:111
#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_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
uint8_t __XDATA i
volatile int16_t y
Definition: main.c:34
uint8_t * xbuf_data
Definition: xl2400.c:18
void XL2400_WriteBack(uint8_t reg, uint8_t len)
Definition: xl2400.c:57