自我感觉很丑都没敢贴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中可以用的。
离线
pcb,代码,都可以用的,测试环境,普通住宅小区,1单元3楼楼道和7单元7楼楼道,穿透测试可以收发数据。无障碍距离,实际1.5KM,空中飞行器和地面。
离线
放到iar中可以用,全部代码复制main.c,之后编译,就可以
离线
提醒下,过孔孔径是0.3mm,过孔焊盘直径也是0.3mm.
另,单片机下边的底层,需要挖空吗?
还有一些地孔共用了。
仅供测试用,做东西,地线敷铜要重新做的,最好隔离电源。
离线
方便调试 加了 usb串口 led指示 开关部分单IO控制,PE4259可以用很多国产代替
下载:
Lmxstm8s003sx1278.zip
离线
下载打样用这个噢 5元JLC
下载:
Lmxstm8s003sx1278V2.zip
离线
有没有朋友做成功了的?我做了几块没成功,不知道问题出在哪,准备买模块回来试下.
板子,源码 没问题。排查 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)
离线