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.
 
 
 
 

789 lines
28 KiB

/********************************** (C) COPYRIGHT *******************************
* File Name : Main.c
* Author : WCH
* Version : V1.0
* Date : 2020/08/06
* Description : 串口1收发演示
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "CH59x_common.h"
#include "CH59x_timer.h"
#include "../My_text/Ping_pong.h"
#include "../AT/AT_H.h"
#include "../AT/uart.h"
#include "../AT/CFG.h"
#include "../StdPeriphDriver/sx1280_divce/ch592_board.h"
extern void sx1280IoInit(void);
void sleep( void );
bool DUG_falg=false;
void lora_init( void );
uint8_t TxBuff[] = "tang 123 \r\n";
uint8_t trigB;
SleepParams_t SleepParams_t_1={
.WakeUpRTC = 1, // 允许从RTC唤醒
.InstructionRamRetention = 1, // 保留指令RAM
.DataBufferRetention = 0, // 不保留数据缓冲区
.DataRamRetention = 1 // 保留数据RAM
};
struct _uart_rx_str_{
uint8_t *rx_buff; //接收缓存数组
uint8_t max_buff_size; //接收缓存数组最大长度,越界报错
uint8_t rx_index; //已缓存数组下标
uint8_t rx_done; //在接收超时中断中置位,表示接收完成
uint8_t trig_num; //接收FIFO触发字节数
};
uint8_t u1_rx_Buff[100];
typedef struct _uart_rx_str_ uart_rx_str;
uart_rx_str u1_rx_str = {.rx_buff = u1_rx_Buff, .max_buff_size = sizeof u1_rx_Buff}; //定义接收结构体并部分初始化
void DebugInit(void)
{
GPIOA_SetBits(GPIO_Pin_9);
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); // RXD-配置上拉输入
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
UART1_DefInit();
UART1_ByteTrigCfg(UART_7BYTE_TRIG);
trigB = 7;
UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
PFIC_EnableIRQ(UART1_IRQn);
}
volatile uint32_t TickCounter;
//#define A_DEBUG ;
/*********************************************************************
* @fn main
*
* @brief 主函数
*
* @return none
*/
PacketParams_t packetParams;
PacketStatus_t packetStatus;
#if 0
int main()
{
SetSysClock(CLK_SOURCE_PLL_60MHz);
//--------------GPIO初始化------------------------------
//GPIOB_SetBits(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14);
//GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeOut_PP_20mA);// 输出
//GPIOB_ModeCfg(GPIO_Pin_13, GPIO_ModeIN_PD); //BUY 输入
//GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeIN_PD);// DIO1 i/o
//
//GPIOB_ITModeCfg(GPIO_Pin_14,GPIO_ITMode_RiseEdge);
//PFIC_EnableIRQ(GPIO_B_IRQn);
//--单片机--硬件---SPI初始化-----------------------------------
/*
* MOSI 输出 PA14
*
* SCK 输出 pA13
* CS 输出 pA12 输出
* MISO 输入 pA15
* busy pb15
* rest pa6
* */
DebugInit();
//BUSY
GPIOB_SetBits(GPIO_Pin_14);
GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeIN_PU);
//REST
GPIOB_SetBits(GPIO_Pin_15);
GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeOut_PP_20mA);
//dio 1
GPIOB_SetBits(GPIO_Pin_13);
GPIOB_ModeCfg(GPIO_Pin_13, GPIO_ITMode_RiseEdge|GPIO_ITMode_FallEdge);
PFIC_EnableIRQ(GPIO_B_IRQn);
GPIOA_SetBits(GPIO_Pin_15);
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_Floating);
GPIOA_SetBits(GPIO_Pin_14);
GPIOA_ModeCfg(GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12, GPIO_ModeOut_PP_20mA);
SPI0_MasterDefInit();
//
// 单字节发送
// //BUSY
// GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeIN_PU);
// //DIO1
// GPIOB_ModeCfg(GPIO_Pin_13, GPIO_ModeIN_PD);
// GPIOB_ITModeCfg(GPIO_Pin_13, GPIO_ITMode_RiseEdge);
// PFIC_EnableIRQ(GPIO_B_IRQn);
// //SPI
// GPIOA_SetBits(GPIO_Pin_12);
// GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA); // 12:cs,13:clk,14:mosi,15:miso
// SPI0_MasterDefInit();
//-------------串口初始化---------------------------
//GPIOA_SetBits(GPIO_Pin_9);
//GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU); // RXD-配置上拉输入
//GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); // TXD-配置推挽输出,注意先让IO口输出高电平
//UART1_DefInit();
//
//UART1_ByteTrigCfg(UART_7BYTE_TRIG);
//trigB = 7;
//UART1_INTCfg(ENABLE, RB_IER_RECV_RDY | RB_IER_LINE_STAT);
//PFIC_EnableIRQ(UART1_IRQn);
//----------------DIO引脚中断----------------------------
//GPIOB_SetBits(GPIO_Pin_15);
//GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeOut_PP_5mA);
//
//TMR0_TimerInit(FREQ_SYS *10/ 10); // 设置定时时间 100ms
//TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断
//PFIC_EnableIRQ(TMR0_IRQn);
//------------------------------------------------
//uint16_t aa=GPIOB_ReadPortPin(GPIO_Pin_15);
//while(1){
//
// printf("aa=%d\r\n",aa);
//}
//-------------------------------------------------
// bool isMaster = true;
// ModulationParams_t modulationParams;
while(1){
Radio.Init( &Callbacks ); //即 sx1280 init SX1280HalInit
Radio.SetRegulatorMode( USE_DCDC ); // Can also be set in LDO mode but consume more power
memset( &Buffer, 0x00, BufferSize );
printf( "\n\n\r SX1280 Ping Pong Demo Application. %s\n\n\r", FIRMWARE_VERSION );
printf( "\n\n\r Radio firmware version 0x%x\n\n\r", Radio.GetFirmwareVersion( ) );
printf( "\nPing Pong running in LORA mode\n\r" );
// modulationParams.PacketType = PACKET_TYPE_LORA;
// modulationParams.Params.LoRa.SpreadingFactor = LORA_SF7;
// modulationParams.Params.LoRa.Bandwidth = LORA_BW_1600;
// modulationParams.Params.LoRa.CodingRate = LORA_CR_LI_4_7;
//
// packetParams.PacketType = PACKET_TYPE_LORA;
// packetParams.Params.LoRa.PreambleLength = 12;
// packetParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH;
// packetParams.Params.LoRa.PayloadLength = BUFFER_SIZE;
// packetParams.Params.LoRa.CrcMode = LORA_CRC_ON;
// packetParams.Params.LoRa.InvertIQ = LORA_IQ_NORMAL;
// Radio.SetStandby( STDBY_RC );
// Radio.SetPacketType( modulationParams.PacketType );
//
//
// Radio.SetModulationParams( &modulationParams ); //lora参数
// Radio.SetPacketParams( &packetParams );
// Radio.SetRfFrequency( RF_FREQUENCY );
// Radio.SetBufferBaseAddresses( 0x00, 0x00 );
// Radio.SetTxParams( TX_OUTPUT_POWER, RADIO_RAMP_02_US );
//
// Radio.SetRegistersDefault();
Radio.WriteRegister(0x00,0x99);
Radio.ReadRegister(0x00);
// printf( "\n\n\r SX1280 Ping Pong Demo Application. %s\n\n\r", FIRMWARE_VERSION );
printf( "\n\n\r Radio firmware version 0x%x\n\n\r", Radio.GetFirmwareVersion( ) );
printf( "\n\n\r ReadRegister ReadRegister version 0x%x\n\n\r", Radio.ReadRegister(0x00));
// Radio.SetDioIrqParams( IRQ_RADIO_ALL, IRQ_RADIO_ALL, IRQ_RADIO_NONE, IRQ_RADIO_NONE );//配置数字输入/输出引脚(DIOs)和中断源(IRQs)
// Radio.SetTx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); //通过发送指令 SetTx(periodBase, periodBaseCount[15:8], periodBaseCount[7:0]) 将收发器设置为发射模式以开始传输
DelayMs(500);
}
SX1280SetPollingMode( );
// }
#if 0
while(1)
{
while( 1 )
{
SX1280ProcessIrqs( );
switch( AppState )
{
case APP_RX:
// printf("this is RX \r\n");
AppState = APP_LOWPOWER;
Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
SX1280GetPacketStatus(&packetStatus);
#if defined( MODE_BLE )
// Remove the 2st bytes that are BLE header from Buffer
memcpy( Buffer, Buffer+2, PINGPONGSIZE );
#endif // MODE_BLE
if(isMaster == true )
{
if( BufferSize > 0 )
{
if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, PINGPONGSIZE ) == 0 )
{
printf( "...Pong\r\n" );
#if defined( MODE_BLE )
memcpy( Buffer, ble_header_adv.Serial, 2 );
memcpy( Buffer+2, PingMsg, PINGPONGSIZE );
#else
memcpy( Buffer, PingMsg, PINGPONGSIZE );
#endif
Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
}
else if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, PINGPONGSIZE ) == 0 )
{
// A master already exists then become a slave
printf( "...Ping - switch to Slave\r\n" );
isMaster = false;
#if defined( MODE_BLE )
memcpy( Buffer, ble_header_adv.Serial, 2 );
memcpy( Buffer+2, PongMsg, PINGPONGSIZE );
#else
memcpy( Buffer, PongMsg, PINGPONGSIZE );
#endif
Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
}
else // valid reception but neither a PING or a PONG message
{ // Set device as master ans start again
isMaster = true;
#if defined( MODE_BLE )
memcpy( Buffer, ble_header_adv.Serial, 2 );
memcpy( Buffer+2, PongMsg, PINGPONGSIZE );
Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
#else
Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } );
#endif
}
}
}
else
{
if( BufferSize > 0 )
{
if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, PINGPONGSIZE ) == 0 )
{
printf( "...Ping\r\n" );
#if defined( MODE_BLE )
ble_header_adv.Fields.length = PINGPONGSIZE + 2;
memcpy( Buffer, ble_header_adv.Serial, 2 );
memcpy( Buffer+2, PongMsg, PINGPONGSIZE );
#else
memcpy( Buffer, PongMsg, PINGPONGSIZE );
#endif
Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
}
else // valid reception but not a PING as expected
{
printf( "...Unexpected packet - switch to master\r\n" );
isMaster = true;
Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } );
}
}
}
break;
case APP_TX:
printf("this is TX \r\n");
// AppState = APP_LOWPOWER;
if( isMaster == true )
{
printf( "Ping...\r\n" );
}
else
{
printf( "Pong...\r\n" );
}
Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );//配置数字输入/输出引脚(DIOs)和中断源(IRQs)
Radio.SetTx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); //通过发送指令 SetTx(periodBase, periodBaseCount[15:8], periodBaseCount[7:0]) 将收发器设置为发射模式以开始传输
break;
case APP_RX_TIMEOUT:
printf("this is RX_Timeout \r\n");
AppState = APP_LOWPOWER;
if( isMaster == true )
{
// Send the next PING frame
#if defined( MODE_BLE )
ble_header_adv.Fields.length = PINGPONGSIZE + 2;
memcpy( Buffer, ble_header_adv.Serial, 2 );
memcpy( Buffer+2, PingMsg, PINGPONGSIZE );
#else
memcpy( Buffer, PingMsg, PINGPONGSIZE );
#endif
Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_TX_DONE, IRQ_TX_DONE );
Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
}
else
{
Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } );
}
break;
case APP_RX_ERROR:
printf("this is RX_ERR \r\n");
AppState = APP_LOWPOWER;
// We have received a Packet with a CRC error, send reply as if packet was correct
if( isMaster == true )
{
// Send the next PING frame
#if defined( MODE_BLE )
ble_header_adv.Fields.length = PINGPONGSIZE + 2;
memcpy( Buffer, ble_header_adv.Serial, 2 );
memcpy( Buffer+2, PingMsg, PINGPONGSIZE );
#else
memcpy( Buffer, PingMsg, PINGPONGSIZE );
#endif
Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
}
else
{
// Send the next PONG frame
#if defined( MODE_BLE )
ble_header_adv.Fields.length = PINGPONGSIZE + 2;
memcpy( Buffer, ble_header_adv.Serial, 2 );
memcpy( Buffer+2, PongMsg, PINGPONGSIZE );
#else
memcpy( Buffer, PongMsg, PINGPONGSIZE );
#endif
Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
}
break;
case APP_TX_TIMEOUT:
printf("this is TX_timeout \r\n");
AppState = APP_LOWPOWER;
Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } );
break;
case APP_LOWPOWER:
printf("lowpower \r\n");
break;
default:
// Set low power
break;
}
}
}
#endif
}
#endif
RadioCallbacks_t sx1280Callback={
.rxDone=OnRxDone,
.txDone=OnTxDone,
.txTimeout=OnTxTimeout,
.rxTimeout=OnTxTimeout,
// &OnTxDone, // txDone
// &OnRxDone, // rxDone
// NULL, // syncWordDone
// NULL, // headerDone
// &OnTxTimeout, // txTimeout
// &OnRxTimeout, // rxTimeout
// &OnRxError, // rxError
// NULL, // rangingDone
// NULL, // cadDone
};
int main()
{
SetSysClock(CLK_SOURCE_PLL_60MHz);
DebugInit();
sx1280IoInit();
//---------WWDG----------------
// WWDG_SetCounter(0);//喂狗
// WWDG_ClearFlag();//清除中断标志
// WWDG_ResetCfg(ENABLE);//使能看门狗复位
//------Rtc---
LClk32K_Select(Clk32K_LSI);
RTC_InitTime(2024,6,27,12,00,00); //初始化RTC时间
PFIC_EnableIRQ(RTC_IRQn);
// TMR0_TimerInit((FREQ_SYS /10)); // 设置定时时间 100ms
// TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断
// PFIC_EnableIRQ(TMR0_IRQn);
// PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Long_Delay ); //RTC使能唤醒功能
// 休眠模式
PWR_DCDCCfg(ENABLE);
lora_init();
// Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Radio.SendPayload((uint8_t*)"12345",5, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE });
#ifdef A_DEBUG
#endif
AppState = APP_LOWPOWER;
while(1) {
// WWDG_SetCounter(0);//喂狗
// SX1280ProcessIrqs( );
if (DUG_falg==true) {
DUG_falg=false;
Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
Radio.SendPayload((uint8_t*)"12345",5, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE });
}
// sleep();
//
// switch( AppState )
// {
// case APP_RX:
// AppState = APP_LOWPOWER;
// Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
// for ( int var = 0; var < BufferSize; ++ var) {
// printf("Buffe=%d",Buffer[var]);
// }
// printf("\r\n");
// SX1280GetPacketStatus(&packetStatus);
//
// Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
//
//
// break;
//
// case APP_TX:
//
//
// AppState = APP_LOWPOWER;
// Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, 0xffff } );
// break;
//
// case APP_RX_TIMEOUT:
// AppState = APP_LOWPOWER;
// if( isMaster == true )
// {
// // Send the next PING frame
//
// memcpy( Buffer, PingMsg, PINGPONGSIZE );
//
// Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
// }
// else
// {
// Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } );
// }
// break;
//
// case APP_RX_ERROR:
// AppState = APP_LOWPOWER;
// // We have received a Packet with a CRC error, send reply as if packet was correct
// if( isMaster == true )
// {
// // Send the next PING frame
//
// memcpy( Buffer, PingMsg, PINGPONGSIZE );
//
// Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
// }
// else
// {
// // Send the next PONG frame
//
// memcpy( Buffer, PongMsg, PINGPONGSIZE );
//
// Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Radio.SendPayload( Buffer, BufferSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } );
// }
// break;
//
// case APP_TX_TIMEOUT:
// AppState = APP_LOWPOWER;
// Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } );
// break;
//
// case APP_LOWPOWER:
// if(TickCounter>2000)
// {
// TickCounter=0;
//
// AppState = APP_RX_ERROR;
// }
//
// break;
//
// default:
// // Set low power
// break;
// }
// }
}
}
extern void SX1280HalWakeup(void);
void sleep( void )
{
SleepParams_t sleepConfig={
sleepConfig.WakeUpRTC =0,
sleepConfig.InstructionRamRetention =1,
sleepConfig.DataBufferRetention =1,
sleepConfig.DataRamRetention =1};
Radio.SetSleep(sleepConfig);
sx1280Io_DEInit();
#if 0
GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
GPIOA_ModeCfg(RADIO_SCK_PIN, GPIO_ModeIN_PD);
GPIOB_ModeCfg(RADIO_DIO1_PIN, GPIO_ModeIN_PD);
#endif
LowPower_Sleep(RB_PWR_RAM24K | RB_PWR_RAM2K ); //只保留24+2K SRAM 供电
HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流)
sx1280IoInit();
SX1280HalWakeup( );
DebugInit();
lora_init();
}
/*********************************************************************/
void OnTxDone( void )
{
AppState = APP_TX;
TickCounter=0;
printf( "<>>>>>>>>OnTxDone\r\n" );
//RTC_TRIGFunCfg(32768*1*20); // 1s*60 定时1s
sleep( );
}
void OnRxDone( void )
{
AppState = APP_RX;
TickCounter=0;
printf( "<>>>>>>>>OnRxDone\n\r" );
}
void OnTxTimeout( void )
{
AppState = APP_TX_TIMEOUT;
TickCounter=0;
sleep( );
printf( "<>>>>>>>>TXE\n\r" );
// Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
// Radio.SendPayload((uint8_t*)"12345",5, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE });
}
void OnRxTimeout( void )
{ TickCounter=0;
AppState = APP_RX_TIMEOUT;
printf( "<>>>>>>>>OnRxTimeout\n\r" );
sleep( );
//Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } );
// Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, 0xFFFF } );
}
void OnRxError( IrqErrorCode_t errorCode )
{ TickCounter=0;
AppState = APP_RX_ERROR;
printf( "RXE<>>>>>>>>\n\r" );
// Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } );
}
void OnCadDone( bool channelActivityDetected )
{
printf( "<>>>>>>>>OnCadDone\n\r" );
}
/*********串口1中断*******************************************************************/
//----------------------------------------
__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler(void)
{
//PFIC_DisableIRQ(UART1_IRQn);
volatile uint8_t i;
uint8_t tmpRxBuff[100];
switch(UART1_GetITFlag())
{
case UART_II_LINE_STAT: // 线路状态错误
{
//UART1_GetLinSTA();
printf("line eer\r\n");
break;
}
case UART_II_RECV_RDY: // 数据达到设置触发点
printf("TRIG\r\n");
for(i = 0; i != 6; i++)//设置为7字节触发,但是只取6字节,保证一定能进超时回调
{
tmpRxBuff[i] = UART1_RecvByte();
}
memcpy(&RxBuff[RxLen],tmpRxBuff,i);
RxLen=RxLen+i;
break;
case UART_II_RECV_TOUT: // 接收超时,暂时一帧数据接收完成
printf("Time out\r\n");
RxLen = RxLen+UART1_RecvString(&RxBuff[RxLen]);
UART1_SendString(tmpRxBuff,RxLen);
is_recive_data=true;
break;
case UART_II_THR_EMPTY: // 发送缓存区空,可继续发送
printf("buffrt empty \r\n");
break;
case UART_II_MODEM_CHG: // 只支持串口0
break;
default:
break;
}
}
void lora_init( void )
{
Radio.Init( &Callbacks );
Radio.SetRegulatorMode( USE_LDO ); // Can also be set in LDO mode but consume more power
memset( &Buffer, 0x00, BufferSize );
ModulationParams_t modulationParams;
modulationParams.PacketType = PACKET_TYPE_LORA;
modulationParams.Params.LoRa.SpreadingFactor = LORA_SF12;
modulationParams.Params.LoRa.Bandwidth = LORA_BW_1600;
modulationParams.Params.LoRa.CodingRate = LORA_CR_LI_4_7;
packetParams.PacketType = PACKET_TYPE_LORA;
packetParams.Params.LoRa.PreambleLength = 12;
packetParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH;
packetParams.Params.LoRa.PayloadLength = BUFFER_SIZE;
packetParams.Params.LoRa.CrcMode = LORA_CRC_ON;
packetParams.Params.LoRa.InvertIQ = LORA_IQ_NORMAL;
uint8_t Sync[] = {0xaa, 0xbb, 0xcc, 0xdd};
SX1280SetSyncWord(1, Sync); //RADIO_RX_MATCH_SYNCWORD_3
SX1280SetSyncWordErrorTolerance(0); //同步字检测中容忍0位错误
printf( "...Ping1\r\n" );
Radio.SetStandby( STDBY_RC );
switch(modulationParams.Params.LoRa.SpreadingFactor){
case LORA_SF5:
case LORA_SF6:
Radio.WriteRegister(0x0925,0x1E);
break;
case LORA_SF7:
case LORA_SF8:
Radio.WriteRegister(0x0925,0x37);
break;
case LORA_SF9:
case LORA_SF10:
case LORA_SF11:
case LORA_SF12:
Radio.WriteRegister(0x0925,0x32);
break;
}
Radio.SetPacketType( modulationParams.PacketType );
Radio.SetModulationParams( &modulationParams ); //lora参数
Radio.SetPacketParams( &packetParams );
Radio.SetRfFrequency( RF_FREQUENCY );
Radio.SetBufferBaseAddresses( 0x00, 0x00 );
Radio.SetTxParams(TX_OUTPUT_POWER , RADIO_RAMP_02_US );
SX1280SetPollingMode( );
}
void SysTick_Handler(void)
{
TickCounter++;
}
//--------------DIO中断回调------------------------
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void GPIOB_IRQHandler(void)
{
printf("+++GPIOB_IRQHandler+++ \r\n");
GPIOB_ClearITFlagBit(RADIO_DIO1_PIN);
SX1280OnDioIrq() ;
}
//-----------------------------------------------------
__INTERRUPT
__HIGH_CODE
void TMR0_IRQHandler(void)
{
if(TMR0_GetITFlag(TMR0_3_IT_CYC_END))
{
TMR0_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中断标志
}
}
//-----------------------------------------------------
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void RTC_IRQHandler(void)
{
RTC_ClearITFlag(RTC_TRIG_EVENT);
DUG_falg=true;
printf("RTC Timing... \r\n");
}