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.
189 lines
5.9 KiB
189 lines
5.9 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 "axradiomode.h"
|
|
|
|
#include "../generated/config.h"
|
|
#include "../spi/ax5043spi_p.h"
|
|
#include "axradioinit.h"
|
|
#include "axradioinit_p.h"
|
|
|
|
extern uint8_t axradio_phy_chanpllrng[];
|
|
extern const uint8_t axradio_phy_vcocalib;
|
|
extern uint8_t axradio_phy_chanvcoi[];
|
|
extern const uint8_t axradio_phy_chanvcoiinit[];
|
|
extern const uint8_t axradio_phy_chanpllrnginit[];
|
|
extern const int8_t axradio_phy_rssireference;
|
|
|
|
static uint8_t ax5043_init_registers_common(void);
|
|
|
|
uint8_t mode_tx() {
|
|
int retVal;
|
|
|
|
retVal = ax5043_off();
|
|
if (retVal != AXRADIO_ERR_NOERROR) {
|
|
return retVal;
|
|
}
|
|
|
|
retVal = ax5043_init_registers_tx();
|
|
if (retVal != AXRADIO_ERR_NOERROR) {
|
|
return retVal;
|
|
}
|
|
|
|
return AXRADIO_ERR_NOERROR;
|
|
}
|
|
|
|
uint8_t mode_rx() {
|
|
int retVal;
|
|
|
|
retVal = ax5043_off();
|
|
if (retVal != AXRADIO_ERR_NOERROR) {
|
|
return retVal;
|
|
}
|
|
|
|
retVal = ax5043_init_registers_rx();
|
|
if (retVal != AXRADIO_ERR_NOERROR) {
|
|
return retVal;
|
|
}
|
|
|
|
retVal = ax5043_receiver_on_continuous();
|
|
if (retVal != AXRADIO_ERR_NOERROR) {
|
|
return retVal;
|
|
}
|
|
|
|
return AXRADIO_ERR_NOERROR;
|
|
}
|
|
|
|
|
|
uint8_t ax5043_off(void)
|
|
{
|
|
uint8_t retVal;
|
|
|
|
retVal = ax5043_off_xtal();
|
|
if (retVal != AXRADIO_ERR_NOERROR) {
|
|
return retVal;
|
|
}
|
|
|
|
ax5043WriteReg(AX5043_PWRMODE, AX5043_PWRSTATE_POWERDOWN);
|
|
|
|
return AXRADIO_ERR_NOERROR;
|
|
}
|
|
|
|
uint8_t ax5043_off_xtal(void)
|
|
{
|
|
ax5043WriteReg(AX5043_PWRMODE, AX5043_PWRSTATE_XTAL_ON);
|
|
ax5043WriteReg(AX5043_LPOSCCONFIG, 0x00); // LPOSC off
|
|
return AXRADIO_ERR_NOERROR;
|
|
}
|
|
|
|
uint8_t ax5043_init_registers_tx(void)
|
|
{
|
|
ax5043_set_registers_tx();
|
|
return ax5043_init_registers_common();
|
|
}
|
|
|
|
static uint8_t ax5043_init_registers_common(void)
|
|
{
|
|
uint8_t rng = axradio_phy_chanpllrng[0];
|
|
if (rng & 0x20)
|
|
return AXRADIO_ERR_RANGING;
|
|
if (ax5043ReadReg(AX5043_PLLLOOP) & 0x80) {
|
|
ax5043WriteReg(AX5043_PLLRANGINGB, rng & 0x0F);
|
|
} else {
|
|
ax5043WriteReg(AX5043_PLLRANGINGA, rng & 0x0F);
|
|
}
|
|
rng = axradio_get_pllvcoi();
|
|
if (rng & 0x80)
|
|
ax5043WriteReg(AX5043_PLLVCOI, rng);
|
|
|
|
return AXRADIO_ERR_NOERROR;
|
|
}
|
|
|
|
uint8_t axradio_get_pllvcoi(void)
|
|
{
|
|
if (axradio_phy_vcocalib) {
|
|
uint8_t x = axradio_phy_chanvcoi[0];
|
|
if (x & 0x80)
|
|
return x;
|
|
}
|
|
{
|
|
uint8_t x = axradio_phy_chanvcoiinit[0];
|
|
if (x & 0x80) {
|
|
if (!(axradio_phy_chanpllrnginit[0] & 0xF0)) {
|
|
x += (axradio_phy_chanpllrng[0] & 0x0F) - (axradio_phy_chanpllrnginit[0] & 0x0F);
|
|
x &= 0x3f;
|
|
x |= 0x80;
|
|
}
|
|
return x;
|
|
}
|
|
}
|
|
return ax5043ReadReg(AX5043_PLLVCOI);
|
|
}
|
|
|
|
uint8_t ax5043_init_registers_rx(void) {
|
|
ax5043_set_registers_rx();
|
|
return ax5043_init_registers_common();
|
|
|
|
}
|
|
|
|
uint8_t ax5043_receiver_on_continuous(void) {
|
|
uint8_t regValue;
|
|
|
|
ax5043WriteReg(AX5043_RSSIREFERENCE, axradio_phy_rssireference);
|
|
ax5043_set_registers_rxcont();
|
|
|
|
regValue = ax5043ReadReg(AX5043_PKTSTOREFLAGS);
|
|
regValue &= (uint8_t)~0x40;
|
|
ax5043WriteReg(AX5043_PKTSTOREFLAGS, regValue);
|
|
|
|
|
|
ax5043WriteReg(AX5043_FIFOSTAT, 3); // clear FIFO data & flags
|
|
ax5043WriteReg(AX5043_PWRMODE, AX5043_PWRSTATE_FULL_RX);
|
|
|
|
return AXRADIO_ERR_NOERROR;
|
|
}
|