您尚未登录。

楼主 #1 2019-01-23 22:51:56

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

SX1278-STM8S透传模块PCB+原理图

第一次发帖,感谢晕大侠的坑网,在这里学会很多东西,我也贡献一下啦~
该模块批量过,LORA 433mhz。
SX1278.7z

离线

楼主 #4 2019-01-24 18:02:13

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

自我感觉很丑都没敢贴PDF( 0.<)

离线

楼主 #5 2019-01-24 19:47:58

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

#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 驱动*******************************************************************************/

离线

楼主 #6 2019-01-24 19:51:15

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

昨天困了忘记代码了,粘贴到IAR中可以用的。

离线

楼主 #13 2020-02-09 14:18:21

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

pcb,代码,都可以用的,测试环境,普通住宅小区,1单元3楼楼道和7单元7楼楼道,穿透测试可以收发数据。无障碍距离,实际1.5KM,空中飞行器和地面。

离线

楼主 #14 2020-02-09 14:27:03

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

QQ图片20200209141524.png
放到iar中可以用,全部代码复制main.c,之后编译,就可以

离线

楼主 #15 2020-02-09 15:37:08

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

Gentlepig 说:

提醒下,过孔孔径是0.3mm,过孔焊盘直径也是0.3mm.
另,单片机下边的底层,需要挖空吗?
还有一些地孔共用了。

仅供测试用,做东西,地线敷铜要重新做的,最好隔离电源。

离线

楼主 #16 2020-02-09 16:07:08

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

方便调试 加了 usb串口 led指示 开关部分单IO控制,PE4259可以用很多国产代替
QQ图片20200209152408.png
QQ图片20200209150613.png
下载:
Lmxstm8s003sx1278.zip

离线

楼主 #17 2020-02-10 14:18:23

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

下载打样用这个噢 5元JLC
QQ图片20200210140520.png
QQ图片20200210140359.png
下载:
Lmxstm8s003sx1278V2.zip

离线

楼主 #23 2020-02-21 13:33:52

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

1259783233@qq.com 说:

有没有朋友做成功了的?我做了几块没成功,不知道问题出在哪,准备买模块回来试下.

板子,源码 没问题。排查 1看看 usb芯片正常通讯不,tx rx 短接 能不能正常接收数据。2 usb发数据和stm8能不能正常通讯 stm8自己写个简单串口测试

离线

楼主 #24 2020-02-21 13:35:53

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

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使能
}

离线

楼主 #25 2020-02-21 13:39:29

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

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

离线

楼主 #26 2020-02-21 13:48:38

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

sx1278电路部分器件参数不要改,stm8 正常烧录。

离线

楼主 #27 2020-02-21 13:52:37

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

测试PE4259部分是不是正常,因为有很多国产芯和4259 开关态 有些不一样。

离线

楼主 #28 2020-02-21 13:55:11

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

SX1278,您的芯片是不是正规渠道?汕头货不要买,坏率很高。

离线

楼主 #29 2020-02-21 14:08:31

林ღ梦曦
会员
注册时间: 2019-01-15
已发帖子: 37
积分: 191.5

Re: SX1278-STM8S透传模块PCB+原理图

再有噢 ft232是不是有问题,淘宝冒牌很多。您可以用ch340 cp2102这些画板子
工程代码:stm8s-sx1278.zip

最近编辑记录 林ღ梦曦 (2020-02-21 14:08:49)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn