/********************************** (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"); }