单片机型号:STM32L053R8T6
本文详述将SX1268官方驱动程序,移植到C++程序设计框架的方法。
1、文件结构
在系统中加入以下文件。
2、屏蔽和硬件相关的数据类型
sx126x.h文件,屏蔽以下语句。暂时屏蔽,后续需要解决。
typedef struct SX126x_s
{
// Gpio_t Reset;
// Gpio_t BUSY;
// Gpio_t DIO1;
// Gpio_t DIO2;
// Gpio_t DIO3;
// Spi_t Spi;
PacketParams_t PacketParams;
PacketStatus_t PacketStatus;
ModulationParams_t ModulationParams;
}SX126x_t;
3、解决TxTimeoutTimer定时器
系统中搜索TxTimeoutTimer定时器,在以下程序中出现。
其在初始化时,指定TxTimeoutTimer定时器的回调函数。
void RadioInit( RadioEvents_t *events )
{
RadioEvents = events;
SX126xInit( RadioOnDioIrq );
SX126xSetStandby( STDBY_RC );
SX126xSetRegulatorMode( USE_DCDC );
SX126xSetBufferBaseAddress( 0x00, 0x00 );
SX126xSetTxParams( 0, RADIO_RAMP_200_US );
SX126xSetDioIrqParams( IRQ_RADIO_ALL, IRQ_RADIO_ALL, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Initialize driver timeout timers
TimerInit( &TxTimeoutTimer, RadioOnTxTimeoutIrq );
TimerInit( &RxTimeoutTimer, RadioOnRxTimeoutIrq );
IrqFired = false;
}
在数据发送函数中,指定定时器延时时间,并启动定时器。
void RadioSend( uint8_t *buffer, uint8_t size )
{
SX126xSetDioIrqParams( IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT,
IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT,
IRQ_RADIO_NONE,
IRQ_RADIO_NONE );
if( SX126xGetPacketType( ) == PACKET_TYPE_LORA )
{
SX126x.PacketParams.Params.LoRa.PayloadLength = size;
}
else
{
SX126x.PacketParams.Params.Gfsk.PayloadLength = size;
}
SX126xSetPacketParams( &SX126x.PacketParams );
SX126xSendPayload( buffer, size, 0 );
TimerSetValue( &TxTimeoutTimer, TxTimeout );
TimerStart( &TxTimeoutTimer );
}
在中断处理的IRQ_TX_DONE和IRQ_RX_TX_TIMEOUT事件中,停止定时器。IRQ_TX_DONE是指数据发送完毕,IRQ_RX_TX_TIMEOUT是指发送或接收延时时间到。
可见其正常处理流程是,我发送数据时,让TxTimeoutTimer启动,数据发送完毕或者芯片提示发送超时,都将定时器停止。只有芯片给出不正常反应时,才调用TxTimeoutTimer回调函数,以完成错误处理。
void RadioIrqProcess( void )
{
if( IrqFired == true )
{
BoardDisableIrq( );
IrqFired = false;
BoardEnableIrq( );
uint16_t irqRegs = SX126xGetIrqStatus( );
SX126xClearIrqStatus( IRQ_RADIO_ALL );
if( ( irqRegs & IRQ_TX_DONE ) == IRQ_TX_DONE )
{
TimerStop( &TxTimeoutTimer );
if( ( RadioEvents != NULL ) && ( RadioEvents->TxDone != NULL ) )
{
RadioEvents->TxDone( );
}
}
if( ( irqRegs & IRQ_RX_DONE ) == IRQ_RX_DONE )
{
uint8_t size;
TimerStop( &RxTimeoutTimer );
SX126xGetPayload( RadioRxPayload, &size , 255 );
SX126xGetPacketStatus( &RadioPktStatus );
if( ( RadioEvents != NULL ) && ( RadioEvents->RxDone != NULL ) )
{
RadioEvents->RxDone( RadioRxPayload, size, RadioPktStatus.Params.LoRa.RssiPkt, RadioPktStatus.Params.LoRa.SnrPkt );
}
}
if( ( irqRegs & IRQ_CRC_ERROR ) == IRQ_CRC_ERROR )
{
if( ( RadioEvents != NULL ) && ( RadioEvents->RxError ) )
{
RadioEvents->RxError( );
}
}
if( ( irqRegs & IRQ_CAD_DONE ) == IRQ_CAD_DONE )
{
if( ( RadioEvents != NULL ) && ( RadioEvents->CadDone != NULL ) )
{
RadioEvents->CadDone( ( ( irqRegs & IRQ_CAD_ACTIVITY_DETECTED ) == IRQ_CAD_ACTIVITY_DETECTED ) );
}
}
if( ( irqRegs & IRQ_RX_TX_TIMEOUT ) == IRQ_RX_TX_TIMEOUT )
{
if( SX126xGetOperatingMode( ) == MODE_TX )
{
TimerStop( &TxTimeoutTimer );
if( ( RadioEvents != NULL ) && ( RadioEvents->TxTimeout != NULL ) )
{
RadioEvents->TxTimeout( );
}
}
else if( SX126xGetOperatingMode( ) == MODE_RX )
{
TimerStop( &RxTimeoutTimer );
if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )
{
RadioEvents->RxTimeout( );
}
}
}
if( ( irqRegs & IRQ_PREAMBLE_DETECTED ) == IRQ_PREAMBLE_DETECTED )
{
//__NOP( );
}
if( ( irqRegs & IRQ_SYNCWORD_VALID ) == IRQ_SYNCWORD_VALID )
{
//__NOP( );
}
if( ( irqRegs & IRQ_HEADER_VALID ) == IRQ_HEADER_VALID )
{
//__NOP( );
}
if( ( irqRegs & IRQ_HEADER_ERROR ) == IRQ_HEADER_ERROR )
{
TimerStop( &RxTimeoutTimer );
if( ( RadioEvents != NULL ) && ( RadioEvents->RxTimeout != NULL ) )
{
RadioEvents->RxTimeout( );
}
}
}
}
4、解决RxTimeoutTimer定时器
其在RadioRx函数中,设置定时器延时并启动了定时器。
void RadioRx( uint32_t timeout )
{
SX126xSetDioIrqParams( IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT,
IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT,
IRQ_RADIO_NONE,
IRQ_RADIO_NONE );
if( timeout != 0 )
{
TimerSetValue( &RxTimeoutTimer, timeout );
TimerStart( &RxTimeoutTimer );
}
if( RxContinuous == true )
{
SX126xSetRx( 0xFFFFFF ); // Rx Continuous
}
else
{
SX126xSetRx( RxTimeout << 6 );
}
}
其在RadioRxBoosted函数中,设置定时器延时并启动了定时器。
void RadioRxBoosted( uint32_t timeout )
{
SX126xSetDioIrqParams( IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT,
IRQ_RADIO_ALL, //IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT,
IRQ_RADIO_NONE,
IRQ_RADIO_NONE );
if( timeout != 0 )
{
TimerSetValue( &RxTimeoutTimer, timeout );
TimerStart( &RxTimeoutTimer );
}
if( RxContinuous == true )
{
SX126xSetRxBoosted( 0xFFFFFF ); // Rx Continuous
}
else
{
SX126xSetRxBoosted( RxTimeout << 6 );
}
}
其在RadioSetTxContinuousWave函数中,设置定时器延时并启动了定时器。
void RadioSetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time )
{
SX126xSetRfFrequency( freq );
SX126xSetRfTxPower( power );
上一篇:STM32开发笔记94: 忽略PlatformIO中的特定警告
下一篇:STM32开发笔记92: SX1268驱动程序设计(时钟)
推荐阅读最新更新时间:2024-11-11 12:28
设计资源 培训 开发板 精华推荐
- LT3089EFE 基准缓冲器的典型应用电路
- ADA4062-2ARMZ-RL运算放大器用作陷波滤波器电路的典型应用电路
- LTC3441 的典型应用 - 大电流微功率同步降压-升压型 DC/DC 转换器
- STM32F429NI MCU的评估板
- Sg3526 驱动 N 沟道功率 MOSFET 的典型应用
- LT6656ACS6-2.048、2.048V 低功率 ADC 电压基准的典型应用
- DAP42-单芯片板载DAPLINK解决方案
- 使用具有 B 类 EMI 滤波(双输出)的 RP10-4812DA DC/DC 转换器的典型应用
- TND6288/D、50W 直接交流 LED 驱动器模拟调光(低压线 ADIM)参考设计
- DC900A-01V,用于 LTC2255 和 LT1993-2 (6dB) ADC 信号调理的组合演示板