离线
自我感觉很丑都没敢贴PDF( 0.<)
离线
#include "iostm8s003f3.h"
//定义 MCU GPIO
#define RF_RST PB_ODR_ODR4//RF_rst PB4
#define nCS PA_ODR_ODR3//RF_NSS PA3
#define SW_CTRL PB_ODR_ODR5//SW_CTRL FEM_CPS PB5 PE4259
#define RF_IRQ_DIO0 PD_IDR_IDR4//RF_IRQ DIO0 PD4
#define CRC 0x01 //CRC Enable
#define datlen 64 //数据长度
//SX1278寄存器地址定义
#define LR_RegFifo 0x00//FIFO读/写访问,当器件处于睡眠模式时,FIFO被清零,无法访问
// Common settings
#define LR_RegOpMode 0x01//运行模式LoRa/FSK选择
#define LR_RegFrMsb 0x06//RF 载波频率最高有效位
#define LR_RegFrMid 0x07//RF 载波频率中间有效位
#define LR_RegFrLsb 0x08//RF 载波频率最低有效位若F(XOSC)=32MHz,则分辨率为61.035Hz。缺省值为 0x6c8000=434MHz。仅当器件处于睡眠或待机模式下才可以修改寄存器值
// Tx settings
#define LR_RegPaConfig 0x09//PA选择和输出功率控制
#define LR_RegPaRamp 0x0A//PA斜升/斜降时间和低相噪PLL的控制
#define LR_RegOcp 0x0B//过流保护控制
// Rx settings
#define LR_RegLna 0x0C//LNA设置
// LoRa registers
#define LR_RegFifoAddrPtr 0x0D//FIFO数据缓冲区中SPI接口地址指针
#define LR_RegFifoTxBaseAddr 0x0E//FIFO数据缓冲区中发送调制器的写入基地址
#define LR_RegFifoRxBaseAddr 0x0F//FIFO数据缓冲区中接收解调器的读取基地址
#define LR_RegFifoRxCurrentaddr 0x10//接收到最后一个数据包的起始地址(数据缓冲区中)
#define LR_RegIrqFlagsMask 0x11//可选IRQ标志屏蔽
#define LR_RegIrqFlags 0x12//IRQ标志
#define LR_RegRxNbBytes 0x13//接收到的字节数
#define LR_RegRxHeaderCntValueMsb 0x14//接收到的有效报头数,最高有效位(15:8)。报头和数据包计数器在 睡眠模式下复位。
#define LR_RegRxHeaderCntValueLsb 0x15//接收到的有效报头数,最低有效位(7:0)。报头和数据包计数器在 睡眠模式下复位。
#define LR_RegRxPacketCntValueMsb 0x16//接收到的有效数据包数,最高有效位(15:8)。报头和数据包计数器在 睡眠模式下复位。
#define LR_RegRxPacketCntValueLsb 0x17//接收到的有效数据包数,最低有效位(7:0)。报头和数据包计数器在 睡眠模式下复位。
#define LR_RegModemStat 0x18//LoRa调制解调器现场状态
#define LR_RegPktSnrValue 0x19//最后一个数据包的信噪比估值,以二进制补码格式乘以4
#define LR_RegPktRssiValue 0x1A//最后接收到的数据包的RSSI(dBm)RSSI[dBm]=-137+PacketRssi
#define LR_RegRssiValue 0x1B//电流RSSI值(dBm)RSSI[dBm]=-137+Rssi
#define LR_RegHopChannel 0x1C//FHSS起始信道
#define LR_RegModemConfig1 0x1D//调制解调器物理层配置1:7-4位信号带宽(0x07默认125kHz) 3-1位纠错编码率(默认001->4/5) 0位报头模式(0 0->显式报头模式 )
#define LR_RegModemConfig2 0x1E//调制解调器物理层配置2:7-4位SF值(以 2 基对数表示 默认0x07->128 码片/符号 ) 3位(0正常模式发送单个数据包 1持续模式通过FIFO发送多个数据包(用于频谱分析)) 2位发送端CRC信息(0关闭CRC 1开启CRC) 1-0位RX超时最高有效位
#define LR_RegSymbTimeoutLsb 0x1F//接收机超时值,RX超时最低有效位RX操作超时值以符号数表示:TimeOut=SymbTimeout-Ts
#define LR_RegPreambleMsb 0x20//前导码长度最高有效位 =PreambleLength+4.25 符号
#define LR_RegPreambleLsb 0x21//前导码长度最低有效位
#define LR_RegPayloadLength 0x22//LoRa负载长度:隐式报头模式下 需要设置寄存器,以达到预期的 数据包长度。不允许将寄存器值 设置为 0。
#define LR_RegMaxPayloadLength 0x23//LoRa负载长度最大值:如果报头负载 长度超过该最大值,则会产生报 头 CRC 错误。允许对长度不正 确的数据包进行过滤。
#define LR_RegHopPeriod 0x24//FHSS跳频周期:(0= 关闭)。第一跳总是发生在第一个 报头符号后
#define LR_RegFifoRxByteAddr 0x25//FIFO中最后写入字节的地址,接收数据缓存当前指针(由 Lora 接收机写入的最后一个字节的地址)
#define LR_RegModemConfig3 0x26//调制解调器物理层配置3: 3位0关闭1开启(符号长度超过16ms时必须打开) 2位0寄存器LnaGain设置的LNA增益 1内部AGC环路设置的LNA增益
// I/O settings
#define REG_LR_DIOMAPPING1 0x40//DIO0 到 DIO3 引脚映射
#define REG_LR_DIOMAPPING2 0x41//DIO4 到 DIO5 引脚映射、 ClkOut 频率
// Version
#define REG_LR_VERSION 0x42//芯片版本--相关升特 ID
// Additional settings
#define REG_LR_TCXO 0x4B//TCXO或XTAL输入设置
//变量定义
unsigned char Tx_phase;
unsigned char Flg_TxRx;
unsigned char Rx_phase;
unsigned char Flg_RxFinish;
unsigned char temp1,temp2,temp3;
unsigned char gtmp;
unsigned char gb_SF;
unsigned char gb_BW;
unsigned char CR; //LR_RegModemConfig1
unsigned char Sx1278Buf[datlen]; //发送接收缓冲区
const unsigned char SX1276FreqTbl[3] = {0x6C, 0x80, 0x00}; //434MHz射频载波频率(0x0685,0x073b,0x0813//434MHz 26m)(0x0634,0x0700,0x0800//169MHz 26m)
const unsigned char SX1276LoRaBwTbl[10] ={0/*7.8KHz*/,1/*10.4KHz*/,2/*15.6KHz*/,3/*20.8KHz*/,4/*31.2KHz*/,5/*41.7KHz*/,6/*62.5KHz*/,7/*125KHz*/,8/*250KHz*/,9/*500KHz*/};
const unsigned char SX1276SpreadFactorTbl[7] ={6,7,8,9,10,11,12};
typedef enum{Rx_Parameters_Set,Read_FIFO_AndRx,Wait_RxFinish}RX_STATE;
typedef enum{SetTx_Parameters,Write_FIFO_AndTx,Wait_Tx_Finish}TX_STATE;
//函数声明
void GPIO_init(void);
void SPI_init(void);
void UART1_init(void);
unsigned char SpiInOut(unsigned char Data);//SPI读写函数
void Uart_Send_Char(unsigned char UtxData);//Uart1 TX函数
void SX1276_Rx_Tx(char RxOrTx);//SX1278读写状态切换
void SX1276_Parameters_Select();//SX1278工作模式选择
void SX1276_Standby(void);//待机
void SX1276_Sleep(void);//休眠
void SX1276_EntryLoRa(void);//切换到LORA模式
void SX1276_LoRaClearIrq(void);//SX1278清除中断
unsigned char SX1276_LoRaRxWaitStable(void);//查询RX状态
void SX1276_Config(void);//SX1278基本配置
void SX1276_LoRaEntryRx(void);//基本配置,进入接收状态,等待接收完成Flg_RxFinish中断
void SX1276_LoRaEntryTx(void);//基本配置,进入发送状态
void SX1276_LoRaRxPacket(void);//将接收到的数据从FIFO中读出,并清除相应的中断标志位
void SX1276_LoRaTxPacket(void);//发送数据写入FIFO,开启发送模式,等待TxDone中断产生
void SX1276Read(unsigned char adr,unsigned char *data);//读SX1278数据1字节
void SX1276Write(unsigned char adr,unsigned char data);//写SX1278数据1字节
void SX1276ReadBuffer(unsigned char adr, unsigned char *ptr, unsigned char length);//读SX1278字符串
void SX1276WriteBuffer(unsigned char adr, unsigned char *ptr, unsigned char length);//写SX1278字符串
void SW_Swith_RX();
void SW_Swith_TX();
void main( void )
{
CLK_CKDIVR = 0x00; // 16M内部RC系统时钟为16M
asm("sim"); // 关全局中断
GPIO_init();
SPI_init();
UART1_init();
RF_RST=1;
Flg_RxFinish=0;
temp1=0;
SX1276_Rx_Tx(0);//1发送 0接收
SX1276_Parameters_Select();//选择工作模式
asm("rim");// 开全局中断
while(1)
{
if(Flg_TxRx==0x01)//发射模式,下面是发射流程
{
switch(Tx_phase)//SetTx_Parameters
{
case SetTx_Parameters:
SW_Swith_TX();//切换PE4259到发射状态
SX1276_LoRaEntryTx();//基本配置,进入发送状态
Tx_phase=Write_FIFO_AndTx;
break;
case Write_FIFO_AndTx:
SX1276_LoRaTxPacket();//发送数据写入FIFO,开启发送模式,等待TxDone中断产生
Tx_phase=Wait_Tx_Finish;
break;
case Wait_Tx_Finish:
if(RF_IRQ_DIO0)//Packet send over 发送完成了IRQ 变为H,平时L
{
SX1276_LoRaClearIrq(); //清除所有中断标志位
while(RF_IRQ_DIO0);
SX1276_Rx_Tx(0);//1发送 0接收;
UART1_CR2_REN = 1;//接收使能,防止串位
UART1_CR2_RIEN = 1;
}
break;
}
}
else//接收模式
{
switch(Rx_phase)
{
case Rx_Parameters_Set:
SW_Swith_RX();//切换PE4259到接收状态
SX1276_LoRaEntryRx();//基本配置,进入接收状态,等待接收完成Flg_RxFinish中断
Rx_phase=Read_FIFO_AndRx;
break;
case Read_FIFO_AndRx:
if(RF_IRQ_DIO0)
{
SX1276_LoRaRxPacket();//将接收到的数据从 FIFO 中读出,并清除相应的中断标志位;
while(RF_IRQ_DIO0);
Rx_phase=Wait_RxFinish;
}
break;
case Wait_RxFinish:
if(Flg_RxFinish)
{
Flg_RxFinish=0;
for(temp3=0;temp3<datlen;temp3++)
{
Uart_Send_Char(Sx1278Buf[temp3]);
}
SX1276_Rx_Tx(0);//1发送 0接收
}
break;
}
}
}
}
/*******************************************************************************PE4259 服务函数*******************************************************************************/
void SW_Swith_RX()
{
SW_CTRL=1;
}
void SW_Swith_TX()
{
SW_CTRL=0;
}
/*******************************************************************************PE4259 服务函数*******************************************************************************/
/*******************************************************************************SX1278 服务函数*******************************************************************************/
void SX1276_Rx_Tx(char RxOrTx)//SX1278读写状态切换
{
if(RxOrTx==0x01)
{
Flg_TxRx=0x01;
Tx_phase=SetTx_Parameters;
}
else
{
Flg_TxRx=0x00;
Rx_phase=Rx_Parameters_Set;
}
}
void SX1276_Parameters_Select()//SX1278工作模式选择
{
/****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
/*******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
/*******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
}
void SX1276_Standby(void)//待机
{
SX1276Write(LR_RegOpMode,0x01+0x08); //0x01 0x09 7位(0->FSK/OOK 1->LoRA) 6位(0->访问LoRa寄存器页面0x0D:0x3F 1->(在 LoRa 模式下)访问FSK寄存器页面0x0D:0x3F)
} //3位(访问低频模式寄存器0高频模式 1低频模式) 2-0位器件模式:000睡眠,001待机,010频率合成发送FSTX,011发送TX,100频率合成接收FSRX,101持续接收RXCONTINUOUS,110单次接收RXSINGLE,111信道活动检测CAD
void SX1276_Sleep(void)//休眠
{
SX1276Write(LR_RegOpMode,0x00+0x08); //0x01 0x08 2-0位000休眠
}
void SX1276_EntryLoRa(void)//切换到LORA模式
{
SX1276Write(LR_RegOpMode,0x80+0x08); //0X01 0X88 7位1 LORA模式 3位1 低频模式
}
void SX1276_LoRaClearIrq(void)//SX1278清除中断
{
SX1276Write(LR_RegIrqFlags,0xFF); //7位(RxTimeout超时中断 一次写操作清除IRQ) 6位(RxDone数据包接收完成中断 一次写操作清除IRQ) 5位(PayloadCrcError负载CRC错误中断 一次写操作清除IRQ) 4位(ValidHeader Rx模式下接收到的有效报头 一次写操作清除IRQ)
} //3位(TxDone FIFO负载发送完成中断 一次写操作清除IRQ) 2位(CadDone CAD完成 通过写操作清除 一次写操作清除IRQ) 1位(FhssChangeChannel FHSS改变信道中断 一次写操作清除IRQ) 0位(CadDetected CAD操作中检测到有效Lora信号 一次写操作清除 IRQ)
unsigned char SX1276_LoRaRxWaitStable(void)//查询RX状态
{
unsigned char tmp;
SX1276Read(LR_RegModemStat,&tmp);
return tmp;
}
void SX1276_Config(void)//SX1278基本配置
{
SX1276_Sleep(); //休眠 延迟
SX1276Write(REG_LR_TCXO,0x09); //0x4b 0x09 XTAL带外部晶体的晶体振荡器
SX1276_EntryLoRa(); //切换到LORA模式
SX1276Write(0x06,SX1276FreqTbl[0]); //射频载波频率
SX1276Write(0x07,SX1276FreqTbl[1]);
SX1276Write(0x08,SX1276FreqTbl[2]);
SX1276Write(0x09,0xFF); //PA 选择和输出功率控制 0xFF/*20dbm*/,0xFC/*17dbm*/,0xF9/*14dbm*/,0xF6/*11dbm*/
SX1276Write(LR_RegOcp,0x0B); //过流保护控制 OCP 电流微调 100MA
SX1276Write(LR_RegLna,0x23); //LNA 设置 7-5最大增益001 4-3LNA电流00 1-0高频RFI_HF 11
if(SX1276SpreadFactorTbl[gb_SF]==6) //SFactor=6
{
unsigned char tmp;
SX1276Write(LR_RegModemConfig1,(SX1276LoRaBwTbl[gb_BW]<<4)+(CR<<1)+0x01); //7-4BW位信号带宽 3-1CR位纠错编码率 0位0显式报头模式 1隐式报头模式
SX1276Write(LR_RegModemConfig2,(SX1276SpreadFactorTbl[gb_SF]<<4)+(CRC<<2)+0x03);
SX1276Read(0x31,&tmp);
tmp &= 0xF8;
tmp |= 0x05;
SX1276Write(0x31,tmp);
SX1276Write(0x37,0x0C);
}
else
{
SX1276Write(LR_RegModemConfig1,(SX1276LoRaBwTbl[gb_BW]<<4)+(CR<<1)+0x00); //Explicit Enable CRC Enable(0x02) & Error Coding rate 4/5(0x01), 4/6(0x02), 4/7(0x03), 4/8(0x04)
SX1276Write(LR_RegModemConfig2,(SX1276SpreadFactorTbl[gb_SF]<<4)+(CRC<<2)+0x03); //SFactor & LNA gain set by the internal AGC loop
SX1276Write(LR_RegModemConfig3,0x08); //LowDataRateOptimize en
}
SX1276Write(LR_RegSymbTimeoutLsb,0xFF); //RegSymbTimeoutLsb Timeout = 0x3FF(Max)RX超时最低有效位
SX1276Write(LR_RegPreambleMsb,0); //RegPreambleMsb前导码长度最高有效位
SX1276Write(LR_RegPreambleLsb,16); //RegPreambleLsb 8+4=12byte Preamble 16+4=20前导码长度最低有效位
SX1276Write(REG_LR_DIOMAPPING2,0x01); //RegDioMapping2 DIO5=00, DIO4=01
SX1276_Standby(); //Entry standby mode
}
void SX1276_LoRaEntryRx(void)//基本配置,进入接收状态,等待接收完成Flg_RxFinish中断
{
unsigned char addr;
SX1276_Config(); //基本配置
SX1276Write(0x4D,0x84); //RX时PA功率为默认值
SX1276Write(LR_RegHopPeriod,0xFF); //RegHopPeriod NO FHSS
SX1276Write(REG_LR_DIOMAPPING1,0x01); //DIO0=00, DIO1=00, DIO2=00, DIO3=01 DIO0=0RxDone
SX1276Write(LR_RegIrqFlagsMask,0x3F); //打开 6位数据包接收完成中断 7位超时中断
SX1276_LoRaClearIrq(); //清除IRQ
SX1276Write(LR_RegPayloadLength,datlen); //负载字节长度
SX1276Read(LR_RegFifoRxBaseAddr,&addr); //FIFO数据缓冲区中接收解调器的读取基地址
SX1276Write(LR_RegFifoAddrPtr,addr); //FIFO 数据缓冲区中 SPI 接口地 址指针
SX1276Write(LR_RegOpMode,0x0D); //低频模式 持续接收
}
void SX1276_LoRaEntryTx(void)//基本配置,进入发送状态
{
unsigned char addr;
SX1276_Config(); //基本配置
SX1276Write(0x4D,0x87); //Tx时PA大功率设置 20dBm
SX1276Write(LR_RegHopPeriod,0x00); //频率跳变之间的符号周期(0= 关闭)第一跳总是发生在第一个报头符号后
SX1276Write(REG_LR_DIOMAPPING1,0x41); //01 00 00 01 DIO0=01, DIO1=00, DIO2=00, DIO3=01 DIO0=1TxDone
SX1276_LoRaClearIrq(); //清除IRQ
SX1276Write(LR_RegIrqFlagsMask,0xF7); //打开TxDone中断(FIFO负载发送完成中断屏蔽:设置该位将屏蔽RegIrqFlags中对应的IRQ)
SX1276Write(LR_RegPayloadLength,datlen); //负载字节长度 隐式报头模式下 需要设置寄存器 以达到预期的数据包长度 不允许将寄存器值设置为0 21byte
SX1276Read(LR_RegFifoTxBaseAddr,&addr); //读出FIFO 数据缓冲区中TX发送调制器 的写入基地址
SX1276Write(LR_RegFifoAddrPtr,addr); //FIFO 数据缓冲区中 SPI 接口地 址指针
}
void SX1276_LoRaRxPacket(void)//将接收到的数据从FIFO中读出,并清除相应的中断标志位
{
unsigned char addr;
unsigned char packet_size;
Flg_RxFinish=1;
SX1276Read(LR_RegFifoRxCurrentaddr,&addr); //数据包的最后地址(数据的尾地址)
SX1276Write(LR_RegFifoAddrPtr,addr); //FIFO 数据缓冲区中 SPI 接口地 址指针
if(SX1276SpreadFactorTbl[gb_SF]==6)packet_size=21; //隐藏头模式,不包括内部数据包长度
else packet_size=datlen; //接收数据包长度
SX1276ReadBuffer(0x00,Sx1278Buf,packet_size); //读数据
SX1276_LoRaClearIrq(); //清除IRQ
}
void SX1276_LoRaTxPacket(void)//发送数据写入FIFO,开启发送模式,等待TxDone中断产生
{
SX1276WriteBuffer(0x00,Sx1278Buf,datlen); //写数据
SX1276Write(LR_RegOpMode,0x03+0x08); //0x01=0x0B 0000 1011 3位1访问低频模式寄存器 2-0位器件模式011发送Tx模式
}
//SX1278 SPI读写函数
void SX1276Read(unsigned char adr,unsigned char *data)//读SX1278数据1字节
{
nCS=0;
SpiInOut(adr);
*data = SpiInOut(0);
nCS=1;
}
void SX1276Write(unsigned char adr,unsigned char data)//写SX1278数据1字节
{
nCS=0; //SX1278最高位1为写入
adr |= 0x80;
SpiInOut(adr);
SpiInOut(data);
nCS=1;
}
void SX1276ReadBuffer(unsigned char adr, unsigned char *ptr, unsigned char length)//读SX1278字符串
{
unsigned char i;
if(length<=1) //length must more than one
return;
else
{
nCS=0;
SpiInOut(adr);
for(i=0;i<length;i++)
ptr[i] = SpiInOut(0);
nCS=1;
}
}
void SX1276WriteBuffer(unsigned char adr, unsigned char *ptr, unsigned char length)//写SX1278字符串
{
unsigned char i;
if(length<=1) //length must more than one
return;
else
{
nCS=0;
SpiInOut(adr|0x80);
for(i=0;i<length;i++)
SpiInOut(ptr[i]);
nCS=1;
}
}
/*******************************************************************************SX1278 服务函数*******************************************************************************/
/*******************************************************************************STM8S MCU 驱动*******************************************************************************/
//MCU初始化
void GPIO_init(void)//GPIO初始化
{
//RF_RST PB4
PB_DDR_DDR4=1; //OUTPUT
PB_CR1_C14=1; //SET PD
//RF_SCK PC5
PC_DDR_DDR5=1; //SET PD
PC_CR1_C15=1; //SET PD
//RF_MISO PC7 INPUT
PC_DDR_DDR7=0; //INPUT
PC_CR1_C17=1; //PULL-UP-INPUT
//RF_MOSI PC6
PC_DDR_DDR6=1;//OUTPUT
PC_CR1_C16=1; //SET PD
//RF_NSS PA3
PA_DDR_DDR3=1; //OUTPUT
PA_CR1_C13=1; //SET PD
//RF_IRQ DIO0 PD4 SX1278
PD_DDR_DDR4=0; //INPUT
PD_CR1_C14=1; //PULL-UP-INPUT
PD_CR2_C24=0; //
//SW_CTRL FEM_CPS PB5 PE4259
PB_DDR_DDR5=1; //OUTPUT
PB_CR1_C15=1; //SET PD
nCS=1;//SPI_NSS
}
void SPI_init(void)
{
SPI_CR1_SPE = 0; //禁止SPI
SPI_CR1_LSBFIRST = 0; //先发送MSB
SPI_CR1_BR = 0; //波特率设为 fbus/2 8MHz
SPI_CR1_MSTR = 1; //主模式
SPI_CR1_CPOL = 0; //空闲状态时SCK为低电平
SPI_CR1_CPHA = 0; //数据从第一个时钟边沿开始采样
SPI_CR2_BDM = 0; //双线单向模式
SPI_CR2_SSM = 0; //禁止软件从设备管理
SPI_CR2_SSI = 1; //内部从设备选择为主模式
SPI_ICR = 0x00; //禁止中断
SPI_CR1_SPE = 1; //SPI使能
}
void UART1_init(void)
{
UART1_CR1=0; // 8bit
UART1_CR2=0;
UART1_CR3=0; // 1 stop bit
UART1_BRR2 = 0x0B; //设置波特率115200
UART1_BRR1 = 0x08; //16M
UART1_CR2_REN = 1;
UART1_CR2_TEN = 1;
UART1_CR2_RIEN = 1;
UART1_SR_RXNE = 0;
UART1_SR_TC = 1;
UART1_SR_TXE = 1;
}
//一般服务函数
unsigned char SpiInOut(unsigned char Data)//SPI读写函数
{
while(SPI_SR_TXE==0);
SPI_DR = Data;
while(SPI_SR_RXNE==0);
return SPI_DR;
}
void Uart_Send_Char(unsigned char UtxData)//Uart1 TX函数
{
while(!UART1_SR_TXE);//发送数据寄存器 0非空 1为空
UART1_DR = UtxData;//
while(!UART1_SR_TC);//发送完成 0未完成 1完成发送
}
//中断服务函数
#pragma vector=UART1_R_RXNE_vector//串口UART1入口
__interrupt void UART1_RX_RXNE(void)//Uart1 RX函数
{
if(UART1_SR_RXNE == 1)
{
if(UART1_SR_OR_LHE == 1)
{
temp2 = UART1_SR;
Sx1278Buf[temp1++] = UART1_DR;
}
else
{
Sx1278Buf[temp1++] = UART1_DR;
}
while(UART1_SR_RXNE == 1);
}
if(temp1>=datlen)
{
temp1=0;
UART1_CR2_REN = 0;
UART1_CR2_RIEN = 0;
SX1276_Rx_Tx(1);//1发送 0接收;
}
}
/*******************************************************************************STM8S MCU 驱动*******************************************************************************/
离线
昨天困了忘记代码了,粘贴到IAR中可以用的。
离线
多谢分享,刚好有用到
离线
多谢分享,正好做一个类似的电路板,早看到就不用请朋友画板了:-)
离线
感谢分享
离线
感谢分享~~
离线
提醒下,过孔孔径是0.3mm,过孔焊盘直径也是0.3mm.
另,单片机下边的底层,需要挖空吗?
还有一些地孔共用了。
最近编辑记录 Gentlepig (2019-11-18 10:13:06)
离线
pcb,代码,都可以用的,测试环境,普通住宅小区,1单元3楼楼道和7单元7楼楼道,穿透测试可以收发数据。无障碍距离,实际1.5KM,空中飞行器和地面。
离线
放到iar中可以用,全部代码复制main.c,之后编译,就可以
离线
提醒下,过孔孔径是0.3mm,过孔焊盘直径也是0.3mm.
另,单片机下边的底层,需要挖空吗?
还有一些地孔共用了。
仅供测试用,做东西,地线敷铜要重新做的,最好隔离电源。
离线
方便调试 加了 usb串口 led指示 开关部分单IO控制,PE4259可以用很多国产代替
下载:
Lmxstm8s003sx1278.zip
离线
下载打样用这个噢 5元JLC
下载:
Lmxstm8s003sx1278V2.zip
离线
谢谢 分享
离线
谢谢分享,佩服佩服,mark lora开发板
离线
多谢分享,刚好有用到
离线
离线
有没有朋友做成功了的?我做了几块没成功,不知道问题出在哪,准备买模块回来试下.
最近编辑记录 1259783233@qq.com (2020-02-21 10:55:30)
离线
有没有朋友做成功了的?我做了几块没成功,不知道问题出在哪,准备买模块回来试下.
板子,源码 没问题。排查 1看看 usb芯片正常通讯不,tx rx 短接 能不能正常接收数据。2 usb发数据和stm8能不能正常通讯 stm8自己写个简单串口测试
离线
3参考代码初始化 spi stm8 测试读写 sx1278 寄存器,
void SPI_init(void)
{
SPI_CR1_SPE = 0; //禁止SPI
SPI_CR1_LSBFIRST = 0; //先发送MSB
SPI_CR1_BR = 0; //波特率设为 fbus/2 8MHz
SPI_CR1_MSTR = 1; //主模式
SPI_CR1_CPOL = 0; //空闲状态时SCK为低电平
SPI_CR1_CPHA = 0; //数据从第一个时钟边沿开始采样
SPI_CR2_BDM = 0; //双线单向模式
SPI_CR2_SSM = 0; //禁止软件从设备管理
SPI_CR2_SSI = 1; //内部从设备选择为主模式
SPI_ICR = 0x00; //禁止中断
SPI_CR1_SPE = 1; //SPI使能
}
离线
void UART1_init(void)
{
UART1_CR1=0; // 8bit
UART1_CR2=0;
UART1_CR3=0; // 1 stop bit
UART1_BRR2 = 0x0B; //设置波特率115200
UART1_BRR1 = 0x08; //16M
UART1_CR2_REN = 1;
UART1_CR2_TEN = 1;
UART1_CR2_RIEN = 1;
UART1_SR_RXNE = 0;
UART1_SR_TC = 1;
UART1_SR_TXE = 1;
}
离线
sx1278电路部分器件参数不要改,stm8 正常烧录。
离线
测试PE4259部分是不是正常,因为有很多国产芯和4259 开关态 有些不一样。
离线
SX1278,您的芯片是不是正规渠道?汕头货不要买,坏率很高。
离线
再有噢 ft232是不是有问题,淘宝冒牌很多。您可以用ch340 cp2102这些画板子
工程代码:stm8s-sx1278.zip
最近编辑记录 林ღ梦曦 (2020-02-21 14:08:49)
离线
好的,谢谢!
离线
前来学习
离线
也分享一个开源固件,支持AT命令和透传方式,STM8L的,跑在TING模组上: https://wiki.widora.cn/ting_source
歪朵拉开源硬件: https://widora.cn
淘宝: https://widora.taobao.com/
离线
学习一下!感谢分享!
离线
谢谢 分享
离线
画的非常好,我也正在学习,现在想用stm32c8t6结合sx1278做
离线
这个sx1278属于lora的吧,不知道距离怎样
离线
最近正在弄LORA通信,抗干扰性怎么样?多套在一起,1套连接时间太长了
离线
谢谢分享,射频部分的参数很详细,收发控制是通过stm8控制的吗?
离线
LORA SX1278模块在这里学会很多东西正好电路板研究中...
离线
讲解双面板画板阻抗匹配原理呀!
离线
请教楼主,这东西做出来的成本是多少。就单单Sx1278设计。
离线
支持一下。正好要做这个项目
离线
不错,又有一个LORA开发板玩了
离线
离线
离线
我准备DIY 一个玩玩
离线
谢谢,准备也模拟一个试试,多谢
离线
这个模块能发射的比较远,就是速度有点慢。
离线
我记得好像单片机可以模拟usb协议的,如果能省掉USB2TTL的芯片就更好了。
离线
天线部分的走线不需要50欧姆的阻抗匹配吗?
离线
感谢美女分享!
离线
感谢分享,学习到了,我也想问下天线部分不需要做阻抗匹配吗,还是制板时调整了天线部分的线宽等参数以达到阻抗匹配的目的呢。
离线