You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
5.7 KiB
148 lines
5.7 KiB
// Copyright (c) 2018 Brandenburg Tech, LLC
|
|
// All rights reserved.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY BRANDENBURG TECH, LLC AND CONTRIBUTORS
|
|
// ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BRANDENBURT TECH, LLC
|
|
// AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
//
|
|
// Copyright (c) 2007,2008,2009,2010,2011,2012,2013, 2014 AXSEM AG
|
|
// All rights reserved.
|
|
//
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are met:
|
|
//
|
|
// 1.Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// 2.Redistributions in binary form must reproduce the above copyright
|
|
// notice, this list of conditions and the following disclaimer in the
|
|
// documentation and/or other materials provided with the distribution.
|
|
// 3.Neither the name of AXSEM AG, Duebendorf nor the
|
|
// names of its contributors may be used to endorse or promote products
|
|
// derived from this software without specific prior written permission.
|
|
// 4.All advertising materials mentioning features or use of this software
|
|
// must display the following acknowledgement:
|
|
// This product includes software developed by AXSEM AG and its contributors.
|
|
// 5.The usage of this source code is only granted for operation with AX5043
|
|
// and AX8052F143. Porting to other radio or communication devices is
|
|
// strictly prohibited.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY AXSEM AG AND CONTRIBUTORS ``AS IS'' AND ANY
|
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
// DISCLAIMED. IN NO EVENT SHALL AXSEM AG AND CONTRIBUTORS BE LIABLE FOR ANY
|
|
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
#include "axradiorx.h"
|
|
|
|
#include "../ax5043support/ax5043rx.h"
|
|
#include "../spi/ax5043spi_p.h"
|
|
#include "axradioinit.h"
|
|
|
|
extern const uint8_t axradio_phy_innerfreqloop;
|
|
extern uint8_t axradio_rxbuffer[];
|
|
|
|
static uint8_t receive_loop(void);
|
|
|
|
uint8_t receive_packet(void) {
|
|
return receive_loop();
|
|
}
|
|
|
|
uint8_t receive_loop(void) {
|
|
uint8_t fifo_cmd;
|
|
uint8_t i;
|
|
uint8_t b0 __attribute__((unused));
|
|
uint8_t b1 __attribute__((unused));
|
|
uint8_t b2 __attribute__((unused));
|
|
uint8_t b3 __attribute__((unused));
|
|
|
|
uint8_t len = ax5043ReadReg(AX5043_RADIOEVENTREQ0); // clear request so interrupt does not fire again. sync_rx enables interrupt on radio state changed in order to wake up on SDF detected
|
|
|
|
uint8_t bytesRead = 0;
|
|
|
|
//printf("INFO: Waiting for a packet\n");
|
|
|
|
while ((ax5043ReadReg(AX5043_FIFOSTAT) & 0x01) != 1) { // FIFO not empty
|
|
fifo_cmd = ax5043ReadReg(AX5043_FIFODATA); // read command
|
|
len = (fifo_cmd & 0xE0) >> 5; // top 3 bits encode payload len
|
|
if (len == 7)
|
|
len = ax5043ReadReg(AX5043_FIFODATA); // 7 means variable length, -> get length byte
|
|
fifo_cmd &= 0x1F;
|
|
switch (fifo_cmd) {
|
|
case AX5043_FIFOCMD_DATA:
|
|
if (!len)
|
|
break;
|
|
|
|
ax5043ReadReg(AX5043_FIFODATA); // Discard the flags
|
|
--len;
|
|
bytesRead = ax5043_readfifo(axradio_rxbuffer, len);
|
|
break;
|
|
|
|
case AX5043_FIFOCMD_RFFREQOFFS:
|
|
if (axradio_phy_innerfreqloop || len != 3)
|
|
goto dropchunk;
|
|
i = ax5043ReadReg(AX5043_FIFODATA);
|
|
i &= 0x0F;
|
|
i |= 1 + (uint8_t)~(i & 0x08);
|
|
|
|
b3 = ((int8_t)i) >> 8;
|
|
b2 = i;
|
|
b1 = ax5043ReadReg(AX5043_FIFODATA);
|
|
b0 = ax5043ReadReg(AX5043_FIFODATA);
|
|
|
|
//printf("INFO: RF Frequency Offset: 0x%02x%02x%02x%02x\n", b3, b2, b1, b0);
|
|
break;
|
|
|
|
case AX5043_FIFOCMD_FREQOFFS:
|
|
if (!axradio_phy_innerfreqloop || len != 2)
|
|
goto dropchunk;
|
|
|
|
b1 = ax5043ReadReg(AX5043_FIFODATA);
|
|
b0 = ax5043ReadReg(AX5043_FIFODATA);
|
|
|
|
//printf("INFO: Frequency offset: 0x%02x%02x\n", b1, b2);
|
|
break;
|
|
|
|
case AX5043_FIFOCMD_RSSI:
|
|
if (len != 1)
|
|
goto dropchunk;
|
|
{
|
|
int8_t r __attribute__((unused));
|
|
r = ax5043ReadReg(AX5043_FIFODATA);
|
|
|
|
//printf("INFO: RSSI %d\n", (int)r);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
//fprintf(stderr, "ERROR: Unknown chunk in FIFO\n");
|
|
dropchunk:
|
|
//fprintf(stderr, "WARNING: Discarding chunk in FIFO\n");
|
|
if (!len)
|
|
break;
|
|
i = len;
|
|
do {
|
|
ax5043ReadReg(AX5043_FIFODATA); // purge FIFO
|
|
}
|
|
while (--i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//printf("INFO: Done waiting for a packet\n");
|
|
|
|
return bytesRead;
|
|
}
|