spi.h

/******************************************************************* 文件:SPIx.h* 功能:声明SPI功能函数* 日期:2018-03-17* 作者:zx* 版本:Ver.1.0 | 最初版本* * Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#ifndef __SPI_H
#define __SPI_H
#include "stm32f10x.h"void initSPIx(SPI_TypeDef* SPIx);
void setNSS(u8 status);
void sendSPIxByte(SPI_TypeDef* SPIx, u16 byte);
u16 readSPIxByte(SPI_TypeDef* SPIx);#endif

SPI.c

/******************************************************************* 文件:SPIx.c* 功能:定义SPI功能函数* 日期:2018-03-17* 作者:zx* 版本:Ver.1.0 | 最初版本* * Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#include "SPIx/SPIx.h"/*** 功能:初始化SPI相关引脚和SPI外设工作状态* 参数:*       SPIx:指定待初始化的SPI,SPI1-SPI3* 返回值:None*/
void initSPIx(SPI_TypeDef* SPIx)
{GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;if(SPIx==SPI1){/*按需添加*/}else if(SPIx==SPI2){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);                //使能SPI2时钟       }else if(SPIx==SPI3){/*按需添加*/}else {/*按需添加*/ }/***********************SPI GPIO配置****************************/if(SPIx==SPI1){/*按需添加*/}else if(SPIx==SPI2){GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;                      //配置PA8为NSS选通引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_8);                                 //默认拉高GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_15;         //配置MOSI(PB15)和SCK(PB13)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_14;                     //配置MISO(PB14)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                                 GPIO_Init(GPIOB, &GPIO_InitStructure);}else if(SPIx==SPI3){/*按需添加*/}else {/*按需添加*/ }/***********************SPI 工作模式****************************/SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置两线全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                       //设置为SPI主机SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                   //8位数据帧格式SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                          //时钟线空闲低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                        //第一个时钟沿(上升沿)采样,和SX1278一致SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                           //软件控制NSS选通SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;//没有速度要求尽量设置的慢一点,这样可以兼容更多设备SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                  //高位在前传输,和SX1278一致SPI_InitStructure.SPI_CRCPolynomial = 7;                            //设置默认值即可SPI_Init(SPIx, &SPI_InitStructure);                                 //配置生效SPI_Cmd(SPIx, ENABLE);                                              //开启SPI
}/*** 功能:设置NSS引脚状态* 参数:*       status:非0值表示拉高NSS,0表示拉低NSS* 返回值:None*/
void setNSS(u8 status)
{if(status != 0) //拉高NSS{GPIO_SetBits(GPIOA,GPIO_Pin_8);  }else          //拉低NSS{GPIO_ResetBits(GPIOA,GPIO_Pin_8);  }
}/*** 功能:发送一字节* 参数:*       SPIx:指定SPI*       byte:待发送数据* 返回值:None*/
void sendSPIxByte(SPI_TypeDef* SPIx, u16 byte)
{while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);     //等待发送缓冲区为空SPI_I2S_ClearFlag(SPIx,SPI_I2S_FLAG_TXE);SPI_I2S_SendData(SPIx, byte);while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);     //等待接收缓冲区非空SPI_I2S_ClearFlag(SPIx,SPI_I2S_FLAG_RXNE);SPI_I2S_ReceiveData(SPIx);
}/*** 功能:接收一字节* 参数:*       SPIx:指定SPI* 返回值:读取到的数据*/
u16 readSPIxByte(SPI_TypeDef* SPIx)
{while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);     //等待发送缓冲区为空SPI_I2S_ClearFlag(SPIx,SPI_I2S_FLAG_TXE);SPI_I2S_SendData(SPIx, 0xff);while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);     //等待接收缓冲区非空SPI_I2S_ClearFlag(SPIx,SPI_I2S_FLAG_RXNE);return SPI_I2S_ReceiveData(SPIx);
}

SX1278.h

/******************************************************************* 文件:SX1278.h* 功能:定义SPI功能函数* 日期:2018-03-17* 作者:zx* 版本:Ver.1.0 | 最初版本* 声明:移植自Semtech和凌承芯官方Demo* Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#ifndef __SX1278_H
#define __SX1278_H#include "stm32f10x.h"#define REG_LR_FIFO                                  0x00 // Common settings
#define REG_LR_OPMODE                                0x01
#define REG_LR_BANDSETTING                           0x04
#define REG_LR_FRFMSB                                0x06
#define REG_LR_FRFMID                                0x07
#define REG_LR_FRFLSB                                0x08 // Tx settings
#define REG_LR_PACONFIG                              0x09
#define REG_LR_PARAMP                                0x0A
#define REG_LR_OCP                                   0x0B // Rx settings
#define REG_LR_LNA                                   0x0C // LoRa registers
#define REG_LR_FIFOADDRPTR                           0x0D
#define REG_LR_FIFOTXBASEADDR                        0x0E
#define REG_LR_FIFORXBASEADDR                        0x0F
#define REG_LR_FIFORXCURRENTADDR                     0x10
#define REG_LR_IRQFLAGSMASK                          0x11
#define REG_LR_IRQFLAGS                              0x12
#define REG_LR_NBRXBYTES                             0x13
#define REG_LR_RXHEADERCNTVALUEMSB                   0x14
#define REG_LR_RXHEADERCNTVALUELSB                   0x15
#define REG_LR_RXPACKETCNTVALUEMSB                   0x16
#define REG_LR_RXPACKETCNTVALUELSB                   0x17
#define REG_LR_MODEMSTAT                             0x18
#define REG_LR_PKTSNRVALUE                           0x19
#define REG_LR_PKTRSSIVALUE                          0x1A
#define REG_LR_RSSIVALUE                             0x1B
#define REG_LR_HOPCHANNEL                            0x1C
#define REG_LR_MODEMCONFIG1                          0x1D
#define REG_LR_MODEMCONFIG2                          0x1E
#define REG_LR_SYMBTIMEOUTLSB                        0x1F
#define REG_LR_PREAMBLEMSB                           0x20
#define REG_LR_PREAMBLELSB                           0x21
#define REG_LR_PAYLOADLENGTH                         0x22
#define REG_LR_PAYLOADMAXLENGTH                      0x23
#define REG_LR_HOPPERIOD                             0x24
#define REG_LR_FIFORXBYTEADDR                        0x25
#define REG_LR_MODEMCONFIG3                          0x26/*GPIO映射设置 用于指示发送接收状态*/
#define REG_LR_DIOMAPPING1                           0x40
#define REG_LR_DIOMAPPING2                           0x41/*获取版本*/
#define REG_LR_VERSION                               0x42/*其他设置*/
#define REG_LR_PLLHOP                                0x44
#define REG_LR_TCXO                                  0x4B
#define REG_LR_PADAC                                 0x4D
#define REG_LR_FORMERTEMP                            0x5B
#define REG_LR_BITRATEFRAC                           0x5D
#define REG_LR_AGCREF                                0x61
#define REG_LR_AGCTHRESH1                            0x62
#define REG_LR_AGCTHRESH2                            0x63
#define REG_LR_AGCTHRESH3                            0x64#define GPIO_VARE_1                                  0X00
#define GPIO_VARE_2                                  0X00
#define RFLR_MODEMCONFIG2_SF_MASK                    0x0f
#define RFLR_MODEMCONFIG1_CODINGRATE_MASK            0xF1
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK          0xFB
#define RFLR_MODEMCONFIG1_BW_MASK                    0x0F
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK        0xFE
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK        0xfc
#define RFLR_MODEMCONFIG3_MOBILE_NODE_MASK           0xF7 #define TIME_OUT_INT                                 0x80
#define PACKET_RECVER_INT                            0x40
#define CRC_ERROR_INT                                0x20
#define RECVER_HEAR_INT                              0x10
#define FIFO_SEND_OVER                               0x08
#define RFLR_IRQFLAGS_CAD                            0x04
#define RFLR_IRQFLAGS_FHSS                           0x02
#define RFLR_IRQFLAGS_CADD                           0x01 #define IRQN_TXD_Value                               0xF7
#define IRQN_RXD_Value                               0x9F
#define IRQN_CAD_Value                               0xFA
#define IRQN_SEELP_Value                             0xFF
#define PACKET_MIAX_Value                            0xff/*工作状态枚举*/
typedef enum
{Sleep_mode     = (unsigned char)0x00, Stdby_mode      = (unsigned char)0x01, TX_mode             = (unsigned char)0x02,Transmitter_mode = (unsigned char)0x03,RF_mode          = (unsigned char)0x04,Receiver_mode    = (unsigned char)0x05,receive_single   = (unsigned char)0x06,CAD_mode         = (unsigned char)0x07,
}RFMode_SET;/*工作模式枚举*/
typedef enum
{FSK_mode         = (unsigned char)0x00, LORA_mode        = (unsigned char)0x80,
}Debugging_fsk_ook;/*使能状态*/
typedef enum
{false=0,true=1
}BOOL_t;void initSX1278(void);
void transmitPackets(unsigned char *buffer,unsigned char len);
void receivePackets(unsigned char* buffer);#endif

SX1278.c

/******************************************************************* 文件:SX1278.c* 功能:定义SPI功能函数* 日期:2018-03-17* 作者:zx* 版本:Ver.1.0 | 最初版本* 声明:移植自Semtech和凌承芯官方Demo* Copyright (C) 2018 zx. All rights reserved.
*******************************************************************/
#include "SX1278/SX1278.h"
#include "SPIx/SPIx.h"
#include "DELAY/Delay.h"unsigned char   Frequency[3]={0x6c,0x80,0x00};unsigned char   SpreadingFactor=7;             //扩频因子,7-12,扩频因子选小一些,发射时间会更快一些。unsigned char   CodingRate=2;                   //编码率,1-4unsigned char   Bw_Frequency=9;                 //信号带宽,6-9unsigned char   powerValue= 15;                 //功率设置,作为power_data数组的索引
unsigned char   power_data[16]={0X80,0X81,0X82,0X83,0X84,0X85,0X86,0X87,0X88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f};unsigned char   RF_EX0_STATUS;unsigned char   CRC_Value;unsigned char   SX1278_RLEN;/***************************读写SX1278的基础函数********************************/
/*** 功能:向SX1278指定地址中写入数据,通常用作更改某寄存器中的值* 参数:*       addr:寄存器地址,寄存器地址参考头文件或者官方手册*            读或写由地址最高位决定*       byte:待发送数据* 返回值:None*/
void writeSX1278(unsigned char addr, unsigned char buffer)
{ setNSS(0);                      //拉低NSSsendSPIxByte(SPI2, addr|0x80);sendSPIxByte(SPI2, buffer);setNSS(1);                      //拉高NSS
}/*** 功能:读取SX1278返回的数据* 参数:*       addr:寄存器地址,寄存器地址参考头文件或者官方手册*            读或写由地址最高位决定* 返回值:返回指定寄存器当中的值*/
unsigned char readSX1278(unsigned char addr)
{unsigned char Value;setNSS(0);                      //拉低NSSsendSPIxByte(SPI2, addr&0x7f);Value = readSPIxByte(SPI2);setNSS(1);                     //拉高NSSreturn Value;
}
/**********************************~END~************************************/   /******************************配置SX1278函数********************************/
/*** 功能:设置SX1278工作状态* 参数:*       opMode:操作模式 取值见RFMode_SET枚举* 返回值:None*/
void setSX1278OpMode( RFMode_SET opMode )
{unsigned char opModePrev;opModePrev=readSX1278(REG_LR_OPMODE);     //读0x01模式寄存器opModePrev &=0xf8;                        //清零低三位opModePrev |= (unsigned char)opMode;      //或上形参writeSX1278(REG_LR_OPMODE, opModePrev);   //重新写回去
}/*** 功能:设置SX1278工作模式* 参数:*       opMode:分为FSK和LoRa两种,通常选择LoRa* 返回值:None*/
void setSX1278LoRaFSK( Debugging_fsk_ook opMode )
{unsigned char opModePrev;opModePrev=readSX1278(REG_LR_OPMODE); //读0x01模式寄存器opModePrev &=0x7F; //清零最高位opModePrev |= (unsigned char)opMode;  //或上形参writeSX1278( REG_LR_OPMODE, opModePrev); //重新写回去
}/*** 功能:设置SX1278射频频率* 参数:None* 返回值:None* 补充:射频频率= (Frequency[0]<<16 | Frequency[1]<<8 |  Frequency[2])*61.035*       即射频频率 = 0x6C8000 * 61.035 = 433.99MHz*/
void setSX1278RFFrequency(void)
{writeSX1278( REG_LR_FRFMSB, Frequency[0]);  //写0x06寄存器writeSX1278( REG_LR_FRFMID, Frequency[1]);  //写0x07寄存器writeSX1278( REG_LR_FRFLSB, Frequency[2]);  //写0x08寄存器
}/*** 功能:设置SX1278射频功率* 参数:*        power:功率值数组索引* 返回值:None*/
void setSX1278RFPower(unsigned char power )
{writeSX1278( REG_LR_PADAC, 0x87);                   //设置更高功率writeSX1278( REG_LR_PACONFIG,  power_data[power] ); //若没有这一句,频谱仪几乎测不到信号,但是可以进行正常收发。
}/*** 功能:SX1278数据包配置* 参数:*        value:待设置值* 返回值:None*/
void setSX1278NbTrigPeaks(unsigned char value )
{unsigned char RECVER_DAT;RECVER_DAT = readSX1278( 0x31);  //Read RegDetectOptimize,RECVER_DAT = ( RECVER_DAT & 0xF8 ) | value; //process;writeSX1278( 0x31, RECVER_DAT );  //write back;
}
/*** 功能:设置SX1278扩频因子* 参数:*        factor:扩频因子 7-12* 返回值:None*/
void setSX1278SpreadingFactor(unsigned char factor )
{unsigned char RECVER_DAT;setSX1278NbTrigPeaks(3); //0x03-->SF7 to SF12RECVER_DAT=readSX1278( REG_LR_MODEMCONFIG2); //读0x1E寄存器  RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG2_SF_MASK ) | ( factor << 4 );writeSX1278( REG_LR_MODEMCONFIG2, RECVER_DAT );
}/*** 功能:设置SX1278纠错编码* 参数:*        value:纠错编码率 1-4* 返回值:None*/
void setSX1278ErrCode(unsigned char value)
{   unsigned char RECVER_DAT;RECVER_DAT=readSX1278( REG_LR_MODEMCONFIG1); //读0x1D寄存器RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG1_CODINGRATE_MASK ) | ( value << 1 );       //纠错编码率,位3~1。writeSX1278( REG_LR_MODEMCONFIG1, RECVER_DAT);
}/*** 功能:设置是否开启SX1278的CRC校验* 参数:*        enable:是否使能 0或1* 返回值:None*/
void setSX1278PacketCRC(BOOL_t enable )
{   unsigned char RECVER_DAT;RECVER_DAT= readSX1278( REG_LR_MODEMCONFIG2);  //读0x1E寄存器 RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) | ( enable << 2 );writeSX1278( REG_LR_MODEMCONFIG2, RECVER_DAT );
}/*** 功能:设置SX1278扩频带宽* 参数:*        bw:带宽值 6-9* 返回值:None*/
void setSX1278BandWidth(unsigned char bw)
{unsigned char RECVER_DAT;RECVER_DAT=readSX1278( REG_LR_MODEMCONFIG1);  //读0x1D寄存器RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG1_BW_MASK ) | ( bw << 4 );writeSX1278( REG_LR_MODEMCONFIG1, RECVER_DAT );
}/*** 功能:设置是否将SX1278的报头设置为隐式模式* 参数:*        enable:使能状态,0或1* 返回值:None*/
void setSX1278ImplicitHeader(BOOL_t enable)
{unsigned char RECVER_DAT;RECVER_DAT=readSX1278( REG_LR_MODEMCONFIG1 );  //读0x1D寄存器RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK ) | ( enable );writeSX1278( REG_LR_MODEMCONFIG1, RECVER_DAT );
}/*** 功能:设置SX1278接收超时时间* 参数:*        value:超时值* 返回值:None*/
void setSX1278SymbTimeout(unsigned int value )
{unsigned char RECVER_DAT[2];RECVER_DAT[0]=readSX1278( REG_LR_MODEMCONFIG2 );    //读0x1E寄存器RECVER_DAT[1]=readSX1278( REG_LR_SYMBTIMEOUTLSB );  //读0x1F寄存器RECVER_DAT[0] = ( RECVER_DAT[0] & RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK ) | ( ( value >> 8 ) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK );RECVER_DAT[1] = value & 0xFF;writeSX1278( REG_LR_MODEMCONFIG2, RECVER_DAT[0]);writeSX1278( REG_LR_SYMBTIMEOUTLSB, RECVER_DAT[1]);
}/*** 功能:设置SX1278负载字节长度* 参数:*        value:负载字节长度,最大值256,调用时要注意* 返回值:None*/
void setSX1278PayLoadLength(unsigned char value)
{writeSX1278( REG_LR_PAYLOADLENGTH, value );  //写0x22寄存器,RegPayloadLength
} /*** 功能:是否使能SX1278低速率优化* 参数:*        enable:使能状态 0或1* 返回值:None*/
void setSX1278MobileNode(BOOL_t enable )
{    unsigned char RECVER_DAT;RECVER_DAT=readSX1278( REG_LR_MODEMCONFIG3 );  //读0x26寄存器,低数据率优化RECVER_DAT = ( RECVER_DAT & RFLR_MODEMCONFIG3_MOBILE_NODE_MASK ) | ( enable << 3 );writeSX1278( REG_LR_MODEMCONFIG3, RECVER_DAT );
}/*** 功能:设置SX1278为连续接收接收模式* 参数:None* 返回值:None*/
void setSX1278Receive (void)
{setSX1278OpMode(Stdby_mode );writeSX1278(REG_LR_IRQFLAGSMASK,IRQN_RXD_Value);  //0x11,打开接收中断writeSX1278(REG_LR_HOPPERIOD,PACKET_MIAX_Value);  //0x24寄存器,设置频率跳变周期为最大writeSX1278( REG_LR_DIOMAPPING1,0X00);            //DIO引脚映射设置,按默认writeSX1278( REG_LR_DIOMAPPING2,0X00);   setSX1278OpMode(Receiver_mode);                   //设置为连续接收模式
}/*** 功能:复位SX1278,只在初始化之前复位* 参数:None* 返回值:None*/
void resetSX1278(void)
{GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(10);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(10);
}
/*** 功能:初始化SX1278* 参数:None* 返回值:None*/
void initSX1278(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12;            //配置PB12为SX1278复位引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_12);    resetSX1278();                                          //复位设备setSX1278OpMode(Sleep_mode);                            //设置睡眠模式setSX1278LoRaFSK(LORA_mode);                            // 设置扩频模式setSX1278OpMode(Stdby_mode);                            // 设置为普通模式writeSX1278( REG_LR_DIOMAPPING1,GPIO_VARE_1);           //写0x40寄存器,DIO引脚映射设置,设为00.writeSX1278( REG_LR_DIOMAPPING2,GPIO_VARE_2);           //写0x41寄存器setSX1278RFFrequency();                                 //频率设置setSX1278RFPower(powerValue);                           //功率设置setSX1278SpreadingFactor(SpreadingFactor);                // 扩频因子设置setSX1278ErrCode(CodingRate);                          //纠错编码率设置setSX1278PacketCRC(true);                              //CRC 校验打开setSX1278BandWidth(Bw_Frequency);                     //设置扩频带宽, 125khzsetSX1278ImplicitHeader(false);                         //同步头是显性模式setSX1278PayLoadLength(0xff);                           //设置有效负载长度setSX1278SymbTimeout(0x3FF);                            //设置接收超时时间,TimeOut = SymbTimeout * Ts。setSX1278MobileNode(true);                                //低数据率优化,当有效数据速率较低时,必须使用LowDataRateOptimize位提高LoRa链路的鲁棒性。writeSX1278(REG_LR_IRQFLAGS, 0xff); setSX1278Receive();                                     //设置为连续接收模式
}
/*** 功能:发送数据包* 参数:*       buffer:数据包地址*       len:数据包长度* 返回值:None*/
void transmitPackets(unsigned char *buffer,unsigned char len)
{   unsigned char i;setSX1278OpMode( Stdby_mode );writeSX1278( REG_LR_HOPPERIOD, 0 );                //不做频率跳变writeSX1278(REG_LR_IRQFLAGSMASK,IRQN_TXD_Value); //打开发送中断writeSX1278( REG_LR_PAYLOADLENGTH, len);       //最大数据包设置writeSX1278( REG_LR_FIFOTXBASEADDR, 0);          //写Tx FIFO基址writeSX1278( REG_LR_FIFOADDRPTR, 0 );            //FIFO指针setNSS(0);                                   //拉低NSSsendSPIxByte(SPI2,0x80);                         //0X00 | 0X80,突发访问,写for(i = 0;i<len;i++)                             //将待发送数据发送到FIFO并等待发送{sendSPIxByte(SPI2,*buffer);buffer++;}setNSS(1);                                       //拉高NSSwriteSX1278(REG_LR_DIOMAPPING1,0x40);            //设置0x40寄存器为0100 0000b,即设置发射完成指示映射到DIO0引脚writeSX1278(REG_LR_DIOMAPPING2,0x00);setSX1278OpMode(Transmitter_mode);               //设置为传输模式while((readSX1278(REG_LR_IRQFLAGS)&0x08) != 0x08)//等待发送完成{Delay_ms(20);}writeSX1278(REG_LR_IRQFLAGS, 0xff);              //清零所有标志位,所有的DIOx口都会恢复低电平
}void receivePackets(unsigned char* buffer)
{unsigned char i;unsigned char len;setSX1278Receive();if((readSX1278(REG_LR_IRQFLAGS)&0x40)==0x40)            //接收完成{if((readSX1278(REG_LR_MODEMCONFIG2)&0x04)==0x04)    //是否CRC校验完成{writeSX1278 (REG_LR_FIFOADDRPTR,0x00);          //设置SPI接口在FIFO缓冲区中的地址指针len = readSX1278(REG_LR_NBRXBYTES);             //读取最后一个包的字节数setNSS(0);sendSPIxByte(SPI2,0x00);                        //0X00 | 0X00,突发访问,读。for(i=0;i<len;++i)                              //读取接收到的数据到指定数组{buffer[i]= readSPIxByte(SPI2);        }setNSS(1);}writeSX1278(REG_LR_IRQFLAGS, 0xff);  }
}
/**********************************~END~************************************/

main.c

/******************************************************************* 文件:main.c* 功能:主函数入口* 日期:2018-02-16* 作者:zx* 版本:Ver.1.0 | 最初版本* 官博:http://fengmeitech.club* Copyright (C) 2017 zx. All rights reserved.
*******************************************************************/
#include "stdio.h8include "DELAY/Delay.h"
#include "UART/uart.h"
#include "ADC/ADC.h"
#include "LED/LED.h"
#include "IIC/IIC.h"
#include "OLED/OLED.h"
#include "SPIx/SPIx.h"
#include "SX1278/SX1278.h"int main(void)
{u8 i = 0;u8 rx;/*初始化各外设*/ initSysTick();  initADC();initUART();           //波特率9600initLED();initIIC();initOLED();initSPIx(SPI2);initSX1278();formatScreen(0x00);for(i=0;i<=128;i+=2)  //风媒电子LOGO从左向右动态显示{showImage(0,0,i,8,FM_LOGO_ENUM);}formatScreen(0x00);showCNString(32,0,"ooo",FONT_16_CN);showNumber(0,2,rx,DEC,5,FONT_16_CN);while (1){receivePackets(&rx);printf("%d\n",rx);showNumber(0,2,rx,DEC,3,FONT_16_EN);toggleLED();Delay_ms(500);}
}

SPI驱动SX1278模块1-网关.SPI头文件,c文件,sx1278头文件和c文件,主函数相关推荐

  1. linux spi驱动分析 三,Linux下SPI驱动分析

    /* 神奇的分割线 */ 626/*-------------------------------------------------------------------------*/ 627 62 ...

  2. SPI 接口OLED 模块 - 兼容5V 和3.3V 电平

    PCB 布局参考了老王0.8元128x32OLED显示屏转接板,开源项目地址:老王0.8元128x32OLED. 老王家买的屏幕放了快一年了,终于还是决定整个单独的模块,之前一直打算集成到开发板上的, ...

  3. linux SPI驱动开发

    一,linux内核设备驱动分三类 1,字符设备驱动:按字节来访问设备,字符驱动负责驱动字符设备,这样的驱动通常实现open,close,read,write系统调用. 特点:操作的硬件,按照字节流形式 ...

  4. SPI驱动框架源码分析

     SPI驱动框架源码分析 2013-04-12 16:13:08 分类: LINUX SPI驱动框架源码分析 SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式.相关通讯设 ...

  5. Linux SPI驱动框架(1)——核心层

    概述   linux SPI驱动框架主要分为核心层,控制器驱动层以及设备驱动层.具体结构可参考下图   图中,最下层是硬件空间,SPI总线控制器,总线控制器负责硬件上的数据交互.内核空间中,需要有对应 ...

  6. SPI驱动_linux

    目录 1.Linux下SPI驱动框架简介 1)SPI主机驱动 2)SPI设备驱动 3)SPI设备和驱动匹配过程 2.SPI设备驱动编写流程 1)SPI设备信息描述 2)SPI设备数据收发处理流程 3. ...

  7. STM32L475 SPI驱动LCD ST7789V2详解

    概述 最近在学习正点原子潘多拉开发板,在此结合原子哥的代码, 对SPI驱动LCD做一个详细介绍. TFTLCD 和 SPI TFTLCD介绍 TFT-LCD 即薄膜晶体管液晶显示器.其英文全称为:Th ...

  8. Linux SPI驱动框架(2)——控制器驱动层

    SPI控制器驱动层   上节中,讲了SPI核心层的东西,这一部分,以全志平台SPI控制器驱动为例,对SPI控制器驱动进行说明. SPI控制器驱动,即SPI硬件控制器对应的驱动,核心部分需要实现硬件SP ...

  9. Linux SPI驱动框架(3)——设备驱动层

    SPI设备驱动层   Linux SPI驱动框架(1)和(2)中分别介绍了SPI框架中核心层,和控制器驱动层.其实实际开发过程中,不是IC原厂工程师比较少会接触控制器驱动层,设备驱动层才是接触比较多的 ...

最新文章

  1. FileZilla 连接不上虚拟机 ubuntu
  2. git设置master权限_git怎么控制成员的权限?
  3. Npgsql使用入门(三)【批量导入数据】
  4. vscode 常用配置
  5. java.net.SocketException: Software caused connection abort: socket write error
  6. python_open3d_Error: The DISPLAY environment variable is missing
  7. jasperprint java_jasperReport的一些参数
  8. akamai反爬虫 akamai2.0 反爬 akamiv2 阿卡迈|ti|德州仪器|nike|机票预定| Maersk
  9. 软件测试的功能点理解
  10. Protel常用封装库
  11. php数字转成字符串的函数,php怎么将数字转成字符串?
  12. audit2allow命令提示No module named sepolgen.audit
  13. 编辑为什么建议转投_论文被退稿建议转投他刊是什么意思?
  14. 今天生日,感概人生!
  15. 为什么要用RSocket
  16. Android各种轮子
  17. ITU-T的Recommendation和IETF的RFC标准文档的下载地址
  18. 维特智能姿态传感器WT901C-485调试流程
  19. Zed Shaw:一位老程序员的建议
  20. 如何做人,如何处世。

热门文章

  1. Windows系统文件详解
  2. 吴军 阅读与写作50讲 02 如何读懂作者的内心 读后感
  3. 清橙A1210. 光棱坦克
  4. 手写jQuery源码
  5. C语言程序设计教程_第四章:键盘输入与屏幕输出_笔记整理
  6. FortiGate命令行
  7. core dumped调试Segmentation fault
  8. Linux下通过CCID协议与USB设备进行交互经验总结
  9. Android启动活动用什么方法,Android - 使用intent uri从命令行启动活动
  10. 神经网络实现猫的种类识别