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