1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/lupyuen-LoRaMac-node-nuttx

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
sx1272-board.c 8.6 КБ
Копировать Редактировать Исходные данные Просмотреть построчно История
Miguel Luis Отправлено 4 лет назад f8d1950
/*!
* \file sx1272-board.c
*
* \brief Target board SX1272 driver implementation
*
* \copyright Revised BSD License, see section \ref LICENSE.
*
* \code
* ______ _
* / _____) _ | |
* ( (____ _____ ____ _| |_ _____ ____| |__
* \____ \| ___ | (_ _) ___ |/ ___) _ \
* _____) ) ____| | | || |_| ____( (___| | | |
* (______/|_____)_|_|_| \__)_____)\____)_| |_|
* (C)2013-2017 Semtech
*
* \endcode
*
* \author Miguel Luis ( Semtech )
*
* \author Gregory Cristian ( Semtech )
*/
#include <stdlib.h>
#include "utilities.h"
#include "board-config.h"
#include "delay.h"
#include "radio.h"
#include "sx1272-board.h"
/*!
* Flag used to set the RF switch control pins in low power mode when the radio is not active.
*/
static bool RadioIsActive = false;
/*!
* Radio driver structure initialization
*/
const struct Radio_s Radio =
{
SX1272Init,
SX1272GetStatus,
SX1272SetModem,
SX1272SetChannel,
SX1272IsChannelFree,
SX1272Random,
SX1272SetRxConfig,
SX1272SetTxConfig,
SX1272CheckRfFrequency,
SX1272GetTimeOnAir,
SX1272Send,
SX1272SetSleep,
SX1272SetStby,
SX1272SetRx,
SX1272StartCad,
SX1272SetTxContinuousWave,
SX1272ReadRssi,
SX1272Write,
SX1272Read,
SX1272WriteBuffer,
SX1272ReadBuffer,
SX1272SetMaxPayloadLength,
SX1272SetPublicNetwork,
SX1272GetWakeupTime,
NULL, // void ( *IrqProcess )( void )
NULL, // void ( *RxBoosted )( uint32_t timeout ) - SX126x Only
NULL, // void ( *SetRxDutyCycle )( uint32_t rxTime, uint32_t sleepTime ) - SX126x Only
};
/*!
* Antenna switch GPIO pins objects
*/
Gpio_t RadioSwitchCtrl1;
Gpio_t RadioSwitchCtrl2;
Gpio_t RadioPwrAmpCtrl;
/*!
* Debug GPIO pins objects
*/
#if defined( USE_RADIO_DEBUG )
Gpio_t DbgPinTx;
Gpio_t DbgPinRx;
#endif
/*
PD_2=0 PD_2=1
op PaB rfo rfo
0 4.6 18.5 27.0
1 5.6 21.1 28.1
2 6.7 23.3 29.1
3 7.7 25.3 30.1
4 8.8 26.2 30.7
5 9.8 27.3 31.2
6 10.7 28.1 31.6
7 11.7 28.6 32.2
8 12.8 29.2 32.4
9 13.7 29.9 32.9
10 14.7 30.5 33.1
11 15.6 30.8 33.4
12 16.4 30.9 33.6
13 17.1 31.0 33.7
14 17.8 31.1 33.7
15 18.4 31.1 33.7
*/
// txpow: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
static const uint8_t PaBTable[20] = { 0, 0, 0, 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15 };
// txpow: 20 21 22 23 24 25 26 27 28 29 30
static const uint8_t RfoTable[11] = { 1, 1, 1, 2, 2, 3, 4, 5, 6, 8, 9 };
void SX1272IoInit( void )
{
GpioInit( &SX1272.Spi.Nss, RADIO_NSS, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 );
GpioInit( &SX1272.DIO0, RADIO_DIO_0, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &SX1272.DIO1, RADIO_DIO_1, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &SX1272.DIO2, RADIO_DIO_2, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &SX1272.DIO3, RADIO_DIO_3, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &SX1272.DIO4, RADIO_DIO_4, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &SX1272.DIO5, RADIO_DIO_5, PIN_INPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
}
void SX1272IoIrqInit( DioIrqHandler **irqHandlers )
{
GpioSetInterrupt( &SX1272.DIO0, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[0] );
GpioSetInterrupt( &SX1272.DIO1, IRQ_RISING_FALLING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[1] );
GpioSetInterrupt( &SX1272.DIO2, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[2] );
GpioSetInterrupt( &SX1272.DIO3, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[3] );
GpioSetInterrupt( &SX1272.DIO4, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[4] );
GpioSetInterrupt( &SX1272.DIO5, IRQ_RISING_EDGE, IRQ_HIGH_PRIORITY, irqHandlers[5] );
}
void SX1272IoDeInit( void )
{
GpioInit( &SX1272.Spi.Nss, RADIO_NSS, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 );
GpioInit( &SX1272.DIO0, RADIO_DIO_0, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &SX1272.DIO1, RADIO_DIO_1, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &SX1272.DIO2, RADIO_DIO_2, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &SX1272.DIO3, RADIO_DIO_3, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &SX1272.DIO4, RADIO_DIO_4, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &SX1272.DIO5, RADIO_DIO_5, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
}
void SX1272IoDbgInit( void )
{
#if defined( USE_RADIO_DEBUG )
GpioInit( &DbgPinTx, RADIO_DBG_PIN_TX, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
GpioInit( &DbgPinRx, RADIO_DBG_PIN_RX, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
#endif
}
void SX1272IoTcxoInit( void )
{
// No TCXO component available on this board design.
}
void SX1272SetBoardTcxo( uint8_t state )
{
// No TCXO component available on this board design.
#if 0
if( state == true )
{
TCXO_ON( );
DelayMs( BOARD_TCXO_WAKEUP_TIME );
}
else
{
TCXO_OFF( );
}
#endif
}
uint32_t SX1272GetBoardTcxoWakeupTime( void )
{
return BOARD_TCXO_WAKEUP_TIME;
}
void SX1272Reset( void )
{
// Enables the TCXO if available on the board design
SX1272SetBoardTcxo( true );
// Set RESET pin to 1
GpioInit( &SX1272.Reset, RADIO_RESET, PIN_OUTPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 );
// Wait 1 ms
DelayMs( 1 );
// Configure RESET as input
GpioInit( &SX1272.Reset, RADIO_RESET, PIN_INPUT, PIN_PUSH_PULL, PIN_NO_PULL, 1 );
// Wait 6 ms
DelayMs( 6 );
}
void SX1272SetRfTxPower( int8_t power )
{
uint8_t paConfig = 0;
uint8_t paDac = 0;
paConfig = Radio.Read( REG_PACONFIG );
paDac = Radio.Read( REG_PADAC );
if( power > 19 )
{
paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | RF_PACONFIG_PASELECT_RFO;
paConfig = ( paConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | RfoTable[power - 20];
}
else
{
paConfig = ( paConfig & RF_PACONFIG_PASELECT_MASK ) | RF_PACONFIG_PASELECT_PABOOST;
paConfig = ( paConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) | PaBTable[MAX( power, 0 )];
}
Radio.Write( REG_PACONFIG, paConfig );
Radio.Write( REG_PADAC, paDac );
}
void SX1272SetAntSwLowPower( bool status )
{
if( RadioIsActive != status )
{
RadioIsActive = status;
if( status == false )
{
SX1272AntSwInit( );
}
else
{
SX1272AntSwDeInit( );
}
}
}
void SX1272AntSwInit( void )
{
GpioInit( &RadioSwitchCtrl1, RADIO_SWITCH_CTRL1, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &RadioSwitchCtrl2, RADIO_SWITCH_CTRL2, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &RadioPwrAmpCtrl , RADIO_PWRAMP_CTRL , PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
}
void SX1272AntSwDeInit( void )
{
GpioInit( &RadioSwitchCtrl1, RADIO_SWITCH_CTRL1, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &RadioSwitchCtrl2, RADIO_SWITCH_CTRL2, PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
GpioInit( &RadioPwrAmpCtrl , RADIO_PWRAMP_CTRL , PIN_OUTPUT, PIN_PUSH_PULL, PIN_PULL_UP, 0 );
}
void SX1272SetAntSw( uint8_t opMode )
{
switch( opMode )
{
case RFLR_OPMODE_TRANSMITTER:
if( ( Radio.Read( REG_PACONFIG ) & RF_PACONFIG_PASELECT_PABOOST ) == RF_PACONFIG_PASELECT_PABOOST )
{
GpioWrite( &RadioSwitchCtrl1, 1 );
GpioWrite( &RadioSwitchCtrl2, 0 );
}
else
{
GpioWrite( &RadioSwitchCtrl1, 0 );
GpioWrite( &RadioSwitchCtrl2, 1 );
}
break;
case RFLR_OPMODE_RECEIVER:
case RFLR_OPMODE_RECEIVER_SINGLE:
case RFLR_OPMODE_CAD:
GpioWrite( &RadioSwitchCtrl1, 1 );
GpioWrite( &RadioSwitchCtrl2, 1 );
break;
default:
GpioWrite( &RadioSwitchCtrl1, 0 );
GpioWrite( &RadioSwitchCtrl2, 0 );
GpioWrite( &RadioPwrAmpCtrl, 0 );
break;
}
}
bool SX1272CheckRfFrequency( uint32_t frequency )
{
// Implement check. Currently all frequencies are supported
return true;
}
uint32_t SX1272GetDio1PinState( void )
{
return GpioRead( &SX1272.DIO1 );
}
#if defined( USE_RADIO_DEBUG )
void SX1272DbgPinTxWrite( uint8_t state )
{
GpioWrite( &DbgPinTx, state );
}
void SX1272DbgPinRxWrite( uint8_t state )
{
GpioWrite( &DbgPinRx, state );
}
#endif

Комментарий ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/lupyuen-LoRaMac-node-nuttx.git
git@gitlife.ru:oschina-mirror/lupyuen-LoRaMac-node-nuttx.git
oschina-mirror
lupyuen-LoRaMac-node-nuttx
lupyuen-LoRaMac-node-nuttx
v4.5.2