找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1768|回复: 2
打印 上一主题 下一主题
收起左侧

stx78 Lora模块+stm32

[复制链接]
跳转到指定楼层
楼主
ID:547248 发表于 2019-5-25 23:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/******************************************************************************/
/*
//  函数说明:main.c                                                              
//  说明:该程序用于测试lora模块                                                               
//  编写人员: sky                                                                 
// 编写日期: 2016-11-24                                                         
// 版本号:V1.0
// 维护日志:
//
//                                                         
*/
// 免责声明:该程序仅供参考学习,若自定义其他功能,请查看参考手册
// (c) Anxinke Corporation. All rights reserved.                                                               
/******************************************************************************/
#include "sx1278.h"

//#include "reg51.hcd"
lpCtrlTypefunc_t lpTypefunc = { 0, 0, 0 };
unsigned char power_data[8] = { 0X80, 0X80, 0X80, 0X83, 0X86, 0x89, 0x8c, 0x8f };

lpCtrlTypefunc_t ctrlTypefunc =
                { RF_SPI_MasterIO, RF_SPI_READ_BYTE, cmdSwitchEn,

                };
//unsigned char Frequency[3] = { 0x6c, 0x80, 0x00 };//470Mhz
unsigned char Frequency[3] = { 0x6c, 0x80, 0x00 };//430Mhz 频率设置
unsigned char powerValue = 7;
unsigned char SpreadingFactor = 12;    //扩频因子7-12
unsigned char CodingRate = 2;        //1-4
unsigned char Bw_Frequency = 7;      //带宽6-9
unsigned char RF_EX0_STATUS;
unsigned char CRC_Value;
unsigned char SX1278_RLEN;
//unsigned char recv[512];


void Delay1s(unsigned int ii)
{
  int j;
   while(ii--){
     for(j=0;j<1000;j++);
   }
}

/*
function:SX1278 restart
*/

void  SX1276Reset(void) {
        RF_REST_L;
        Delay1s(200);
        RF_REST_H;
        Delay1s(500);
}


/*
function:control GPIO-EN
*/
void  cmdSwitchEn(cmdEntype_t cmd) {
        switch (cmd) {
        case enOpen: {
                RF_CE_L;
        }
                break;
        case enClose: {
                RF_CE_H;
        }
                break;
        default:
                break;
        }
}




void  RF_SPI_MasterIO(unsigned char out) {
        unsigned char i;
        for (i = 0; i < 8; i++) {
                if (out & 0x80) /* check if MSB is high */
                        RF_SDI_H;
                else
                        RF_SDI_L; /* if not, set to low */

                RF_CKL_H; /* toggle clock high */
                out = (out << 1); /* shift 1 place for next bit */
                RF_CKL_L; /* toggle clock low */
        }
}

unsigned char   RF_SPI_READ_BYTE() {
        unsigned char j;
        unsigned char i;
        j = 0;
        for (i = 0; i < 8; i++) {
                RF_CKL_H;
                j = (j << 1);                        // shift 1 place to the left or shift in 0 //
                if ( SX1278_SDO)                                        // check to see if bit is high //
                        j = j | 0x01;                                            // if high, make bit high //
                                                                                           // toggle clock high //
                RF_CKL_L;                                                          // toggle clock low //
        }

        return j;                                                                // toggle clock low //
}
unsigned char  SX1276ReadBuffer(unsigned char addr) {
        unsigned char Value;
        lpTypefunc.lpSwitchEnStatus(enOpen); //NSS = 0;
        lpTypefunc.lpByteWritefunc(addr & 0x7f);
        Value = lpTypefunc.lpByteReadfunc();
        lpTypefunc.lpSwitchEnStatus(enClose); //NSS = 1;

        return Value;
}

/*
function:set sx1278 work mode ,here you can control the mode which is send or recieve
parm:
*/
void  SX1276LoRaSetOpMode(RFMode_SET opMode) {
        unsigned char opModePrev;
        opModePrev = SX1276ReadBuffer(REG_LR_OPMODE);
        opModePrev &= 0xf8;
        opModePrev |= (unsigned char) opMode;
        SX1276WriteBuffer( REG_LR_OPMODE, opModePrev);
}



void  SX1276WriteBuffer(unsigned char addr,
                unsigned char buffer) {
        lpTypefunc.lpSwitchEnStatus(enOpen); //NSS = 0;
        lpTypefunc.lpByteWritefunc(addr | 0x80);
        lpTypefunc.lpByteWritefunc(buffer);
        lpTypefunc.lpSwitchEnStatus(enClose); //NSS = 1;
}

void  register_rf_func(lpCtrlTypefunc_t *func) {
        if (func->lpByteWritefunc != 0) {
                lpTypefunc.lpByteWritefunc = func->lpByteWritefunc;
        }
        if (func->lpByteReadfunc != 0) {
                lpTypefunc.lpByteReadfunc = func->lpByteReadfunc;
        }
        if (func->lpSwitchEnStatus != 0) {
                lpTypefunc.lpSwitchEnStatus = func->lpSwitchEnStatus;
        }

}

void  SX1276LoRaSetRFFrequency(void) {
        SX1276WriteBuffer( REG_LR_FRFMSB, Frequency[0]);//0x04射频载波频率最高有效位
        SX1276WriteBuffer( REG_LR_FRFMID, Frequency[1]);//0x07射频载波频率中间有效位
        SX1276WriteBuffer( REG_LR_FRFLSB, Frequency[2]);//0x00射频载波频率最低有效位
}

void  SX1276LoRaSetNbTrigPeaks(unsigned char value) {
        unsigned char RECVER_DAT;
        RECVER_DAT = SX1276ReadBuffer(0x31);
        RECVER_DAT = (RECVER_DAT & 0xF8) | value;
        SX1276WriteBuffer(0x31, RECVER_DAT);
}

void  SX1276LoRaSetSpreadingFactor(unsigned char factor) {
        unsigned char RECVER_DAT;
        SX1276LoRaSetNbTrigPeaks(3);
        RECVER_DAT = SX1276ReadBuffer( REG_LR_MODEMCONFIG2);
        RECVER_DAT = (RECVER_DAT & RFLR_MODEMCONFIG2_SF_MASK) | (factor << 4);
        SX1276WriteBuffer( REG_LR_MODEMCONFIG2, RECVER_DAT);
}

void  SX1276LoRaSetErrorCoding(unsigned char value) {
        unsigned char RECVER_DAT;
        RECVER_DAT = SX1276ReadBuffer( REG_LR_MODEMCONFIG1);
        RECVER_DAT = (RECVER_DAT & RFLR_MODEMCONFIG1_CODINGRATE_MASK)
                        | (value << 1);
        SX1276WriteBuffer( REG_LR_MODEMCONFIG1, RECVER_DAT);
// LoRaSettings.ErrorCoding = value;
}

void  SX1276LoRaSetSignalBandwidth(unsigned char bw) {
        unsigned char RECVER_DAT;
        RECVER_DAT = SX1276ReadBuffer( REG_LR_MODEMCONFIG1);
        RECVER_DAT = (RECVER_DAT & RFLR_MODEMCONFIG1_BW_MASK) | (bw << 4);
        SX1276WriteBuffer( REG_LR_MODEMCONFIG1, RECVER_DAT);
// LoRaSettings.SignalBw = bw;
}

void  SX1276LoRaSetImplicitHeaderOn(BOOL enable) {
        unsigned char RECVER_DAT;
        RECVER_DAT = SX1276ReadBuffer( REG_LR_MODEMCONFIG1);
        RECVER_DAT = (RECVER_DAT & RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK)
                        | (enable);
        SX1276WriteBuffer( REG_LR_MODEMCONFIG1, RECVER_DAT);
}

void  SX1276LoRaSetPayloadLength(unsigned char value) {
        SX1276WriteBuffer( REG_LR_PAYLOADLENGTH, value);
}

void  SX1276LoRaSetSymbTimeout(unsigned int value) {
        unsigned char RECVER_DAT[2];
        RECVER_DAT[0] = SX1276ReadBuffer( REG_LR_MODEMCONFIG2);
        RECVER_DAT[1] = SX1276ReadBuffer( REG_LR_SYMBTIMEOUTLSB);
        RECVER_DAT[0] = (RECVER_DAT[0] & RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK)
                        | ((value >> 8) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK);
        RECVER_DAT[1] = value & 0xFF;
        SX1276WriteBuffer( REG_LR_MODEMCONFIG2, RECVER_DAT[0]);
        SX1276WriteBuffer( REG_LR_SYMBTIMEOUTLSB, RECVER_DAT[1]);
}

void  SX1276LoRaSetMobileNode(BOOL enable) {
        unsigned char RECVER_DAT;
        RECVER_DAT = SX1276ReadBuffer( REG_LR_MODEMCONFIG3);
        RECVER_DAT = (RECVER_DAT & RFLR_MODEMCONFIG3_MOBILE_NODE_MASK)
                        | (enable << 3);
        SX1276WriteBuffer( REG_LR_MODEMCONFIG3, RECVER_DAT);
}

void  RF_RECEIVE(void) {
        SX1276LoRaSetOpMode(Stdby_mode);
        SX1276WriteBuffer(REG_LR_IRQFLAGSMASK, IRQN_RXD_Value);  //打开发送中断
        SX1276WriteBuffer(REG_LR_HOPPERIOD, PACKET_MIAX_Value);
        SX1276WriteBuffer( REG_LR_DIOMAPPING1, 0X00);
        SX1276WriteBuffer( REG_LR_DIOMAPPING2, 0X00);
        SX1276LoRaSetOpMode(Receiver_mode);
//   lpTypefunc.paSwitchCmdfunc(rxOpen);
}

void  SX1276LoRaSetPacketCrcOn(BOOL enable) {
        unsigned char RECVER_DAT;
        RECVER_DAT = SX1276ReadBuffer( REG_LR_MODEMCONFIG2);
        RECVER_DAT = (RECVER_DAT & RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK)
                        | (enable << 2);
        SX1276WriteBuffer( REG_LR_MODEMCONFIG2, RECVER_DAT);
}

void  SX1276LoRaFsk(Debugging_fsk_ook opMode) {
        unsigned char opModePrev;
        opModePrev = SX1276ReadBuffer(REG_LR_OPMODE);
        opModePrev &= 0x7F;
        opModePrev |= (unsigned char) opMode;
        SX1276WriteBuffer( REG_LR_OPMODE, opModePrev);
}


void  SX1276LoRaSetRFPower(unsigned char power) {
        SX1276WriteBuffer( REG_LR_PADAC, 0x87);
        SX1276WriteBuffer( REG_LR_PACONFIG, power_data[power]);
}


/*
function :you must call it ,the function is to init the module.
*/
void  SX1276LORA_INT(void) {
        SX1276LoRaSetOpMode(Sleep_mode);  //设置睡眠模式0x01
        SX1276LoRaFsk(LORA_mode);              // 设置扩频模式,只能在睡眠模式下修改
        SX1276LoRaSetOpMode(Stdby_mode);   // 设置为普通模式
        SX1276WriteBuffer( REG_LR_DIOMAPPING1, GPIO_VARE_1);
        SX1276WriteBuffer( REG_LR_DIOMAPPING1, GPIO_VARE_1);
        SX1276WriteBuffer( REG_LR_DIOMAPPING2, GPIO_VARE_2);
        SX1276LoRaSetRFFrequency();
        SX1276LoRaSetRFPower(powerValue);
        SX1276LoRaSetSpreadingFactor(SpreadingFactor);         // 扩频因子设置
        SX1276LoRaSetErrorCoding(CodingRate);                 //有效数据比
        SX1276LoRaSetPacketCrcOn(true);                          //CRC 校验打开
        SX1276LoRaSetSignalBandwidth(Bw_Frequency);         //设置扩频带宽
        SX1276LoRaSetImplicitHeaderOn(false);                //同步头是显性模式
        SX1276LoRaSetPayloadLength(0xff);//0x22 timeout中断
        SX1276LoRaSetSymbTimeout(0x3FF);
        SX1276LoRaSetMobileNode(true);                          // 低数据的优化
        RF_RECEIVE();
        uartSendString("\r\ninit finish\r\n");

}

/*
function :if you want to send data,you can call it
RF_TRAN_P:data
ASM_i:the length of the data
*/
void  FUN_RF_SENDPACKET(unsigned char *RF_TRAN_P,
                unsigned char LEN) {
        unsigned char ASM_i;
//   lpTypefunc.paSwitchCmdfunc(txOpen);
        SX1276LoRaSetOpMode(Stdby_mode);
        SX1276WriteBuffer( REG_LR_HOPPERIOD, 0);        //不做频率跳变
        SX1276WriteBuffer(REG_LR_IRQFLAGSMASK, IRQN_TXD_Value);        //打开发送中断
        SX1276WriteBuffer( REG_LR_PAYLOADLENGTH, LEN);         //最大数据包
        SX1276WriteBuffer( REG_LR_FIFOTXBASEADDR, 0);
        SX1276WriteBuffer( REG_LR_FIFOADDRPTR, 0);
        lpTypefunc.lpSwitchEnStatus(enOpen);
        lpTypefunc.lpByteWritefunc(0x80);
        for (ASM_i = 0; ASM_i < LEN; ASM_i++) {
                lpTypefunc.lpByteWritefunc(*RF_TRAN_P);
                RF_TRAN_P++;
        }
        lpTypefunc.lpSwitchEnStatus(enClose);
        SX1276WriteBuffer(REG_LR_DIOMAPPING1, 0x40);
        SX1276WriteBuffer(REG_LR_DIOMAPPING2, 0x00);
        SX1276LoRaSetOpMode(Transmitter_mode);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:561794 发表于 2019-6-13 15:55 | 只看该作者


太给力了,STM32  与 Lora 模块的通讯
回复

使用道具 举报

板凳
ID:639908 发表于 2019-11-11 18:20 | 只看该作者
大佬,能教教我吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表