有沒有人用sx1278自組網 做畢業設計呢 現在就只做了一個點對點 還沒有劃分信道 考慮用時分多址 要求抓包顯示資料 怎么辦 有大神嗎
uj5u.com熱心網友回復:
#include <iostm8s103f3.h>#include "My_type.h"
#include "main.h"
#include "sx1276-LoRa.h"
void UART1_init(void)
{
UART1_CR2=0;
UART1_SR=0;
UART1_CR1=0;
UART1_CR3=0;
UART1_BRR2 = 0x00; // 設定波特率19200
UART1_BRR1 = 0x1A; // 8M/2400 = 0x1A0
UART1_CR2=0x00;//
}
void TIM1_init(void)
{
TIM1_PSCRH = 0x1F; // 8M系統時鐘經預分頻f=fck/(PSCR+1)
TIM1_PSCRL = 0x3F; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每個計數周期1ms
TIM1_ARRH = 0x00; // 自動多載暫存器ARR=0x01F4=500
TIM1_ARRL = 0x64; // 每記數100次產生一次中斷,即100ms
TIM1_IER = 0x01; // 允許更新中斷
TIM1_CR1 = 0x01; // 計數器使能,開始計數
}
void EXTI_init(void)
{
EXTI_CR1 = 0x40; // PD口上升沿觸發中斷 //平時DIO0 是L,收到一包資料并且CRC正確后,DIO0 變為H
}
void Sx1276EV_IO_Inital()
{
//S_Tx
PC_DDR_DDR1=0;//S_Tx
PC_CR1_C11=1; ////PULL-UP-INPUT
PC_CR2_C21=0; //
//S_Rx
PC_DDR_DDR1=0;//S_Rx
PC_CR1_C11=1; ////PULL-UP-INPUT
PC_CR2_C21=0; //
//S_BW10
PA_DDR_DDR1=0;//
PA_CR1_C11=1; ////PULL-UP-INPUT
PA_CR2_C21=0;
//S_BW62
PA_DDR_DDR2=0;//
PA_CR1_C12=1; ////PULL-UP-INPUT
PA_CR2_C22=0;
//S_BW125
PB_DDR_DDR3=0;//
PB_CR1_C13=1; ////PULL-UP-INPUT
PB_CR2_C23=0;
//S_FSK
PB_DDR_DDR7=0;//
PB_CR1_C17=1; ////PULL-UP-INPUT
PB_CR2_C27=0;
}
void KeyRead( void )
{
u8 ReadData;
Flg_S_BW10=1;//S_BW10;//
Flg_S_BW62=1;//S_BW62;//
Flg_S_BW125=0;//S_BW125;//
Flg_S_FSK=1;//S_FSK;//
Flg_S_Tx=0;//S_Tx;
Flg_S_Rx=1;//S_Rx;
ReadData=https://bbs.csdn.net/topics/Flg^0xff;
Trg = ReadData & (ReadData ^ Cont);
Cont = ReadData;
Cont &= 0x1F;
if((Cont!=ContBak)&&(ContBak!=0xff))
WWDG_CR=0X8F;//STM8 軟體復位整個系統
}
void SX1276_Parameters_Select()
{
ContBak=Cont;
if((Cont&0x10)==cTx_Statue )
{
Tx_phase=SetTx_Parameters;
}
else
{
Rx_phase=Rx_Parameters_Set;
}
switch(Cont&0x0F)
{
case 1:
/****BW 選擇*********/
gb_BW=1;//10.4K BW
//gb_BW=2;//15.6K BW
//gb_BW=3;//20.8K BW
//gb_BW=4;//31.2K BW
//gb_BW=5;//41.7K BW
//gb_BW=6;//62.5K BW
//gb_BW=7;//125KHz BW
/****BW 選擇結束*********/
/*******SF 選擇*********/
//gb_SF=0;// SF=6; 64 chips / symbol
//gb_SF=1;// SF=7; 128 chips / symbol
//gb_SF=2;// SF=8; 256 chips / symbol
//gb_SF=3;// SF=9; 9 512 chips / symbol
gb_SF=4;////SF=10; 1024 chips / symbol
//gb_SF=5;////SF=11; 2048 chips / symbol
//gb_SF=6;//SF=12; 4096 chips / symbol
/****SF 選擇結束*********/
/*******CR 選擇*********/
//CR=1;//// Error coding rate=4/5
CR=2;//// Error coding rate=4/6
//CR=3;//// Error coding rate=4/7
//CR=4;//// Error coding rate=4/8
/*******CR 選擇結束*********/
break;
case 2:
/****BW 選擇*********/
//gb_BW=1;//10.4K BW
//gb_BW=2;//15.6K BW
//gb_BW=3;//20.8K BW
//gb_BW=4;//31.2K BW
//gb_BW=5;//41.7K BW
gb_BW=6;//62.5K BW
//gb_BW=7;//125KHz BW
/****BW 選擇結束*********/
//gb_SF=0;// SF=6; 64 chips / symbol
//gb_SF=1;// SF=7; 128 chips / symbol
//gb_SF=2;// SF=8; 256 chips / symbol
//gb_SF=3;// SF=9; 9 512 chips / symbol
//gb_SF=4;////SF=10; 1024 chips / symbol
gb_SF=5;////SF=11; 2048 chips / symbol
//gb_SF=6;//SF=12; 4096 chips / symbol
/*******CR 選擇*********/
//CR=1;//// Error coding rate=4/5
CR=2;//// Error coding rate=4/6
//CR=3;//// Error coding rate=4/7
//CR=4;//// Error coding rate=4/8
/*******CR 選擇結束*********/
break;
case 4: //125KHz BW SF=10; Error coding rate=4/6
/****BW 選擇*********/
//gb_BW=1;//10.4K BW
//gb_BW=2;//15.6K BW
//gb_BW=3;//20.8K BW
//gb_BW=4;//31.2K BW
//gb_BW=5;//41.7K BW
//gb_BW=6;//62.5K BW
gb_BW=7;//125KHz BW
/****BW 選擇結束*********/
/*******SF 選擇*********/
//gb_SF=0;// SF=6; 64 chips / symbol
//gb_SF=1;// SF=7; 128 chips / symbol
//gb_SF=2;// SF=8; 256 chips / symbol
//gb_SF=3;// SF=9; 9 512 chips / symbol
gb_SF=4;////SF=10; 1024 chips / symbol
//gb_SF=5;////SF=11; 2048 chips / symbol
//gb_SF=6;//SF=12; 4096 chips / symbol
/****SF 選擇結束*********/
/*******CR 選擇*********/
//CR=1;//// Error coding rate=4/5
CR=2;//// Error coding rate=4/6
//CR=3;//// Error coding rate=4/7
//CR=4;//// Error coding rate=4/8
/*******CR 選擇結束*********/
break;
case 8:
//FSK
break;
default://10.4K SF=7; cr=4/6
/****BW 選擇*********/
gb_BW=1;//10.4K BW
//gb_BW=2;//15.6K BW
//gb_BW=3;//20.8K BW
//gb_BW=4;//31.2K BW
//gb_BW=5;//41.7K BW
//gb_BW=6;//62.5K BW
//gb_BW=7;//125KHz BW
/****BW 選擇結束*********/
/*******SF 選擇*********/
//gb_SF=0;// SF=6; 64 chips / symbol
gb_SF=1;// SF=7; 128 chips / symbol
//gb_SF=2;// SF=8; 256 chips / symbol
//gb_SF=3;// SF=9; 9 512 chips / symbol
//gb_SF=4;////SF=10; 1024 chips / symbol
//gb_SF=5;////SF=11; 2048 chips / symbol
//gb_SF=6;//SF=12; 4096 chips / symbol
/****SF 選擇結束*********/
/*******CR 選擇*********/
//CR=1;//// Error coding rate=4/5
CR=2;//// Error coding rate=4/6
//CR=3;//// Error coding rate=4/7
//CR=4;//// Error coding rate=4/8
/*******CR 選擇結束*********/
break;
}
}
void Uart_Prints(uint8 * pd)
{
while((*pd)!='\0')
{
send_char_com(*pd);
pd++;
}
}
/**********************************************************
//保留1位小數,i就應該<2, 2位小數,i<4; 3位小數,i<5;
//dividend-被除數(分母) divisor-除數(分子)
**********************************************************/
void Float_Division(uint16 dividend,uint16 divisor )
{
uint8 i;
for(i = 0; i < 5;i++)
{
D_value[i] = dividend/divisor;
dividend = dividend%divisor;
if(dividend > 0)
{
dividend = dividend *10;
}
}
}
void HexToAscii_AndUartSent(uint8 Hex)
{
uint8 Ascii[3];
Ascii[0]=(Hex/100)+0x30;
Ascii[1]=((Hex%100)/10)+0x30;
Ascii[2]=(Hex%10)+0x30;
send_char_com(Ascii[0]);
send_char_com(Ascii[1]);
send_char_com(Ascii[2]);
}
void PER_Proc()
{
uint8 p_total;
uint8 p_lost;
switch(PER_phase)//SetTx_Parameters
{
case PerStart:
RxPacketCout=1;
PacketNuStart.U8[MSB]=gb_RxData[0];
PacketNuStart.U8[LSB]=gb_RxData[1];
PER_phase=PerGoOn;//payload
Uart_Prints((u8 *)cPerStart);
break;
case PerGoOn:
RxPacketCout++;
PacketNuNow.U8[MSB]=gb_RxData[0];//MSB
PacketNuNow.U8[LSB]=gb_RxData[1];
Uart_Prints((u8 *)cGET);
HexToAscii_AndUartSent(RxPacketCout);
Uart_Prints((u8 *)cToatl);
p_total=(PacketNuNow.U16-PacketNuStart.U16+1);
HexToAscii_AndUartSent(p_total);
Uart_Prints((u8 *)cLost);
p_lost=p_total-RxPacketCout;
HexToAscii_AndUartSent(p_lost);
Uart_Prints((u8 *)cPer);
Float_Division(p_lost,p_total);///值放在D_value[5]里面,D_value[0] 最高位 //PER=(p_lost/p_total);
send_char_com(D_value[0]+0x30);
send_char_com(0x2e);//小數點
send_char_com(D_value[1]+0x30);
send_char_com(D_value[2]+0x30);
send_char_com(D_value[3]+0x30);
send_char_com(D_value[4]+0x30);
send_char_com(0x0D);//換行
send_char_com(0x0A);//換行
if(PacketNuNow.U16<PacketNuStart.U16)
PER_phase=PerStart;
if((PacketNuNow.U16-PacketNuStart.U16)>=99)
PER_phase=PerStart;
break;
case PerDone:
break;
}
}
void main( void )
{
CLK_CKDIVR = 0x08; // 16M內部RC經2分頻后系統時鐘為8M
asm("sim"); // 關全域中斷
Sx1276EV_IO_Inital(); //EVB IO 初始化
TIM1_init();
EXTI_init();
UART1_init();
Sx1276M_GpioInt();//SX1276 IO初始化
RF_RST=1;
Sx1276VerNO = SPIRead((u8)(REG_LR_VERSION>>8));//獲取SX1276 版本號 0X11(V1A版本 工程版)或者0X12(V1B 正式版)
LED_RX=1;
LED_TX=1;
Flg_RxFinish=0;
KeyRead();
SX1276_Parameters_Select();
asm("rim"); // 開全域中斷
while(1)
{
if(Flg_SX1276_RXorTX==Sx1276_TxMode)//發射模式,下面是發射流程
{
switch(Tx_phase)//SetTx_Parameters
{
case SetTx_Parameters:
SW_Swith_TX();
SX1276_LoRaEntryTx();
Tx_phase=Write_FIFO_AndTx;
break;
case Write_FIFO_AndTx:
SX1276_LoRaTxPacket();
Tx_phase=Wait_Tx_Finish;
LED_TX=0;
break;
case Wait_Tx_Finish:
if(RF_IRQ_DIO0) //Packet send over 發送完成了IRQ 變為H,平時L
//if(TxTimeCout>2)
{
SX1276_LoRaClearIrq(); //Clear irq
SX1276_Standby(); //Entry Standby mode
TxTimeCout=0;
Tx_phase=Wait_NextTx;
LED_TX=1;
}
break;
case Wait_NextTx:
if(TxTimeCout>9)///1s 發射間隔
{
Tx_phase=SetTx_Parameters;
TxTimeCout=0;
}
break;
}
}
else //接收模式
{
if((SX1276_GetStatue_Cout>100)&&(Flg_RxFinish==0))//定時獲取SX1276 的狀態,確保SX1276 在RX狀態
{
SX1276_GetStatue_Cout=0;
Sx1276Statue = SPIRead((u8)(LR_RegOpMode>>8));
if(Sx1276Statue!=cSx1276RxStatue)
Rx_phase=Rx_Parameters_Set;
}
switch(Rx_phase)//
{
case Rx_Parameters_Set:
SW_Swith_RX();
SX1276_LoRaEntryRx();
RF_IRQ_EN();
SX1276_GetStatue_Cout=150;
Rx_phase=Wait_RxFinish;
break;
case Wait_RxFinish:
if(Flg_RxFinish)
{
Flg_RxFinish=0;
LED_RX=~LED_RX;
PER_Proc();//PER
}
break;
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/131337.html
標籤:網絡協議與配置
