forked from xuos/xiuos
feat add third_party_driver/spi/lora for hc32f4a0 board, send and receive function OK
This commit is contained in:
parent
107913cb61
commit
d0e42a9b51
|
@ -166,7 +166,7 @@ uint8_t Sx1276SpiCheck(void)
|
||||||
|
|
||||||
settings.SpreadingFactor = SX1276LoRaGetSpreadingFactor();
|
settings.SpreadingFactor = SX1276LoRaGetSpreadingFactor();
|
||||||
KPrintf("SpreadingFactor is %d\n",settings.SpreadingFactor);
|
KPrintf("SpreadingFactor is %d\n",settings.SpreadingFactor);
|
||||||
|
|
||||||
/*SPI confirm*/
|
/*SPI confirm*/
|
||||||
SX1276Write(REG_LR_HOPPERIOD, 0x91);
|
SX1276Write(REG_LR_HOPPERIOD, 0x91);
|
||||||
SX1276Read(REG_LR_HOPPERIOD, &test);
|
SX1276Read(REG_LR_HOPPERIOD, &test);
|
||||||
|
@ -430,12 +430,18 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN),
|
||||||
|
|
||||||
static void LoraReceive(void)
|
static void LoraReceive(void)
|
||||||
{
|
{
|
||||||
|
uint32 read_length = 0;
|
||||||
struct BusBlockReadParam read_param;
|
struct BusBlockReadParam read_param;
|
||||||
memset(&read_param, 0, sizeof(struct BusBlockReadParam));
|
memset(&read_param, 0, sizeof(struct BusBlockReadParam));
|
||||||
|
|
||||||
read_param.buffer = malloc(SPI_LORA_BUFFER_SIZE);
|
read_param.buffer = malloc(SPI_LORA_BUFFER_SIZE);
|
||||||
|
|
||||||
SpiLoraRead(dev, &read_param);
|
read_length = SpiLoraRead(dev, &read_param);
|
||||||
|
|
||||||
|
KPrintf("LoraReceive length %d\n", read_length);
|
||||||
|
for (int i = 0; i < read_length; i ++) {
|
||||||
|
KPrintf("i %d data 0x%x\n", i, ((uint8 *)read_param.buffer)[i]);
|
||||||
|
}
|
||||||
|
|
||||||
free(read_param.buffer);
|
free(read_param.buffer);
|
||||||
}
|
}
|
||||||
|
@ -453,6 +459,8 @@ static void LoraSend(int argc, char *argv[])
|
||||||
write_param.buffer = Msg;
|
write_param.buffer = Msg;
|
||||||
write_param.size = strlen(Msg);
|
write_param.size = strlen(Msg);
|
||||||
|
|
||||||
|
KPrintf("LoraSend data %s length %d\n", Msg, strlen(Msg));
|
||||||
|
|
||||||
SpiLoraWrite(dev, &write_param);
|
SpiLoraWrite(dev, &write_param);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,18 +312,17 @@ static uint32 SpiReadData(struct SpiHardwareDevice *spi_dev, struct SpiDataStand
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spi_datacfg->length) {
|
if (spi_datacfg->length) {
|
||||||
uint32_t *rx_buff = x_malloc(spi_datacfg->length * 4);
|
uint8_t *rx_buff = x_malloc(spi_datacfg->length);
|
||||||
if ((spi_datacfg->rx_buff) && (rx_buff)) {
|
if ((spi_datacfg->rx_buff) && (rx_buff)) {
|
||||||
memset(rx_buff, 0xFF, spi_datacfg->length * 4);
|
memset(rx_buff, 0xFF, spi_datacfg->length);
|
||||||
|
|
||||||
HwSpiEnable(spi);
|
HwSpiEnable(spi);
|
||||||
spi_read_status = SPI_Receive(spi, rx_buff, spi_datacfg->length, 1000);
|
spi_read_status = SPI_Receive(spi, rx_buff, spi_datacfg->length, 1000);
|
||||||
|
|
||||||
while (RESET != SPI_GetStatus(spi, SPI_FLAG_IDLE));
|
while (RESET != SPI_GetStatus(spi, SPI_FLAG_IDLE));
|
||||||
|
|
||||||
if (LL_OK == spi_read_status) {
|
if (LL_OK == spi_read_status) {
|
||||||
for (i = 0; i < spi_datacfg->length; i++) {
|
for (i = 0; i < spi_datacfg->length; i++) {
|
||||||
((uint8_t *)spi_datacfg->rx_buff)[i] = (uint8_t)rx_buff[i];
|
((uint8_t *)spi_datacfg->rx_buff)[i] = rx_buff[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -318,7 +318,7 @@ void SX1276LoRaSetOpMode( uint8_t opMode )
|
||||||
antennaSwitchTxOnPrev = antennaSwitchTxOn; // Antenna switch control
|
antennaSwitchTxOnPrev = antennaSwitchTxOn; // Antenna switch control
|
||||||
RXTX( antennaSwitchTxOn );
|
RXTX( antennaSwitchTxOn );
|
||||||
}
|
}
|
||||||
SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_MASK ) | opMode;
|
SX1276LR->RegOpMode = ( SX1276LR->RegOpMode & RFLR_OPMODE_MASK ) | opMode | RFLR_OPMODE_FREQMODE_ACCESS_LF;
|
||||||
|
|
||||||
SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode );
|
SX1276Write( REG_LR_OPMODE, SX1276LR->RegOpMode );
|
||||||
}
|
}
|
||||||
|
@ -416,160 +416,108 @@ void SX1276LoRaSetRFState( uint8_t state )
|
||||||
uint32_t SX1276LoRaProcess( void )
|
uint32_t SX1276LoRaProcess( void )
|
||||||
{
|
{
|
||||||
uint32_t result = RF_BUSY;
|
uint32_t result = RF_BUSY;
|
||||||
uint8_t regValue=0;
|
uint8_t regValue = 0;
|
||||||
|
|
||||||
switch( RFLRState )
|
switch( RFLRState )
|
||||||
{
|
{
|
||||||
case RFLR_STATE_IDLE:
|
case RFLR_STATE_IDLE:
|
||||||
break;
|
break;
|
||||||
case RFLR_STATE_RX_INIT:
|
case RFLR_STATE_RX_INIT:
|
||||||
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
|
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
|
||||||
|
SX1276LR->RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT |
|
||||||
SX1276LR->RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT |
|
//RFLR_IRQFLAGS_RXDONE |
|
||||||
|
RFLR_IRQFLAGS_PAYLOADCRCERROR |
|
||||||
RFLR_IRQFLAGS_PAYLOADCRCERROR |
|
RFLR_IRQFLAGS_VALIDHEADER |
|
||||||
RFLR_IRQFLAGS_VALIDHEADER |
|
RFLR_IRQFLAGS_TXDONE |
|
||||||
RFLR_IRQFLAGS_TXDONE |
|
RFLR_IRQFLAGS_CADDONE |
|
||||||
RFLR_IRQFLAGS_CADDONE |
|
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
|
||||||
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
|
RFLR_IRQFLAGS_CADDETECTED;
|
||||||
RFLR_IRQFLAGS_CADDETECTED;
|
SX1276Write( REG_LR_IRQFLAGSMASK, SX1276LR->RegIrqFlagsMask );
|
||||||
SX1276Write( REG_LR_IRQFLAGSMASK, SX1276LR->RegIrqFlagsMask );
|
|
||||||
|
|
||||||
if(LoRaSettings.FreqHopOn == true )
|
if(LoRaSettings.FreqHopOn == true )
|
||||||
{
|
{
|
||||||
SX1276LR->RegHopPeriod = LoRaSettings.HopPeriod;
|
SX1276LR->RegHopPeriod = LoRaSettings.HopPeriod;
|
||||||
|
|
||||||
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
||||||
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SX1276LR->RegHopPeriod = 255;
|
SX1276LR->RegHopPeriod = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
SX1276Write( REG_LR_HOPPERIOD, SX1276LR->RegHopPeriod );
|
SX1276Write( REG_LR_HOPPERIOD, SX1276LR->RegHopPeriod );
|
||||||
|
|
||||||
|
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
||||||
// RxDone
|
{
|
||||||
SX1276LR->RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_00;
|
SX1276LoRaSetOpMode( RFLR_OPMODE_RECEIVER_SINGLE );
|
||||||
// CadDetected
|
}
|
||||||
SX1276LR->RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_10 | RFLR_DIOMAPPING2_DIO5_00;
|
else // Rx continuous mode
|
||||||
|
{
|
||||||
SX1276WriteBuffer( REG_LR_DIOMAPPING1, &SX1276LR->RegDioMapping1, 2 );
|
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoRxBaseAddr;
|
||||||
|
|
||||||
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
|
||||||
{
|
|
||||||
SX1276LoRaSetOpMode( RFLR_OPMODE_RECEIVER_SINGLE );
|
|
||||||
}
|
|
||||||
else // Rx continuous mode
|
|
||||||
{
|
|
||||||
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoRxBaseAddr;
|
|
||||||
|
|
||||||
SX1276Write( REG_LR_FIFOADDRPTR, SX1276LR->RegFifoAddrPtr );
|
SX1276Write( REG_LR_FIFOADDRPTR, SX1276LR->RegFifoAddrPtr );
|
||||||
SX1276LoRaSetOpMode( RFLR_OPMODE_RECEIVER );
|
SX1276LoRaSetOpMode( RFLR_OPMODE_RECEIVER );
|
||||||
|
}
|
||||||
}
|
memset( RFBuffer, 0, ( size_t )RF_BUFFER_SIZE );
|
||||||
memset( RFBuffer, 0, ( size_t )RF_BUFFER_SIZE );
|
Rx_Time_Start=TickCounter;
|
||||||
Rx_Time_Start=TickCounter;
|
PacketTimeout = LoRaSettings.RxPacketTimeout;
|
||||||
PacketTimeout = LoRaSettings.RxPacketTimeout;
|
RxTimeoutTimer = GET_TICK_COUNT( );
|
||||||
RxTimeoutTimer = GET_TICK_COUNT( );
|
RFLRState = RFLR_STATE_RX_RUNNING;
|
||||||
RFLRState = RFLR_STATE_RX_RUNNING;
|
break;
|
||||||
break;
|
|
||||||
case RFLR_STATE_RX_RUNNING:
|
case RFLR_STATE_RX_RUNNING:
|
||||||
SX1276Read(0x12, ®Value);
|
SX1276Read(0x12, ®Value);
|
||||||
//if( DIO0 == 1 ) // RxDone
|
// RxDone
|
||||||
if(regValue & (1<<6))
|
if(regValue & (1<<6))
|
||||||
{
|
{
|
||||||
|
RxTimeoutTimer = GET_TICK_COUNT( );
|
||||||
RxTimeoutTimer = GET_TICK_COUNT( );
|
if( LoRaSettings.FreqHopOn == true )
|
||||||
if( LoRaSettings.FreqHopOn == true )
|
{
|
||||||
{
|
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
||||||
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
||||||
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
|
||||||
}
|
|
||||||
// Clear Irq
|
|
||||||
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE );
|
|
||||||
RFLRState = RFLR_STATE_RX_DONE;
|
|
||||||
}
|
|
||||||
//if( DIO2 == 1 ) // FHSS Changed Channel
|
|
||||||
if(regValue & (1<<1))
|
|
||||||
{
|
|
||||||
RxTimeoutTimer = GET_TICK_COUNT( );
|
|
||||||
if( LoRaSettings.FreqHopOn == true )
|
|
||||||
{
|
|
||||||
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
|
||||||
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
|
||||||
}
|
|
||||||
// Clear Irq
|
|
||||||
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
|
|
||||||
//RxGain = SX1276LoRaReadRxGain( );
|
|
||||||
}
|
|
||||||
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
|
||||||
{
|
|
||||||
if( ( GET_TICK_COUNT( ) - RxTimeoutTimer ) > PacketTimeout )
|
|
||||||
{
|
|
||||||
RFLRState = RFLR_STATE_RX_TIMEOUT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case RFLR_STATE_RX_DONE:
|
|
||||||
|
|
||||||
|
|
||||||
SX1276Read( REG_LR_IRQFLAGS, &SX1276LR->RegIrqFlags );
|
|
||||||
if( ( SX1276LR->RegIrqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR ) == RFLR_IRQFLAGS_PAYLOADCRCERROR )
|
|
||||||
{
|
|
||||||
// Clear Irq
|
|
||||||
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR );
|
|
||||||
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
|
||||||
{
|
|
||||||
RFLRState = RFLR_STATE_RX_INIT;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RFLRState = RFLR_STATE_RX_RUNNING;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* {
|
|
||||||
uint8_t rxSnrEstimate;
|
|
||||||
|
|
||||||
SX1276Read( REG_LR_PKTSNRVALUE, &rxSnrEstimate );
|
|
||||||
if( rxSnrEstimate & 0x80 )
|
|
||||||
{
|
|
||||||
|
|
||||||
RxPacketSnrEstimate = ( ( ~rxSnrEstimate + 1 ) & 0xFF ) >> 2;
|
|
||||||
RxPacketSnrEstimate = -RxPacketSnrEstimate;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RxPacketSnrEstimate = ( rxSnrEstimate & 0xFF ) >> 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( LoRaSettings.RFFrequency < 860000000 )
|
|
||||||
{
|
|
||||||
if( RxPacketSnrEstimate < 0 )
|
|
||||||
{
|
|
||||||
|
|
||||||
RxPacketRssiValue = NOISE_ABSOLUTE_ZERO + 10.0 * SignalBwLog[LoRaSettings.SignalBw] + NOISE_FIGURE_LF + ( double )RxPacketSnrEstimate;
|
|
||||||
}
|
}
|
||||||
else
|
// Clear Irq
|
||||||
{
|
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE );
|
||||||
SX1276Read( REG_LR_PKTRSSIVALUE, &SX1276LR->RegPktRssiValue );
|
RFLRState = RFLR_STATE_RX_DONE;
|
||||||
RxPacketRssiValue = RssiOffsetLF[LoRaSettings.SignalBw] + ( double )SX1276LR->RegPktRssiValue;
|
}
|
||||||
|
// FHSS Changed Channel
|
||||||
|
if(regValue & (1<<1))
|
||||||
|
{
|
||||||
|
RxTimeoutTimer = GET_TICK_COUNT( );
|
||||||
|
if( LoRaSettings.FreqHopOn == true )
|
||||||
|
{
|
||||||
|
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
||||||
|
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
||||||
|
}
|
||||||
|
// Clear Irq
|
||||||
|
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
|
||||||
|
//RxGain = SX1276LoRaReadRxGain( );
|
||||||
|
}
|
||||||
|
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
||||||
|
{
|
||||||
|
if( ( GET_TICK_COUNT( ) - RxTimeoutTimer ) > PacketTimeout )
|
||||||
|
{
|
||||||
|
RFLRState = RFLR_STATE_RX_TIMEOUT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
break;
|
||||||
{
|
case RFLR_STATE_RX_DONE:
|
||||||
if( RxPacketSnrEstimate < 0 )
|
SX1276Read( REG_LR_IRQFLAGS, &SX1276LR->RegIrqFlags );
|
||||||
|
if( ( SX1276LR->RegIrqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR ) == RFLR_IRQFLAGS_PAYLOADCRCERROR )
|
||||||
|
{
|
||||||
|
// Clear Irq
|
||||||
|
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR );
|
||||||
|
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
||||||
{
|
{
|
||||||
RxPacketRssiValue = NOISE_ABSOLUTE_ZERO + 10.0 * SignalBwLog[LoRaSettings.SignalBw] + NOISE_FIGURE_HF + ( double )RxPacketSnrEstimate;
|
RFLRState = RFLR_STATE_RX_INIT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SX1276Read( REG_LR_PKTRSSIVALUE, &SX1276LR->RegPktRssiValue );
|
RFLRState = RFLR_STATE_RX_RUNNING;
|
||||||
RxPacketRssiValue = RssiOffsetHF[LoRaSettings.SignalBw] + ( double )SX1276LR->RegPktRssiValue;
|
|
||||||
}
|
}
|
||||||
}*/
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
||||||
{
|
{
|
||||||
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoRxBaseAddr;
|
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoRxBaseAddr;
|
||||||
|
@ -581,160 +529,148 @@ uint32_t SX1276LoRaProcess( void )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
SX1276Read( REG_LR_NBRXBYTES, &SX1276LR->RegNbRxBytes );
|
SX1276Read( REG_LR_NBRXBYTES, &SX1276LR->RegNbRxBytes );
|
||||||
RxPacketSize = SX1276LR->RegNbRxBytes;
|
RxPacketSize = SX1276LR->RegNbRxBytes;
|
||||||
SX1276ReadFifo( RFBuffer, SX1276LR->RegNbRxBytes );
|
SX1276ReadFifo( RFBuffer, SX1276LR->RegNbRxBytes );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // Rx continuous mode
|
else // Rx continuous mode
|
||||||
{
|
{
|
||||||
|
SX1276Read( REG_LR_FIFORXCURRENTADDR, &SX1276LR->RegFifoRxCurrentAddr );
|
||||||
SX1276Read( REG_LR_FIFORXCURRENTADDR, &SX1276LR->RegFifoRxCurrentAddr );
|
if( LoRaSettings.ImplicitHeaderOn == true )
|
||||||
if( LoRaSettings.ImplicitHeaderOn == true )
|
{
|
||||||
{
|
RxPacketSize = SX1276LR->RegPayloadLength;
|
||||||
RxPacketSize = SX1276LR->RegPayloadLength;
|
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoRxCurrentAddr;
|
||||||
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoRxCurrentAddr;
|
SX1276Write( REG_LR_FIFOADDRPTR, SX1276LR->RegFifoAddrPtr );
|
||||||
SX1276Write( REG_LR_FIFOADDRPTR, SX1276LR->RegFifoAddrPtr );
|
SX1276ReadFifo( RFBuffer, SX1276LR->RegPayloadLength );
|
||||||
SX1276ReadFifo( RFBuffer, SX1276LR->RegPayloadLength );
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
SX1276Read( REG_LR_NBRXBYTES, &SX1276LR->RegNbRxBytes );
|
||||||
SX1276Read( REG_LR_NBRXBYTES, &SX1276LR->RegNbRxBytes );
|
RxPacketSize = SX1276LR->RegNbRxBytes;
|
||||||
RxPacketSize = SX1276LR->RegNbRxBytes;
|
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoRxCurrentAddr;
|
||||||
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoRxCurrentAddr;
|
SX1276Write( REG_LR_FIFOADDRPTR, SX1276LR->RegFifoAddrPtr );
|
||||||
SX1276Write( REG_LR_FIFOADDRPTR, SX1276LR->RegFifoAddrPtr );
|
SX1276ReadFifo( RFBuffer, SX1276LR->RegNbRxBytes );
|
||||||
SX1276ReadFifo( RFBuffer, SX1276LR->RegNbRxBytes );
|
}
|
||||||
}
|
}
|
||||||
}
|
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
||||||
if( LoRaSettings.RxSingleOn == true ) // Rx single mode
|
{
|
||||||
{
|
RFLRState = RFLR_STATE_RX_INIT;
|
||||||
RFLRState = RFLR_STATE_RX_INIT;
|
}
|
||||||
}
|
else // Rx continuous mode
|
||||||
else // Rx continuous mode
|
{
|
||||||
{
|
RFLRState = RFLR_STATE_RX_RUNNING;
|
||||||
RFLRState = RFLR_STATE_RX_RUNNING;
|
}
|
||||||
}
|
Rx_Time_End=TickCounter;
|
||||||
Rx_Time_End=TickCounter;
|
result = RF_RX_DONE;
|
||||||
result = RF_RX_DONE;
|
break;
|
||||||
break;
|
|
||||||
case RFLR_STATE_RX_TIMEOUT:
|
case RFLR_STATE_RX_TIMEOUT:
|
||||||
RFLRState = RFLR_STATE_RX_INIT;
|
RFLRState = RFLR_STATE_RX_INIT;
|
||||||
result = RF_RX_TIMEOUT;
|
result = RF_RX_TIMEOUT;
|
||||||
break;
|
break;
|
||||||
case RFLR_STATE_TX_INIT:
|
case RFLR_STATE_TX_INIT:
|
||||||
|
Tx_Time_Start = TickCounter;
|
||||||
Tx_Time_Start=TickCounter;
|
|
||||||
SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
|
// Initializes the payload size
|
||||||
if( LoRaSettings.FreqHopOn == true )
|
SX1276LR->RegPayloadLength = TxPacketSize;
|
||||||
{
|
SX1276Write( REG_LR_PAYLOADLENGTH, SX1276LR->RegPayloadLength );
|
||||||
SX1276LR->RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT |
|
|
||||||
RFLR_IRQFLAGS_RXDONE |
|
SX1276LR->RegFifoTxBaseAddr = 0x00; // Full buffer used for Tx
|
||||||
RFLR_IRQFLAGS_PAYLOADCRCERROR |
|
SX1276Write( REG_LR_FIFOTXBASEADDR, SX1276LR->RegFifoTxBaseAddr );
|
||||||
RFLR_IRQFLAGS_VALIDHEADER |
|
|
||||||
//RFLR_IRQFLAGS_TXDONE |
|
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoTxBaseAddr;
|
||||||
RFLR_IRQFLAGS_CADDONE |
|
SX1276Write( REG_LR_FIFOADDRPTR, SX1276LR->RegFifoAddrPtr );
|
||||||
//RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
|
|
||||||
RFLR_IRQFLAGS_CADDETECTED;
|
SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
|
||||||
SX1276LR->RegHopPeriod = LoRaSettings.HopPeriod;
|
|
||||||
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
// Write payload buffer to LORA modem
|
||||||
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
SX1276WriteFifo( TFBuffer, SX1276LR->RegPayloadLength );
|
||||||
|
|
||||||
|
if( LoRaSettings.FreqHopOn == true )
|
||||||
|
{
|
||||||
|
SX1276LR->RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT |
|
||||||
|
RFLR_IRQFLAGS_RXDONE |
|
||||||
|
RFLR_IRQFLAGS_PAYLOADCRCERROR |
|
||||||
|
RFLR_IRQFLAGS_VALIDHEADER |
|
||||||
|
//RFLR_IRQFLAGS_TXDONE |
|
||||||
|
RFLR_IRQFLAGS_CADDONE |
|
||||||
|
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
|
||||||
|
RFLR_IRQFLAGS_CADDETECTED;
|
||||||
|
SX1276LR->RegHopPeriod = LoRaSettings.HopPeriod;
|
||||||
|
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
||||||
|
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
SX1276LR->RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT |
|
||||||
SX1276LR->RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT |
|
RFLR_IRQFLAGS_RXDONE |
|
||||||
RFLR_IRQFLAGS_RXDONE |
|
RFLR_IRQFLAGS_PAYLOADCRCERROR |
|
||||||
RFLR_IRQFLAGS_PAYLOADCRCERROR |
|
RFLR_IRQFLAGS_VALIDHEADER |
|
||||||
RFLR_IRQFLAGS_VALIDHEADER |
|
//RFLR_IRQFLAGS_TXDONE |
|
||||||
//RFLR_IRQFLAGS_TXDONE |
|
RFLR_IRQFLAGS_CADDONE |
|
||||||
RFLR_IRQFLAGS_CADDONE |
|
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
|
||||||
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL |
|
RFLR_IRQFLAGS_CADDETECTED;
|
||||||
RFLR_IRQFLAGS_CADDETECTED;
|
SX1276LR->RegHopPeriod = 0;
|
||||||
SX1276LR->RegHopPeriod = 0;
|
}
|
||||||
}
|
SX1276Write( REG_LR_HOPPERIOD, SX1276LR->RegHopPeriod );
|
||||||
SX1276Write( REG_LR_HOPPERIOD, SX1276LR->RegHopPeriod );
|
SX1276Write( REG_LR_IRQFLAGSMASK, SX1276LR->RegIrqFlagsMask );
|
||||||
SX1276Write( REG_LR_IRQFLAGSMASK, SX1276LR->RegIrqFlagsMask );
|
|
||||||
// Initializes the payload size
|
|
||||||
SX1276LR->RegPayloadLength = TxPacketSize;
|
|
||||||
SX1276Write( REG_LR_PAYLOADLENGTH, SX1276LR->RegPayloadLength );
|
|
||||||
|
|
||||||
SX1276LR->RegFifoTxBaseAddr = 0x00; // Full buffer used for Tx
|
|
||||||
SX1276Write( REG_LR_FIFOTXBASEADDR, SX1276LR->RegFifoTxBaseAddr );
|
|
||||||
|
|
||||||
SX1276LR->RegFifoAddrPtr = SX1276LR->RegFifoTxBaseAddr;
|
SX1276Write( REG_LR_DIOMAPPING1, ( regValue & RFLR_DIOMAPPING1_DIO0_MASK ) | RFLR_DIOMAPPING1_DIO0_01 );//DIO0设置为TXdone中断
|
||||||
SX1276Write( REG_LR_FIFOADDRPTR, SX1276LR->RegFifoAddrPtr );
|
|
||||||
// Write payload buffer to LORA modem
|
|
||||||
SX1276WriteFifo( TFBuffer, SX1276LR->RegPayloadLength );
|
|
||||||
// TxDone RxTimeout FhssChangeChannel ValidHeader
|
|
||||||
SX1276LR->RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_01;
|
|
||||||
// PllLock Mode Ready
|
|
||||||
SX1276LR->RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_01 | RFLR_DIOMAPPING2_DIO5_00;
|
|
||||||
|
|
||||||
SX1276WriteBuffer( REG_LR_DIOMAPPING1, &SX1276LR->RegDioMapping1, 2 );
|
|
||||||
|
|
||||||
SX1276LoRaSetOpMode( RFLR_OPMODE_TRANSMITTER );
|
SX1276LoRaSetOpMode( RFLR_OPMODE_TRANSMITTER );
|
||||||
|
|
||||||
RFLRState = RFLR_STATE_TX_RUNNING;
|
RFLRState = RFLR_STATE_TX_RUNNING;
|
||||||
break;
|
break;
|
||||||
case RFLR_STATE_TX_RUNNING:
|
case RFLR_STATE_TX_RUNNING:
|
||||||
SX1276Read(0x12,®Value);
|
SX1276Read(0x12, ®Value);
|
||||||
//if( DIO0 == 1 ) // TxDone
|
if(regValue & (1<<3))
|
||||||
if(regValue & (1<<3))
|
{
|
||||||
{
|
// Clear Irq
|
||||||
// Clear Irq
|
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE );
|
||||||
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE );
|
RFLRState = RFLR_STATE_TX_DONE;
|
||||||
RFLRState = RFLR_STATE_TX_DONE;
|
}
|
||||||
}
|
// FHSS Changed Channel
|
||||||
//if( DIO2 == 1 ) // FHSS Changed Channel
|
if(regValue & (1<<3))
|
||||||
if(regValue & (1<<3))
|
{
|
||||||
{
|
if( LoRaSettings.FreqHopOn == true )
|
||||||
if( LoRaSettings.FreqHopOn == true )
|
{
|
||||||
{
|
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
||||||
SX1276Read( REG_LR_HOPCHANNEL, &SX1276LR->RegHopChannel );
|
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
||||||
SX1276LoRaSetRFFrequency( HoppingFrequencies[SX1276LR->RegHopChannel & RFLR_HOPCHANNEL_CHANNEL_MASK] );
|
}
|
||||||
}
|
// Clear Irq
|
||||||
// Clear Irq
|
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
|
||||||
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL );
|
}
|
||||||
}
|
break;
|
||||||
break;
|
|
||||||
case RFLR_STATE_TX_DONE:
|
case RFLR_STATE_TX_DONE:
|
||||||
Tx_Time_End=TickCounter;
|
Tx_Time_End=TickCounter;
|
||||||
SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
|
SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
|
||||||
RFLRState = RFLR_STATE_IDLE;
|
RFLRState = RFLR_STATE_IDLE;
|
||||||
result = RF_TX_DONE;
|
result = RF_TX_DONE;
|
||||||
break;
|
break;
|
||||||
case RFLR_STATE_CAD_INIT:
|
case RFLR_STATE_CAD_INIT:
|
||||||
// optimize the power consumption by switching off the transmitter as soon as the packet has been sent
|
// optimize the power consumption by switching off the transmitter as soon as the packet has been sent
|
||||||
SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
|
SX1276LoRaSetOpMode( RFLR_OPMODE_STANDBY );
|
||||||
SX1276LR->RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT |
|
SX1276LR->RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT |
|
||||||
RFLR_IRQFLAGS_RXDONE |
|
RFLR_IRQFLAGS_RXDONE |
|
||||||
RFLR_IRQFLAGS_PAYLOADCRCERROR |
|
RFLR_IRQFLAGS_PAYLOADCRCERROR |
|
||||||
RFLR_IRQFLAGS_VALIDHEADER |
|
RFLR_IRQFLAGS_VALIDHEADER |
|
||||||
RFLR_IRQFLAGS_TXDONE |
|
RFLR_IRQFLAGS_TXDONE |
|
||||||
//RFLR_IRQFLAGS_CADDONE |
|
//RFLR_IRQFLAGS_CADDONE |
|
||||||
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL;
|
RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL;
|
||||||
//RFLR_IRQFLAGS_CADDETECTED;
|
//RFLR_IRQFLAGS_CADDETECTED;
|
||||||
SX1276Write( REG_LR_IRQFLAGSMASK, SX1276LR->RegIrqFlagsMask );
|
SX1276Write( REG_LR_IRQFLAGSMASK, SX1276LR->RegIrqFlagsMask );
|
||||||
|
|
||||||
// RxDone RxTimeout FhssChangeChannel CadDone
|
SX1276LoRaSetOpMode( RFLR_OPMODE_CAD );
|
||||||
SX1276LR->RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_00;
|
RFLRState = RFLR_STATE_CAD_RUNNING;
|
||||||
// CAD Detected ModeReady
|
|
||||||
SX1276LR->RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00;
|
|
||||||
SX1276WriteBuffer( REG_LR_DIOMAPPING1, &SX1276LR->RegDioMapping1, 2 );
|
|
||||||
|
|
||||||
|
break;
|
||||||
SX1276LoRaSetOpMode( RFLR_OPMODE_CAD );
|
|
||||||
RFLRState = RFLR_STATE_CAD_RUNNING;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case RFLR_STATE_CAD_RUNNING:
|
case RFLR_STATE_CAD_RUNNING:
|
||||||
SX1276Read(0x12,®Value);
|
SX1276Read(0x12,®Value);
|
||||||
int cad_done = regValue & (1<<2);
|
int cad_done = regValue & (1<<2);
|
||||||
int cad_detected = regValue & (1<<0);
|
int cad_detected = regValue & (1<<0);
|
||||||
|
|
||||||
if( cad_done ) //CAD Done interrupt
|
if( cad_done ) //CAD Done interrupt
|
||||||
{
|
{
|
||||||
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE );
|
SX1276Write( REG_LR_IRQFLAGS, RFLR_IRQFLAGS_CADDONE );
|
||||||
if( cad_detected ) // CAD Detected interrupt
|
if( cad_detected ) // CAD Detected interrupt
|
||||||
{
|
{
|
||||||
|
@ -749,10 +685,10 @@ uint32_t SX1276LoRaProcess( void )
|
||||||
RFLRState = RFLR_STATE_IDLE;
|
RFLRState = RFLR_STATE_IDLE;
|
||||||
result = RF_CHANNEL_EMPTY;
|
result = RF_CHANNEL_EMPTY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue