增加RF-AP程序
This commit is contained in:
parent
bd11de83c5
commit
d9b1f12e24
|
|
@ -0,0 +1,307 @@
|
|||
#ifndef FR2433_RFSX
|
||||
#define FR2433_RFSX
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 版权: Haybin.Wu@studio
|
||||
// 文件名:
|
||||
// 版本: V1.0
|
||||
// 工作环境: IAR v6.20
|
||||
// 作者: Haybin
|
||||
// 生成日期: 2016.05
|
||||
// 功能: API for FR4133
|
||||
// 修改日志:
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#include <MSP430FR2433.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
//======================================================================================
|
||||
#define CPU_MCLK 8000000
|
||||
#define DelayUs(us) __delay_cycles((CPU_MCLK/1000000UL) * us)
|
||||
#define DelayMs(ms) __delay_cycles((CPU_MCLK/1000UL) * ms)
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//只需修改下列引脚
|
||||
//SX1276 SPI I/O definitions
|
||||
#define SPI_PSEL P1SEL0
|
||||
#define SPI_PDIR P1DIR
|
||||
#define SPI_POUT P1OUT
|
||||
#define SPI_SI_BIT BIT2
|
||||
#define SPI_SO_BIT BIT3
|
||||
#define SPI_CLK_BIT BIT1
|
||||
|
||||
#define SPI_NSS_BIT BIT0
|
||||
#define SPI_NSS_PDIR P1DIR
|
||||
#define SPI_NSS_POUT P1OUT
|
||||
|
||||
//DIO0
|
||||
#define DIO0_BIT BIT6
|
||||
#define DIO0_DIR P1DIR
|
||||
#define DIO0_IFG P1IFG
|
||||
#define DIO0_IES P1IES
|
||||
#define DIO0_IE P1IE
|
||||
|
||||
//DIO1
|
||||
#define DIO1_BIT BIT7
|
||||
#define DIO1_DIR P1DIR
|
||||
#define DIO1_IFG P1IFG
|
||||
#define DIO1_IES P1IES
|
||||
#define DIO1_IE P1IE
|
||||
//DIO3
|
||||
#define DIO3_BIT BIT4
|
||||
#define DIO3_DIR P2DIR
|
||||
#define DIO3_IFG P2IFG
|
||||
#define DIO3_IES P2IES
|
||||
#define DIO3_IE P2IE
|
||||
//RST
|
||||
#define RST_BIT BIT1
|
||||
#define RST_PDIR P3DIR
|
||||
#define RST_POUT P3OUT
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//SX1276 SPI I/O definitions
|
||||
|
||||
//NSS
|
||||
#define SPI_NSS_DIR_OUT SPI_NSS_PDIR |= SPI_NSS_BIT //片选 out
|
||||
#define SPI_NSS_OUT_1 SPI_NSS_POUT |= SPI_NSS_BIT //1
|
||||
#define SPI_NSS_OUT_0 SPI_NSS_POUT &= (~SPI_NSS_BIT) //1
|
||||
|
||||
//DIO0
|
||||
#define DIO0_IFG_H DIO0_IFG |= DIO0_BIT
|
||||
#define DIO0_IFG_L DIO0_IFG &= ~DIO0_BIT
|
||||
#define DIO0_IES_H DIO0_IES |= DIO0_BIT
|
||||
#define DIO0_IES_L DIO0_IES &= ~DIO0_BIT
|
||||
#define DIO0_IE_H DIO0_IE |= DIO0_BIT
|
||||
#define DIO0_IE_L DIO0_IE &= ~DIO0_BIT
|
||||
|
||||
//DIO1
|
||||
#define DIO1_IFG_H DIO1_IFG |= DIO1_BIT
|
||||
#define DIO1_IFG_L DIO1_IFG &= ~DIO1_BIT
|
||||
#define DIO1_IES_H DIO1_IES |= DIO1_BIT
|
||||
#define DIO1_IES_L DIO1_IES &= ~DIO1_BIT
|
||||
#define DIO1_IE_H DIO1_IE |= DIO0_BIT
|
||||
#define DIO1_IE_L DIO1_IE &= ~DIO1_BIT
|
||||
|
||||
//DIO3
|
||||
#define DIO3_IFG_H DIO3_IFG |= DIO3_BIT
|
||||
#define DIO3_IFG_L DIO3_IFG &= ~DIO3_BIT
|
||||
#define DIO3_IES_H DIO3_IES |= DIO3_BIT
|
||||
#define DIO3_IES_L DIO3_IES &= ~DIO3_BIT
|
||||
#define DIO3_IE_H DIO3_IE |= DIO3_BIT
|
||||
#define DIO3_IE_L DIO3_IE &= ~DIO3_BIT
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : SX1276 I/O pins definitions
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Init_IO( void )
|
||||
{
|
||||
//DIO0为P2.0
|
||||
//P2DIR &= ~BIT0;
|
||||
//P2OUT |= BIT0; // Configure DIO0 as pulled-up
|
||||
//P2REN |= BIT0; // DIO0pull-up register enable
|
||||
DIO0_DIR&=~DIO0_BIT;
|
||||
DIO0_IES_L; // DIO0 Hi/Low edge
|
||||
DIO0_IE_L; // DIO0 interrupt enabled
|
||||
DIO0_IFG_L; // DIO0IFG cleared
|
||||
|
||||
//DIO1为P2.1
|
||||
//P2DIR &= ~BIT1;
|
||||
//P2OUT |= BIT1; // Configure DIO1 as pulled-up
|
||||
//P2REN |= BIT1; // DIO1pull-up register enable
|
||||
DIO1_DIR&=~DIO1_BIT;
|
||||
DIO1_IES_L; // DIO1 Hi/Low edge
|
||||
DIO1_IE_L; // DIO1 interrupt enabled
|
||||
DIO1_IFG_L; // DIO1IFG cleared
|
||||
|
||||
//DIO3为P2.3
|
||||
//P2DIR &= ~BIT3;
|
||||
//P2OUT |= BIT3; // Configure DIO3 as pulled-up
|
||||
//P2REN |= BIT3; // DIO3pull-up register enable
|
||||
DIO3_DIR&=~DIO3_BIT;
|
||||
DIO3_IES_L; // DIO3 Hi/Low edge
|
||||
DIO3_IE_L; // DIO3 interrupt enabled
|
||||
DIO3_IFG_L; // DIO3IFG cleared
|
||||
|
||||
|
||||
//SX1276 SPI I/O definitions
|
||||
// Configure SPI
|
||||
//SPI SET
|
||||
SPI_NSS_DIR_OUT;
|
||||
SPI_NSS_OUT_1; // /CS disable
|
||||
|
||||
// SPI option select
|
||||
SPI_PSEL |= SPI_SI_BIT+SPI_SO_BIT+SPI_CLK_BIT;
|
||||
|
||||
UCB0CTLW0 |= UCSWRST; // **Put state machine in reset**
|
||||
UCB0CTLW0 |= UCMST|UCSYNC|UCCKPH|UCMSB; // 3-pin, 8-bit SPI master
|
||||
// Clock polarity high, MSB
|
||||
UCB0CTLW0 |= UCSSEL__SMCLK; // SMCLK
|
||||
UCB0BR0 = 1; // /2,fBitClock = fBRCLK/(UCBRx+1).
|
||||
UCB0BR1 = 0; //
|
||||
UCB0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
|
||||
|
||||
//SX1276 RESET I/O definitions
|
||||
RST_PDIR |= RST_BIT;
|
||||
RST_POUT |= RST_BIT;
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 开启睡眠超时定时器
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void ON_Sleep_Timerout(void)
|
||||
{
|
||||
|
||||
//Timer1_A3 setup
|
||||
TA1R =0; //清除定时器计数器
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768;
|
||||
TA0CTL |= TASSEL_1 | MC_1; //开启超时定时器
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 关闭睡眠超时定时器
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void OFF_Sleep_Timerout(void)
|
||||
{
|
||||
//TA0R =0; //清除定时器计数器
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768;
|
||||
TA0CTL = TASSEL_1 | MC_0; //关闭定时器
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 复位
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Reset(void)
|
||||
{
|
||||
RST_POUT &= ~RST_BIT; //硬件复位IO口输出0
|
||||
DelayMs(6); //延时
|
||||
RST_POUT |= RST_BIT; //输出为1
|
||||
DelayMs(5);
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址连续发送数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
uint8_t i;
|
||||
SPI_PSEL |= SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
SPI_NSS_OUT_0;
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
UCB0IFG &= ~UCRXIFG; // Clear flag
|
||||
UCB0TXBUF = (addr | 0x80); // Send address
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for TX to finish
|
||||
UCB0IFG &= ~UCTXIFG; // Clear flag
|
||||
for( i = 0; i < size; i++ )
|
||||
{
|
||||
UCB0TXBUF = buffer[i]; // Send data
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for TX to finish
|
||||
UCB0IFG &= ~UCTXIFG;
|
||||
}
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
SPI_NSS_OUT_1;
|
||||
SPI_PSEL &= ~SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址连续读数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *buffer,存储数组指针 uint8_t size要读的长度
|
||||
// 返回参数 : 数据返回到*buffer中
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
uint8_t i;
|
||||
SPI_PSEL |= SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
SPI_NSS_OUT_0;
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
UCB0IFG &= ~UCRXIFG; // Clear flag
|
||||
UCB0TXBUF = (addr & 0x7F); // Send address
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for end of addr byte TX
|
||||
UCB0IFG &= ~UCTXIFG; // Clear flag
|
||||
for( i = 0; i < size; i++ )
|
||||
{
|
||||
UCB0TXBUF = 0; //Initiate next data RX
|
||||
while (!(UCB0IFG&UCRXIFG)); // Wait for RX to finish
|
||||
buffer[i] = UCB0RXBUF; // Store data from last data RX
|
||||
//读取UCB0RXBUF后,IFG自动Reset
|
||||
}
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
SPI_NSS_OUT_1;
|
||||
SPI_PSEL &= ~SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
UCB0IFG=0;
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址写1字节数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t data数据
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Write( uint8_t addr, uint8_t data )
|
||||
{
|
||||
SX1276WriteBuffer( addr, &data, 1 );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址读1字节数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *data读数据存储地址
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Read( uint8_t addr, uint8_t *data )
|
||||
{
|
||||
SX1276ReadBuffer( addr, data, 1 );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向FIFO写数据
|
||||
// 输入参数 : uint8_t *buffer,数组指针 uint8_t size长度
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
SX1276WriteBuffer( 0, buffer, size );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向FIFO读数据
|
||||
// 输入参数 : uint8_t *buffer,数组指针 uint8_t size长度
|
||||
// 返回参数 : uint8_t *buffer 存储读取内容
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
SX1276ReadBuffer( 0, buffer, size );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF TX/RX的PA切换
|
||||
// 输入参数 : bool txEnable 切换逻辑
|
||||
// 返回参数 : 无
|
||||
// 说明 :真:作为TX。假:作为RX 为硬件两个PA控制IO口
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteRxTx( bool txEnable )
|
||||
{
|
||||
if( txEnable != 0 ) //如果为真,为TX
|
||||
{
|
||||
;
|
||||
}
|
||||
else //为假,为RX
|
||||
{
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
//*****************************************************************************************
|
||||
#endif
|
||||
|
|
@ -0,0 +1,525 @@
|
|||
// Haybin_Wu
|
||||
// Shenitech-RD
|
||||
// 2016.5
|
||||
// Built with IAR Embedded Workbench v6.2
|
||||
//******************************************************************************
|
||||
// Modify by Qian Xianghong
|
||||
// 2020.10
|
||||
// 修改日志:将无线模块做成串口和RF双向透传模式。
|
||||
//******************************************************************************
|
||||
#include <msp430FR2433.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "FR2433-RFSX.h"
|
||||
#include "RF_SX1276.h"
|
||||
|
||||
// 射频配置参数
|
||||
lora_param_t Lora_Param;
|
||||
|
||||
#define TRAN_BUF_SIZE (1024)
|
||||
|
||||
// 用UA1串口做打印输出,方便调试
|
||||
char printBuf[200];
|
||||
void uart_print()
|
||||
{
|
||||
#if 0 // 打印串口的2个引脚用作MD0、MD1模式选择
|
||||
char *p = printBuf;
|
||||
while(*p)
|
||||
{
|
||||
if(*p == '\n') // 换行前添加回车
|
||||
{
|
||||
while(!(UCA1IFG & UCTXIFG));
|
||||
UCA1TXBUF = '\r';
|
||||
}
|
||||
while(!(UCA1IFG & UCTXIFG));
|
||||
UCA1TXBUF = *p++;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// 可变参数的宏定义
|
||||
#define PRINTF(format, ...) \
|
||||
{ \
|
||||
snprintf(printBuf, sizeof(printBuf), format, ##__VA_ARGS__); \
|
||||
uart_print(); \
|
||||
}
|
||||
|
||||
// UA0接收上位机数据的buf
|
||||
uint8_t UA0_RxBuf[TRAN_BUF_SIZE] = {0};
|
||||
uint16_t UA0_RxBuf_Length = 0;
|
||||
uint16_t UA0_RxBuf_offset = 0;
|
||||
// UA0接收超时
|
||||
volatile uint8_t UA0_Rx_Timeout = 1;
|
||||
|
||||
// RF接收数据的buf
|
||||
uint8_t RF_RxBuf[TRAN_BUF_SIZE] = {0};
|
||||
uint16_t RF_RxBuf_Length = 0;
|
||||
uint16_t RF_RxBuf_offset = 0;
|
||||
// RF接收超时标志
|
||||
volatile uint8_t RF_Rx_Timeout = 1;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 主串口初始化
|
||||
void UA0_Init(uint32_t baudrate)
|
||||
{
|
||||
// Configure UART
|
||||
UCA0CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
if(baudrate == 115200)
|
||||
{
|
||||
UCA0BR0 = 4; // 8000000/16/115200//这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.44444
|
||||
UCA0MCTLW = 0x5500 | UCOS16 | UCBRF_5;//微调Baud Rate
|
||||
}
|
||||
else if(baudrate == 38400)
|
||||
{
|
||||
UCA0BR0 = 13; // 8000000/16/38400 /这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.33333
|
||||
UCA0MCTLW = 0x8400 | UCOS16 | UCBRF_0;//微调Baud Rate
|
||||
}
|
||||
else
|
||||
{
|
||||
UCA0BR0 = 52; // 8000000/16/9600 /这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.33333
|
||||
UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;//微调Baud Rate
|
||||
}
|
||||
UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
}
|
||||
|
||||
// 主串口应答(配置命令)
|
||||
void UA0_Response(char *s)
|
||||
{
|
||||
while(*s)
|
||||
{
|
||||
while(!(UCA0IFG & UCTXIFG));
|
||||
UCA0TXBUF = *s++;
|
||||
}
|
||||
// 等待发送结束
|
||||
while(!(UCA0IFG & UCTXCPTIFG));
|
||||
DelayMs(2);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//主函数
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
int main(void)
|
||||
{
|
||||
uint8_t sendCh;
|
||||
uint8_t sf = 6, bw = 9, cr = 0, ch = 9;
|
||||
|
||||
WDTCTL = (WDTPW | WDTHOLD); // Stop WDT
|
||||
// Port Configuration all un-used pins to output low
|
||||
P1DIR = 0xFF; P2DIR = 0xFF; P3DIR = 0xFF;
|
||||
P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00;
|
||||
PM5CTL0 &= ~LOCKLPM5;//开引脚功能
|
||||
|
||||
// Configure DCO Clock
|
||||
//外部时钟源启动
|
||||
P2SEL0 |= (BIT0 | BIT1); // set XT1 pin as second function
|
||||
do
|
||||
{
|
||||
CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag
|
||||
SFRIFG1 &= ~OFIFG;
|
||||
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
|
||||
//上面清除标志有助于降低功耗
|
||||
|
||||
__bis_SR_register(SCG0); // disable FLL
|
||||
CSCTL3 |= SELREF__XT1CLK; // 外部 32768hz reference source
|
||||
CSCTL0 = 0; // clear DCO and MOD registers
|
||||
CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
|
||||
CSCTL1 |= DCORSEL_3; //DCO=8Mhz
|
||||
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
|
||||
__delay_cycles(3);
|
||||
__bic_SR_register(SCG0); // enable FLL
|
||||
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
|
||||
|
||||
CSCTL4 = SELREF__XT1CLK + SELMS__DCOCLKDIV;// set XT1CLK(32768Hz) as ACLK source & MCLK/SMCLK=DCO
|
||||
|
||||
//Timer0_A0 setup
|
||||
TA0CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA0CCR0 = 32768 / 32; // 串口接收超时: 1000/32=31.25ms
|
||||
TA0CTL = MC__STOP | TACLR; // Stop mode, Clear counter
|
||||
|
||||
//Timer1_A0 setup
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768 / 4; // RF接收超时: 1000/4=250ms
|
||||
TA1CTL = MC__STOP | TACLR; // Stop mode, Clear counter
|
||||
|
||||
// 设置无线模块缺省参数
|
||||
Lora_Param.sof = 0xC2;
|
||||
Lora_Param.addr = 0xADF2; // 通信地址0xADF2
|
||||
Lora_Param.sf = sf; // sf=12
|
||||
Lora_Param.baud = 7; // 9600
|
||||
Lora_Param.cr = cr; // cr=4/8
|
||||
Lora_Param.ch = ch; // 479MHz
|
||||
Lora_Param.power = 1; // 17dBm
|
||||
Lora_Param.bw = bw; // 500kHz
|
||||
Lora_Param.unicast = 0; // unicast off
|
||||
|
||||
// Configure UART pins
|
||||
P1SEL1 &= ~(BIT4 | BIT5); // set 2-UART pin as second function
|
||||
P1SEL0 |= (BIT4 | BIT5); // set 2-UART pin as second function
|
||||
if(Lora_Param.baud == 7)
|
||||
UA0_Init(115200);
|
||||
else if(Lora_Param.baud == 5)
|
||||
UA0_Init(38400);
|
||||
else
|
||||
UA0_Init(9600);
|
||||
|
||||
#if 0 // 打印串口配置
|
||||
// Configure UART pins
|
||||
P2SEL1 &= ~(BIT5 | BIT6); // set 2-UART pin as second function
|
||||
P2SEL0 |= (BIT5 | BIT6); // set 2-UART pin as second function
|
||||
// Configure UART
|
||||
UCA1CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
UCA1BR0 = 4; // 8000000/16/115200//这位大于16 UCOS16位要置位
|
||||
UCA1BR1 = 0; // Fractional portion = 0.44444
|
||||
UCA1MCTLW = 0x5500 | UCOS16 | UCBRF_5;//微调Baud Rate
|
||||
UCA1CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
|
||||
// 打印复位原因(电源引起,不包括看门狗)
|
||||
PRINTF("\nModule reseted: %04X\n", PMMIFG);
|
||||
|
||||
#else // MD0、MD1模式配置
|
||||
P2SEL1 &= ~(BIT3 | BIT5 | BIT6); // set 2-UART pin as GPIO
|
||||
P2SEL0 &= ~(BIT3 | BIT5 | BIT6); // set 2-UART pin as GPIO
|
||||
P2DIR &= ~(BIT5 | BIT6); // Input
|
||||
P2REN |= (BIT5 | BIT6); // enable pull
|
||||
P2OUT &= ~(BIT5 | BIT6); // pull-down
|
||||
|
||||
P2DIR |= BIT3; // Output
|
||||
P2OUT |= BIT3; // Output high
|
||||
#endif
|
||||
|
||||
_EINT();
|
||||
|
||||
// 打印复位原因(电源引起,不包括看门狗)
|
||||
// RF_RxBuf[0] = PMMIFG >> 8;
|
||||
// RF_RxBuf[1] = PMMIFG & 0xFF;
|
||||
// RF_RxBuf_Length = 2;
|
||||
// RF_RxBuf_offset = 0;
|
||||
// UCA0IE |= UCTXIE;
|
||||
// while(UCA0IE & UCTXIE);
|
||||
|
||||
// 读寄存器,清除复位原因
|
||||
SYSRSTIV;
|
||||
|
||||
//无线模块测试化
|
||||
uint8_t try_count = 3; //最多初始化3次
|
||||
while(try_count)
|
||||
{
|
||||
if(SX127x_initLora(&Lora_Param) == NORMAL)
|
||||
break; //无线模块初始化失败复位
|
||||
try_count--;
|
||||
}
|
||||
if(try_count == 0) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
|
||||
// 初始处于接收模式
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
// 默认发送信道
|
||||
sendCh = Lora_Param.ch;
|
||||
|
||||
// 开启看门狗: 超时时间为2^27/SMCLK,在8000000主频下约为16s
|
||||
WDTCTL = (WDTPW | WDTCNTCL | WDTIS_1);
|
||||
|
||||
while(1)
|
||||
{
|
||||
#if 0
|
||||
// for(cr = 0; cr <= 3; cr++)
|
||||
{
|
||||
for(ch = 0; ch <= 40; ch++)
|
||||
{
|
||||
// TODO: 喂狗
|
||||
WDTCTL = (WDTPW | WDTCNTCL | WDTIS_1);
|
||||
|
||||
// 发送参数
|
||||
RF_RxBuf[0] = cr;
|
||||
RF_RxBuf[1] = ch;
|
||||
RF_RxBuf_Length = 2;
|
||||
RF_RxBuf_offset = 0;
|
||||
UCA0IE |= UCTXIE;
|
||||
while(UCA0IE & UCTXIE);
|
||||
|
||||
// 发送报文
|
||||
Lora_Param.cr = cr;
|
||||
Lora_Param.ch = ch;
|
||||
uint8_t try_count = 3; //最多初始化3次
|
||||
while(try_count)
|
||||
{
|
||||
if(SX127x_initLora(&Lora_Param) == NORMAL)
|
||||
break; //无线模块初始化失败复位
|
||||
try_count--;
|
||||
}
|
||||
if(try_count == 0) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
|
||||
UA0_RxBuf_offset = UA0_RxBuf_Length;
|
||||
|
||||
// 切换到接收模式
|
||||
LSD_RF_FreqSet(Lora_Param.ch);
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
|
||||
RF_RxBuf[0] = Lora_Param.sf;
|
||||
RF_RxBuf[1] = Lora_Param.bw;
|
||||
RF_RxBuf_Length = 2;
|
||||
RF_RxBuf_offset = 0;
|
||||
UCA0IE |= UCTXIE;
|
||||
while(UCA0IE & UCTXIE);
|
||||
|
||||
// 延迟3秒
|
||||
DelayMs(4000);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#if 1
|
||||
// TODO: 喂狗
|
||||
WDTCTL = (WDTPW | WDTCNTCL | WDTIS_1);
|
||||
|
||||
// 配置模式
|
||||
if((P2IN & (BIT5 | BIT6)) == (BIT5 | BIT6))
|
||||
{
|
||||
if(UA0_RxBuf_Length - UA0_RxBuf_offset >= 6)
|
||||
{
|
||||
P2OUT &= ~BIT3; // Output low
|
||||
|
||||
if(UA0_RxBuf[0] == 0xC2)
|
||||
{
|
||||
// 保存参数
|
||||
memmove(&Lora_Param, UA0_RxBuf, sizeof(Lora_Param));
|
||||
Lora_Param.addr = (UA0_RxBuf[1] << 8) | UA0_RxBuf[2];
|
||||
|
||||
//无线模块测试化
|
||||
uint8_t try_count = 3; //最多初始化3次
|
||||
while(try_count)
|
||||
{
|
||||
if(SX127x_initLora(&Lora_Param) == NORMAL)
|
||||
break; //无线模块初始化失败复位
|
||||
try_count--;
|
||||
}
|
||||
if(try_count == 0) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
|
||||
// 默认处于接收模式
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
// 默认发送信道
|
||||
sendCh = Lora_Param.ch;
|
||||
// 应答配置命令
|
||||
UA0_Response("OK\r\n");
|
||||
|
||||
// 改变串口波特率
|
||||
if(Lora_Param.baud == 7)
|
||||
UA0_Init(115200);
|
||||
else if(Lora_Param.baud == 5)
|
||||
UA0_Init(38400);
|
||||
else
|
||||
UA0_Init(9600);
|
||||
}
|
||||
UA0_RxBuf_offset += 6;
|
||||
|
||||
P2OUT |= BIT3; // Output high
|
||||
}
|
||||
}
|
||||
// 透传模式
|
||||
else if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
#endif
|
||||
{
|
||||
if(UA0_RxBuf_Length > UA0_RxBuf_offset)
|
||||
{
|
||||
// 定点传输,用指定信道发送
|
||||
if(Lora_Param.unicast && UA0_RxBuf_offset == 0 && UA0_RxBuf_Length > 3)
|
||||
sendCh = UA0_RxBuf[2];
|
||||
|
||||
if(UA0_RxBuf_Length - UA0_RxBuf_offset >= RF_PAYLOAD_LEN)
|
||||
{
|
||||
LSD_RF_FreqSet(sendCh);
|
||||
LSD_RF_SendPacket(UA0_RxBuf + UA0_RxBuf_offset, RF_PAYLOAD_LEN);
|
||||
UA0_RxBuf_offset += RF_PAYLOAD_LEN;
|
||||
PRINTF("Send packet\n");
|
||||
|
||||
// 切换到接收模式
|
||||
LSD_RF_FreqSet(Lora_Param.ch);
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
}
|
||||
else if(UA0_Rx_Timeout)
|
||||
{
|
||||
LSD_RF_FreqSet(sendCh);
|
||||
LSD_RF_SendPacket(UA0_RxBuf + UA0_RxBuf_offset, UA0_RxBuf_Length - UA0_RxBuf_offset);
|
||||
UA0_RxBuf_offset = UA0_RxBuf_Length;
|
||||
PRINTF("Send packet\n");
|
||||
|
||||
// 切换到接收模式
|
||||
LSD_RF_FreqSet(Lora_Param.ch);
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
// Port 1 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=PORT1_VECTOR
|
||||
__interrupt void Port_1(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(PORT1_VECTOR))) Port_1 (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
uint8_t offset = 0;
|
||||
uint8_t len[1] = {0};
|
||||
uint8_t buf[RF_PAYLOAD_LEN];
|
||||
if(DIO0_IFG&DIO0_BIT) //数据传输中断处理
|
||||
{
|
||||
// 清中断
|
||||
DIO0_IFG &= ~DIO0_BIT;
|
||||
|
||||
// 读取RF数据
|
||||
LSD_RF_RxVariPacket(buf, len); //接收可变数据包,如果速率为大速率,只能用接收固定数据包长度
|
||||
|
||||
if(len[0] == 0)
|
||||
return;
|
||||
|
||||
TA1CTL = MC__STOP | TACLR; // 停止定时器,复位计数器
|
||||
TA1CTL = TASSEL__ACLK | MC__UP; // 重新开始计时
|
||||
|
||||
offset = 0;
|
||||
if(RF_Rx_Timeout) // 新的一组数据到来
|
||||
{
|
||||
RF_Rx_Timeout = 0;
|
||||
|
||||
// 复位缓冲区
|
||||
RF_RxBuf_Length = 0;
|
||||
RF_RxBuf_offset = 0;
|
||||
|
||||
if(Lora_Param.unicast)
|
||||
{
|
||||
// 定点传输,地址和信道校验失败
|
||||
if(len[0] <= 3 || buf[2] != Lora_Param.ch || ((buf[0] << 8) | buf[1]) != Lora_Param.addr)
|
||||
return;
|
||||
// 前3个字符丢掉
|
||||
offset = 3;
|
||||
len[0] -= offset;
|
||||
}
|
||||
}
|
||||
|
||||
PRINTF("Recv packet\n");
|
||||
|
||||
// 透传模式
|
||||
if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
{
|
||||
if(RF_RxBuf_Length + len[0] <= TRAN_BUF_SIZE)
|
||||
{
|
||||
memmove(RF_RxBuf + RF_RxBuf_Length, buf + offset, len[0]);
|
||||
// 中断方式向串口转发
|
||||
RF_RxBuf_Length += len[0];
|
||||
UCA0IE |= UCTXIE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Timer0 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER0_A0_VECTOR
|
||||
__interrupt void Timer0_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) Timer0_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 停止定时器,复位计数器
|
||||
TA0CTL = MC__STOP | TACLR;
|
||||
// 串口接收超时
|
||||
UA0_Rx_Timeout = 1;
|
||||
}
|
||||
|
||||
// Timer1 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER1_A0_VECTOR
|
||||
__interrupt void Timer1_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) Timer1_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 停止定时器,复位计数器
|
||||
TA1CTL = MC__STOP | TACLR;
|
||||
// RF接收超时
|
||||
RF_Rx_Timeout = 1;
|
||||
}
|
||||
|
||||
// UAR0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=USCI_A0_VECTOR
|
||||
__interrupt void USCI_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 接收中断
|
||||
if((UCA0IE & UCRXIE) && (UCA0IFG & UCRXIFG))
|
||||
{
|
||||
uint8_t c = UCA0RXBUF;
|
||||
|
||||
TA0CTL = MC__STOP | TACLR; // 停止定时器,复位计数器
|
||||
TA0CTL = TASSEL__ACLK | MC__UP; // 重新开始计时
|
||||
|
||||
if(UA0_Rx_Timeout) // 新的一组数据到来
|
||||
{
|
||||
UA0_Rx_Timeout = 0;
|
||||
// 复位缓冲区
|
||||
UA0_RxBuf_Length = 0;
|
||||
UA0_RxBuf_offset = 0;
|
||||
}
|
||||
|
||||
if(UA0_RxBuf_Length < TRAN_BUF_SIZE)
|
||||
{
|
||||
#if 1
|
||||
// 配置模式
|
||||
if((P2IN & (BIT5 | BIT6)) == (BIT5 | BIT6))
|
||||
{
|
||||
// 第1个字符必须为0xC2
|
||||
if(UA0_RxBuf_Length > 0 || c == 0xC2)
|
||||
UA0_RxBuf[UA0_RxBuf_Length++] = c;
|
||||
}
|
||||
// 透传模式
|
||||
else if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
#endif
|
||||
{
|
||||
// 主函数透传
|
||||
UA0_RxBuf[UA0_RxBuf_Length++] = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 发送中断
|
||||
if((UCA0IE & UCTXIE) && (UCA0IFG & UCTXIFG))
|
||||
{
|
||||
UCA0TXBUF = RF_RxBuf[RF_RxBuf_offset++]; // 发送字符
|
||||
if(RF_RxBuf_offset >= RF_RxBuf_Length) // 全部发送完
|
||||
{
|
||||
// 禁止中断
|
||||
UCA0IE &= ~UCTXIE;
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,307 @@
|
|||
#ifndef FR2433_RFSX
|
||||
#define FR2433_RFSX
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 版权: Haybin.Wu@studio
|
||||
// 文件名:
|
||||
// 版本: V1.0
|
||||
// 工作环境: IAR v6.20
|
||||
// 作者: Haybin
|
||||
// 生成日期: 2016.05
|
||||
// 功能: API for FR4133
|
||||
// 修改日志:
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#include <MSP430FR2433.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
//======================================================================================
|
||||
#define CPU_MCLK 8000000
|
||||
#define DelayUs(us) __delay_cycles((CPU_MCLK/1000000UL) * us)
|
||||
#define DelayMs(ms) __delay_cycles((CPU_MCLK/1000UL) * ms)
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//只需修改下列引脚
|
||||
//SX1276 SPI I/O definitions
|
||||
#define SPI_PSEL P1SEL0
|
||||
#define SPI_PDIR P1DIR
|
||||
#define SPI_POUT P1OUT
|
||||
#define SPI_SI_BIT BIT2
|
||||
#define SPI_SO_BIT BIT3
|
||||
#define SPI_CLK_BIT BIT1
|
||||
|
||||
#define SPI_NSS_BIT BIT0
|
||||
#define SPI_NSS_PDIR P1DIR
|
||||
#define SPI_NSS_POUT P1OUT
|
||||
|
||||
//DIO0
|
||||
#define DIO0_BIT BIT6
|
||||
#define DIO0_DIR P1DIR
|
||||
#define DIO0_IFG P1IFG
|
||||
#define DIO0_IES P1IES
|
||||
#define DIO0_IE P1IE
|
||||
|
||||
//DIO1
|
||||
#define DIO1_BIT BIT7
|
||||
#define DIO1_DIR P1DIR
|
||||
#define DIO1_IFG P1IFG
|
||||
#define DIO1_IES P1IES
|
||||
#define DIO1_IE P1IE
|
||||
//DIO3
|
||||
#define DIO3_BIT BIT4
|
||||
#define DIO3_DIR P2DIR
|
||||
#define DIO3_IFG P2IFG
|
||||
#define DIO3_IES P2IES
|
||||
#define DIO3_IE P2IE
|
||||
//RST
|
||||
#define RST_BIT BIT1
|
||||
#define RST_PDIR P3DIR
|
||||
#define RST_POUT P3OUT
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//SX1276 SPI I/O definitions
|
||||
|
||||
//NSS
|
||||
#define SPI_NSS_DIR_OUT SPI_NSS_PDIR |= SPI_NSS_BIT //片选 out
|
||||
#define SPI_NSS_OUT_1 SPI_NSS_POUT |= SPI_NSS_BIT //1
|
||||
#define SPI_NSS_OUT_0 SPI_NSS_POUT &= (~SPI_NSS_BIT) //1
|
||||
|
||||
//DIO0
|
||||
#define DIO0_IFG_H DIO0_IFG |= DIO0_BIT
|
||||
#define DIO0_IFG_L DIO0_IFG &= ~DIO0_BIT
|
||||
#define DIO0_IES_H DIO0_IES |= DIO0_BIT
|
||||
#define DIO0_IES_L DIO0_IES &= ~DIO0_BIT
|
||||
#define DIO0_IE_H DIO0_IE |= DIO0_BIT
|
||||
#define DIO0_IE_L DIO0_IE &= ~DIO0_BIT
|
||||
|
||||
//DIO1
|
||||
#define DIO1_IFG_H DIO1_IFG |= DIO1_BIT
|
||||
#define DIO1_IFG_L DIO1_IFG &= ~DIO1_BIT
|
||||
#define DIO1_IES_H DIO1_IES |= DIO1_BIT
|
||||
#define DIO1_IES_L DIO1_IES &= ~DIO1_BIT
|
||||
#define DIO1_IE_H DIO1_IE |= DIO0_BIT
|
||||
#define DIO1_IE_L DIO1_IE &= ~DIO1_BIT
|
||||
|
||||
//DIO3
|
||||
#define DIO3_IFG_H DIO3_IFG |= DIO3_BIT
|
||||
#define DIO3_IFG_L DIO3_IFG &= ~DIO3_BIT
|
||||
#define DIO3_IES_H DIO3_IES |= DIO3_BIT
|
||||
#define DIO3_IES_L DIO3_IES &= ~DIO3_BIT
|
||||
#define DIO3_IE_H DIO3_IE |= DIO3_BIT
|
||||
#define DIO3_IE_L DIO3_IE &= ~DIO3_BIT
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : SX1276 I/O pins definitions
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Init_IO( void )
|
||||
{
|
||||
//DIO0为P2.0
|
||||
//P2DIR &= ~BIT0;
|
||||
//P2OUT |= BIT0; // Configure DIO0 as pulled-up
|
||||
//P2REN |= BIT0; // DIO0pull-up register enable
|
||||
DIO0_DIR&=~DIO0_BIT;
|
||||
DIO0_IES_L; // DIO0 Hi/Low edge
|
||||
DIO0_IE_L; // DIO0 interrupt enabled
|
||||
DIO0_IFG_L; // DIO0IFG cleared
|
||||
|
||||
//DIO1为P2.1
|
||||
//P2DIR &= ~BIT1;
|
||||
//P2OUT |= BIT1; // Configure DIO1 as pulled-up
|
||||
//P2REN |= BIT1; // DIO1pull-up register enable
|
||||
DIO1_DIR&=~DIO1_BIT;
|
||||
DIO1_IES_L; // DIO1 Hi/Low edge
|
||||
DIO1_IE_L; // DIO1 interrupt enabled
|
||||
DIO1_IFG_L; // DIO1IFG cleared
|
||||
|
||||
//DIO3为P2.3
|
||||
//P2DIR &= ~BIT3;
|
||||
//P2OUT |= BIT3; // Configure DIO3 as pulled-up
|
||||
//P2REN |= BIT3; // DIO3pull-up register enable
|
||||
DIO3_DIR&=~DIO3_BIT;
|
||||
DIO3_IES_L; // DIO3 Hi/Low edge
|
||||
DIO3_IE_L; // DIO3 interrupt enabled
|
||||
DIO3_IFG_L; // DIO3IFG cleared
|
||||
|
||||
|
||||
//SX1276 SPI I/O definitions
|
||||
// Configure SPI
|
||||
//SPI SET
|
||||
SPI_NSS_DIR_OUT;
|
||||
SPI_NSS_OUT_1; // /CS disable
|
||||
|
||||
// SPI option select
|
||||
SPI_PSEL |= SPI_SI_BIT+SPI_SO_BIT+SPI_CLK_BIT;
|
||||
|
||||
UCB0CTLW0 |= UCSWRST; // **Put state machine in reset**
|
||||
UCB0CTLW0 |= UCMST|UCSYNC|UCCKPH|UCMSB; // 3-pin, 8-bit SPI master
|
||||
// Clock polarity high, MSB
|
||||
UCB0CTLW0 |= UCSSEL__SMCLK; // SMCLK
|
||||
UCB0BR0 = 1; // /2,fBitClock = fBRCLK/(UCBRx+1).
|
||||
UCB0BR1 = 0; //
|
||||
UCB0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
|
||||
|
||||
//SX1276 RESET I/O definitions
|
||||
RST_PDIR |= RST_BIT;
|
||||
RST_POUT |= RST_BIT;
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 开启睡眠超时定时器
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void ON_Sleep_Timerout(void)
|
||||
{
|
||||
|
||||
//Timer1_A3 setup
|
||||
TA1R =0; //清除定时器计数器
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768;
|
||||
TA0CTL |= TASSEL_1 | MC_1; //开启超时定时器
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 关闭睡眠超时定时器
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void OFF_Sleep_Timerout(void)
|
||||
{
|
||||
//TA0R =0; //清除定时器计数器
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768;
|
||||
TA0CTL = TASSEL_1 | MC_0; //关闭定时器
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 复位
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Reset(void)
|
||||
{
|
||||
RST_POUT &= ~RST_BIT; //硬件复位IO口输出0
|
||||
DelayMs(6); //延时
|
||||
RST_POUT |= RST_BIT; //输出为1
|
||||
DelayMs(5);
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址连续发送数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
uint8_t i;
|
||||
SPI_PSEL |= SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
SPI_NSS_OUT_0;
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
UCB0IFG &= ~UCRXIFG; // Clear flag
|
||||
UCB0TXBUF = (addr | 0x80); // Send address
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for TX to finish
|
||||
UCB0IFG &= ~UCTXIFG; // Clear flag
|
||||
for( i = 0; i < size; i++ )
|
||||
{
|
||||
UCB0TXBUF = buffer[i]; // Send data
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for TX to finish
|
||||
UCB0IFG &= ~UCTXIFG;
|
||||
}
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
SPI_NSS_OUT_1;
|
||||
SPI_PSEL &= ~SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址连续读数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *buffer,存储数组指针 uint8_t size要读的长度
|
||||
// 返回参数 : 数据返回到*buffer中
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
uint8_t i;
|
||||
SPI_PSEL |= SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
SPI_NSS_OUT_0;
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
UCB0IFG &= ~UCRXIFG; // Clear flag
|
||||
UCB0TXBUF = (addr & 0x7F); // Send address
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for end of addr byte TX
|
||||
UCB0IFG &= ~UCTXIFG; // Clear flag
|
||||
for( i = 0; i < size; i++ )
|
||||
{
|
||||
UCB0TXBUF = 0; //Initiate next data RX
|
||||
while (!(UCB0IFG&UCRXIFG)); // Wait for RX to finish
|
||||
buffer[i] = UCB0RXBUF; // Store data from last data RX
|
||||
//读取UCB0RXBUF后,IFG自动Reset
|
||||
}
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
SPI_NSS_OUT_1;
|
||||
SPI_PSEL &= ~SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
UCB0IFG=0;
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址写1字节数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t data数据
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Write( uint8_t addr, uint8_t data )
|
||||
{
|
||||
SX1276WriteBuffer( addr, &data, 1 );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址读1字节数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *data读数据存储地址
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Read( uint8_t addr, uint8_t *data )
|
||||
{
|
||||
SX1276ReadBuffer( addr, data, 1 );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向FIFO写数据
|
||||
// 输入参数 : uint8_t *buffer,数组指针 uint8_t size长度
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
SX1276WriteBuffer( 0, buffer, size );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向FIFO读数据
|
||||
// 输入参数 : uint8_t *buffer,数组指针 uint8_t size长度
|
||||
// 返回参数 : uint8_t *buffer 存储读取内容
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
SX1276ReadBuffer( 0, buffer, size );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF TX/RX的PA切换
|
||||
// 输入参数 : bool txEnable 切换逻辑
|
||||
// 返回参数 : 无
|
||||
// 说明 :真:作为TX。假:作为RX 为硬件两个PA控制IO口
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteRxTx( bool txEnable )
|
||||
{
|
||||
if( txEnable != 0 ) //如果为真,为TX
|
||||
{
|
||||
;
|
||||
}
|
||||
else //为假,为RX
|
||||
{
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
//*****************************************************************************************
|
||||
#endif
|
||||
|
|
@ -0,0 +1,491 @@
|
|||
// Haybin_Wu
|
||||
// Shenitech-RD
|
||||
// 2016.5
|
||||
// Built with IAR Embedded Workbench v6.2
|
||||
//******************************************************************************
|
||||
// Modify by Qian Xianghong
|
||||
// 2020.10
|
||||
// 修改日志:将无线模块做成串口和RF双向透传模式。
|
||||
//******************************************************************************
|
||||
#include <msp430FR2433.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "FR2433-RFSX.h"
|
||||
#include "RF_SX1276.h"
|
||||
|
||||
// 射频配置参数
|
||||
lora_param_t Lora_Param;
|
||||
|
||||
#define TRAN_BUF_SIZE (1024)
|
||||
|
||||
// 用UA1串口做打印输出,方便调试
|
||||
char printBuf[200];
|
||||
void uart_print()
|
||||
{
|
||||
#if 0 // 打印串口的2个引脚用作MD0、MD1模式选择
|
||||
char *p = printBuf;
|
||||
while(*p)
|
||||
{
|
||||
if(*p == '\n') // 换行前添加回车
|
||||
{
|
||||
while(!(UCA1IFG & UCTXIFG));
|
||||
UCA1TXBUF = '\r';
|
||||
}
|
||||
while(!(UCA1IFG & UCTXIFG));
|
||||
UCA1TXBUF = *p++;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// 可变参数的宏定义
|
||||
#define PRINTF(format, ...) \
|
||||
{ \
|
||||
snprintf(printBuf, sizeof(printBuf), format, ##__VA_ARGS__); \
|
||||
uart_print(); \
|
||||
}
|
||||
|
||||
// UA0接收上位机数据的buf
|
||||
uint8_t UA0_RxBuf[TRAN_BUF_SIZE] = {0};
|
||||
uint16_t UA0_RxBuf_Length = 0;
|
||||
uint16_t UA0_RxBuf_offset = 0;
|
||||
// UA0接收超时
|
||||
volatile uint8_t UA0_Rx_Timeout = 1;
|
||||
|
||||
// RF接收数据的buf
|
||||
uint8_t RF_RxBuf[TRAN_BUF_SIZE] = {0};
|
||||
uint16_t RF_RxBuf_Length = 0;
|
||||
uint16_t RF_RxBuf_offset = 0;
|
||||
// RF接收超时标志
|
||||
volatile uint8_t RF_Rx_Timeout = 1;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 主串口初始化
|
||||
void UA0_Init(uint32_t baudrate)
|
||||
{
|
||||
// Configure UART
|
||||
UCA0CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
if(baudrate == 115200)
|
||||
{
|
||||
UCA0BR0 = 4; // 8000000/16/115200//这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.44444
|
||||
UCA0MCTLW = 0x5500 | UCOS16 | UCBRF_5;//微调Baud Rate
|
||||
}
|
||||
else if(baudrate == 38400)
|
||||
{
|
||||
UCA0BR0 = 13; // 8000000/16/38400 /这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.33333
|
||||
UCA0MCTLW = 0x8400 | UCOS16 | UCBRF_0;//微调Baud Rate
|
||||
}
|
||||
else
|
||||
{
|
||||
UCA0BR0 = 52; // 8000000/16/9600 /这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.33333
|
||||
UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;//微调Baud Rate
|
||||
}
|
||||
UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
}
|
||||
|
||||
// 主串口应答(配置命令)
|
||||
void UA0_Response(char *s)
|
||||
{
|
||||
while(*s)
|
||||
{
|
||||
while(!(UCA0IFG & UCTXIFG));
|
||||
UCA0TXBUF = *s++;
|
||||
}
|
||||
// 等待发送结束
|
||||
while(!(UCA0IFG & UCTXCPTIFG));
|
||||
DelayMs(2);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//主函数
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
int main(void)
|
||||
{
|
||||
uint8_t sendCh;
|
||||
|
||||
WDTCTL = (WDTPW | WDTHOLD); // Stop WDT
|
||||
// Port Configuration all un-used pins to output low
|
||||
P1DIR = 0xFF; P2DIR = 0xFF; P3DIR = 0xFF;
|
||||
P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00;
|
||||
PM5CTL0 &= ~LOCKLPM5;//开引脚功能
|
||||
|
||||
// Configure DCO Clock
|
||||
//外部时钟源启动
|
||||
P2SEL0 |= (BIT0 | BIT1); // set XT1 pin as second function
|
||||
do
|
||||
{
|
||||
CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag
|
||||
SFRIFG1 &= ~OFIFG;
|
||||
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
|
||||
//上面清除标志有助于降低功耗
|
||||
|
||||
__bis_SR_register(SCG0); // disable FLL
|
||||
CSCTL3 |= SELREF__XT1CLK; // 外部 32768hz reference source
|
||||
CSCTL0 = 0; // clear DCO and MOD registers
|
||||
CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
|
||||
CSCTL1 |= DCORSEL_3; //DCO=8Mhz
|
||||
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
|
||||
__delay_cycles(3);
|
||||
__bic_SR_register(SCG0); // enable FLL
|
||||
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
|
||||
|
||||
CSCTL4 = SELREF__XT1CLK + SELMS__DCOCLKDIV;// set XT1CLK(32768Hz) as ACLK source & MCLK/SMCLK=DCO
|
||||
|
||||
//Timer0_A0 setup
|
||||
TA0CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA0CCR0 = 32768 / 32; // 串口接收超时: 1000/32=31.25ms
|
||||
TA0CTL = MC__STOP | TACLR; // Stop mode, Clear counter
|
||||
|
||||
//Timer1_A0 setup
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768 / 4; // RF接收超时: 1000/4=250ms
|
||||
TA1CTL = MC__STOP | TACLR; // Stop mode, Clear counter
|
||||
|
||||
// 设置无线模块缺省参数
|
||||
Lora_Param.sof = 0xC2;
|
||||
Lora_Param.addr = 0xADF2; // 通信地址0xADF2
|
||||
Lora_Param.sf = 6; // sf=12
|
||||
Lora_Param.baud = 3; // 9600
|
||||
Lora_Param.cr = 0; // cr=4/5
|
||||
Lora_Param.ch = 9; // 479MHz
|
||||
Lora_Param.power = 1; // 17dBm
|
||||
Lora_Param.freqcast = 0; // freqcast off
|
||||
Lora_Param.bw = 9; // 500kHz
|
||||
Lora_Param.unicast = 0; // unicast off
|
||||
|
||||
// Configure UART pins
|
||||
P1SEL1 &= ~(BIT4 | BIT5); // set 2-UART pin as second function
|
||||
P1SEL0 |= (BIT4 | BIT5); // set 2-UART pin as second function
|
||||
if(Lora_Param.baud == 7)
|
||||
UA0_Init(115200);
|
||||
else if(Lora_Param.baud == 5)
|
||||
UA0_Init(38400);
|
||||
else
|
||||
UA0_Init(9600);
|
||||
|
||||
#if 0 // 配置打印串口
|
||||
// Configure UART pins
|
||||
P2SEL1 &= ~(BIT5 | BIT6); // set 2-UART pin as second function
|
||||
P2SEL0 |= (BIT5 | BIT6); // set 2-UART pin as second function
|
||||
// Configure UART
|
||||
UCA1CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
UCA1BR0 = 4; // 8000000/16/115200//这位大于16 UCOS16位要置位
|
||||
UCA1BR1 = 0; // Fractional portion = 0.44444
|
||||
UCA1MCTLW = 0x5500 | UCOS16 | UCBRF_5;//微调Baud Rate
|
||||
UCA1CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
|
||||
// 打印复位原因(电源引起,不包括看门狗)
|
||||
PRINTF("\nModule reseted: %04X\n", PMMIFG);
|
||||
|
||||
#else // 配置MD0、MD1模式
|
||||
P2SEL1 &= ~(BIT3 | BIT5 | BIT6); // set 2-UART pin as GPIO
|
||||
P2SEL0 &= ~(BIT3 | BIT5 | BIT6); // set 2-UART pin as GPIO
|
||||
P2DIR &= ~(BIT5 | BIT6); // Input
|
||||
P2REN |= (BIT5 | BIT6); // enable pull
|
||||
P2OUT &= ~(BIT5 | BIT6); // pull-down
|
||||
|
||||
P2DIR |= BIT3; // Output
|
||||
P2OUT |= BIT3; // Output high
|
||||
#endif
|
||||
|
||||
_EINT();
|
||||
|
||||
#if 0
|
||||
// 打印复位原因(电源引起,不包括看门狗)
|
||||
RF_RxBuf[0] = PMMIFG >> 8;
|
||||
RF_RxBuf[1] = PMMIFG & 0xFF;
|
||||
RF_RxBuf_Length = 2;
|
||||
RF_RxBuf_offset = 0;
|
||||
UCA0IE |= UCTXIE;
|
||||
while(UCA0IE & UCTXIE);
|
||||
#endif
|
||||
// 读寄存器,清除复位原因
|
||||
SYSRSTIV;
|
||||
|
||||
//无线模块初始化
|
||||
uint8_t try_count = 3; //最多初始化3次
|
||||
while(try_count)
|
||||
{
|
||||
if(SX127x_initLora(&Lora_Param) == NORMAL)
|
||||
break;
|
||||
try_count--;
|
||||
}
|
||||
if(try_count == 0) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
|
||||
// 初始处于接收模式
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
// 默认发送信道
|
||||
sendCh = Lora_Param.ch;
|
||||
|
||||
// 开启看门狗: 超时时间为2^27/SMCLK,在8000000主频下约为16s
|
||||
WDTCTL = (WDTPW | WDTCNTCL | WDTIS_1);
|
||||
|
||||
while(1)
|
||||
{
|
||||
#if 1
|
||||
// TODO: 喂狗
|
||||
WDTCTL = (WDTPW | WDTCNTCL | WDTIS_1);
|
||||
|
||||
// 配置模式
|
||||
if((P2IN & (BIT5 | BIT6)) == (BIT5 | BIT6))
|
||||
{
|
||||
if(UA0_RxBuf_Length - UA0_RxBuf_offset >= sizeof(Lora_Param))
|
||||
{
|
||||
if(UA0_RxBuf[UA0_RxBuf_offset] == 0xC2)
|
||||
{
|
||||
// 保存参数
|
||||
memmove(&Lora_Param, UA0_RxBuf + UA0_RxBuf_offset, sizeof(Lora_Param));
|
||||
// 颠倒地址高低字节
|
||||
Lora_Param.addr = (Lora_Param.addr << 8) | (Lora_Param.addr >> 8);
|
||||
|
||||
//无线模块初始化
|
||||
uint8_t try_count = 3; //最多初始化3次
|
||||
while(try_count)
|
||||
{
|
||||
// 其它参数有变化,无线模块初始化
|
||||
if(SX127x_initLora(&Lora_Param) == NORMAL)
|
||||
break;
|
||||
try_count--;
|
||||
}
|
||||
if(try_count == 0) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
|
||||
// 默认处于接收模式
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
// 默认发送信道
|
||||
sendCh = Lora_Param.ch;
|
||||
// 应答配置命令
|
||||
UA0_Response("OK\r\n");
|
||||
|
||||
// 改变串口波特率
|
||||
if(Lora_Param.baud == 7)
|
||||
UA0_Init(115200);
|
||||
else if(Lora_Param.baud == 5)
|
||||
UA0_Init(38400);
|
||||
else
|
||||
UA0_Init(9600);
|
||||
}
|
||||
|
||||
UA0_RxBuf_offset = UA0_RxBuf_Length;
|
||||
}
|
||||
}
|
||||
// 透传模式
|
||||
else if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
#endif
|
||||
{
|
||||
if(UA0_RxBuf_Length > UA0_RxBuf_offset)
|
||||
{
|
||||
// 定点传输,指定目标地址和信道发送
|
||||
if(Lora_Param.unicast) // 定点发送
|
||||
{
|
||||
if(UA0_RxBuf_offset == 0 && UA0_RxBuf_Length > 3)
|
||||
sendCh = UA0_RxBuf[2];
|
||||
}
|
||||
else if(Lora_Param.freqcast) // 指定信道发送
|
||||
{
|
||||
if(UA0_RxBuf_offset == 0 && UA0_RxBuf_Length > 1)
|
||||
{
|
||||
sendCh = UA0_RxBuf[0];
|
||||
UA0_RxBuf_offset = 1; // 不发送第1发个字节
|
||||
}
|
||||
}
|
||||
|
||||
if(UA0_RxBuf_Length - UA0_RxBuf_offset >= RF_PAYLOAD_LEN)
|
||||
{
|
||||
LSD_RF_FreqSet(sendCh);
|
||||
LSD_RF_SendPacket(UA0_RxBuf + UA0_RxBuf_offset, RF_PAYLOAD_LEN);
|
||||
UA0_RxBuf_offset += RF_PAYLOAD_LEN;
|
||||
PRINTF("Send packet\n");
|
||||
|
||||
// 切换到接收模式
|
||||
LSD_RF_FreqSet(Lora_Param.ch);
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
|
||||
}
|
||||
else if(UA0_Rx_Timeout)
|
||||
{
|
||||
LSD_RF_FreqSet(sendCh);
|
||||
LSD_RF_SendPacket(UA0_RxBuf + UA0_RxBuf_offset, UA0_RxBuf_Length - UA0_RxBuf_offset);
|
||||
UA0_RxBuf_offset = UA0_RxBuf_Length;
|
||||
PRINTF("Send packet\n");
|
||||
|
||||
// 切换到接收模式
|
||||
LSD_RF_FreqSet(Lora_Param.ch);
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(UA0_Rx_Timeout && UA0_RxBuf_offset == UA0_RxBuf_Length)
|
||||
P2OUT |= BIT3; // Output high
|
||||
}
|
||||
}
|
||||
|
||||
// Port 1 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=PORT1_VECTOR
|
||||
__interrupt void Port_1(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(PORT1_VECTOR))) Port_1 (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
uint8_t offset = 0;
|
||||
uint8_t len[1] = {0};
|
||||
uint8_t buf[RF_PAYLOAD_LEN];
|
||||
if(DIO0_IFG&DIO0_BIT) //数据传输中断处理
|
||||
{
|
||||
// 清中断
|
||||
DIO0_IFG &= ~DIO0_BIT;
|
||||
|
||||
// 读取RF数据
|
||||
LSD_RF_RxVariPacket(buf, len); //接收可变数据包,如果速率为大速率,只能用接收固定数据包长度
|
||||
|
||||
if(len[0] == 0)
|
||||
return;
|
||||
|
||||
TA1CTL = MC__STOP | TACLR; // 停止定时器,复位计数器
|
||||
TA1CTL = TASSEL__ACLK | MC__UP; // 重新开始计时
|
||||
|
||||
offset = 0;
|
||||
if(RF_Rx_Timeout) // 新的一组数据到来
|
||||
{
|
||||
RF_Rx_Timeout = 0;
|
||||
|
||||
// 复位缓冲区
|
||||
RF_RxBuf_Length = 0;
|
||||
RF_RxBuf_offset = 0;
|
||||
|
||||
if(Lora_Param.unicast)
|
||||
{
|
||||
// 定点传输,地址和信道校验失败
|
||||
if(len[0] <= 3 || buf[2] != Lora_Param.ch || ((buf[0] << 8) | buf[1]) != Lora_Param.addr)
|
||||
return;
|
||||
// 前3个字符丢掉
|
||||
offset = 3;
|
||||
len[0] -= offset;
|
||||
}
|
||||
}
|
||||
|
||||
PRINTF("Recv packet\n");
|
||||
|
||||
// 透传模式
|
||||
if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
{
|
||||
if(RF_RxBuf_Length + len[0] <= TRAN_BUF_SIZE)
|
||||
{
|
||||
memmove(RF_RxBuf + RF_RxBuf_Length, buf + offset, len[0]);
|
||||
// 中断方式向串口转发
|
||||
RF_RxBuf_Length += len[0];
|
||||
UCA0IE |= UCTXIE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Timer0 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER0_A0_VECTOR
|
||||
__interrupt void Timer0_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) Timer0_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 停止定时器,复位计数器
|
||||
TA0CTL = MC__STOP | TACLR;
|
||||
// 串口接收超时
|
||||
UA0_Rx_Timeout = 1;
|
||||
}
|
||||
|
||||
// Timer1 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER1_A0_VECTOR
|
||||
__interrupt void Timer1_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) Timer1_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 停止定时器,复位计数器
|
||||
TA1CTL = MC__STOP | TACLR;
|
||||
// RF接收超时
|
||||
RF_Rx_Timeout = 1;
|
||||
}
|
||||
|
||||
// UAR0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=USCI_A0_VECTOR
|
||||
__interrupt void USCI_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 接收中断
|
||||
if((UCA0IE & UCRXIE) && (UCA0IFG & UCRXIFG))
|
||||
{
|
||||
uint8_t c = UCA0RXBUF;
|
||||
|
||||
TA0CTL = MC__STOP | TACLR; // 停止定时器,复位计数器
|
||||
TA0CTL = TASSEL__ACLK | MC__UP; // 重新开始计时
|
||||
|
||||
if(UA0_Rx_Timeout) // 新的一组数据到来
|
||||
{
|
||||
UA0_Rx_Timeout = 0;
|
||||
// 复位缓冲区
|
||||
UA0_RxBuf_Length = 0;
|
||||
UA0_RxBuf_offset = 0;
|
||||
}
|
||||
|
||||
if(UA0_RxBuf_Length < TRAN_BUF_SIZE)
|
||||
{
|
||||
#if 1
|
||||
// 配置模式
|
||||
if((P2IN & (BIT5 | BIT6)) == (BIT5 | BIT6))
|
||||
{
|
||||
// 第1个字符必须为0xC2
|
||||
if(UA0_RxBuf_Length > 0 || c == 0xC2)
|
||||
UA0_RxBuf[UA0_RxBuf_Length++] = c;
|
||||
}
|
||||
// 透传模式
|
||||
else if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
#endif
|
||||
{
|
||||
// 主函数透传
|
||||
UA0_RxBuf[UA0_RxBuf_Length++] = c;
|
||||
}
|
||||
|
||||
P2OUT &= ~BIT3; // Output low
|
||||
}
|
||||
}
|
||||
|
||||
// 发送中断
|
||||
if((UCA0IE & UCTXIE) && (UCA0IFG & UCTXIFG))
|
||||
{
|
||||
UCA0TXBUF = RF_RxBuf[RF_RxBuf_offset++]; // 发送字符
|
||||
if(RF_RxBuf_offset >= RF_RxBuf_Length) // 全部发送完
|
||||
{
|
||||
// 禁止中断
|
||||
UCA0IE &= ~UCTXIE;
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,307 @@
|
|||
#ifndef FR2433_RFSX
|
||||
#define FR2433_RFSX
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 版权: Haybin.Wu@studio
|
||||
// 文件名:
|
||||
// 版本: V1.0
|
||||
// 工作环境: IAR v6.20
|
||||
// 作者: Haybin
|
||||
// 生成日期: 2016.05
|
||||
// 功能: API for FR4133
|
||||
// 修改日志:
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#include <MSP430FR2433.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
//======================================================================================
|
||||
#define CPU_MCLK 8000000
|
||||
#define DelayUs(us) __delay_cycles((CPU_MCLK/1000000UL) * us)
|
||||
#define DelayMs(ms) __delay_cycles((CPU_MCLK/1000UL) * ms)
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//只需修改下列引脚
|
||||
//SX1276 SPI I/O definitions
|
||||
#define SPI_PSEL P1SEL0
|
||||
#define SPI_PDIR P1DIR
|
||||
#define SPI_POUT P1OUT
|
||||
#define SPI_SI_BIT BIT2
|
||||
#define SPI_SO_BIT BIT3
|
||||
#define SPI_CLK_BIT BIT1
|
||||
|
||||
#define SPI_NSS_BIT BIT0
|
||||
#define SPI_NSS_PDIR P1DIR
|
||||
#define SPI_NSS_POUT P1OUT
|
||||
|
||||
//DIO0
|
||||
#define DIO0_BIT BIT6
|
||||
#define DIO0_DIR P1DIR
|
||||
#define DIO0_IFG P1IFG
|
||||
#define DIO0_IES P1IES
|
||||
#define DIO0_IE P1IE
|
||||
|
||||
//DIO1
|
||||
#define DIO1_BIT BIT7
|
||||
#define DIO1_DIR P1DIR
|
||||
#define DIO1_IFG P1IFG
|
||||
#define DIO1_IES P1IES
|
||||
#define DIO1_IE P1IE
|
||||
//DIO3
|
||||
#define DIO3_BIT BIT4
|
||||
#define DIO3_DIR P2DIR
|
||||
#define DIO3_IFG P2IFG
|
||||
#define DIO3_IES P2IES
|
||||
#define DIO3_IE P2IE
|
||||
//RST
|
||||
#define RST_BIT BIT1
|
||||
#define RST_PDIR P3DIR
|
||||
#define RST_POUT P3OUT
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//SX1276 SPI I/O definitions
|
||||
|
||||
//NSS
|
||||
#define SPI_NSS_DIR_OUT SPI_NSS_PDIR |= SPI_NSS_BIT //片选 out
|
||||
#define SPI_NSS_OUT_1 SPI_NSS_POUT |= SPI_NSS_BIT //1
|
||||
#define SPI_NSS_OUT_0 SPI_NSS_POUT &= (~SPI_NSS_BIT) //1
|
||||
|
||||
//DIO0
|
||||
#define DIO0_IFG_H DIO0_IFG |= DIO0_BIT
|
||||
#define DIO0_IFG_L DIO0_IFG &= ~DIO0_BIT
|
||||
#define DIO0_IES_H DIO0_IES |= DIO0_BIT
|
||||
#define DIO0_IES_L DIO0_IES &= ~DIO0_BIT
|
||||
#define DIO0_IE_H DIO0_IE |= DIO0_BIT
|
||||
#define DIO0_IE_L DIO0_IE &= ~DIO0_BIT
|
||||
|
||||
//DIO1
|
||||
#define DIO1_IFG_H DIO1_IFG |= DIO1_BIT
|
||||
#define DIO1_IFG_L DIO1_IFG &= ~DIO1_BIT
|
||||
#define DIO1_IES_H DIO1_IES |= DIO1_BIT
|
||||
#define DIO1_IES_L DIO1_IES &= ~DIO1_BIT
|
||||
#define DIO1_IE_H DIO1_IE |= DIO0_BIT
|
||||
#define DIO1_IE_L DIO1_IE &= ~DIO1_BIT
|
||||
|
||||
//DIO3
|
||||
#define DIO3_IFG_H DIO3_IFG |= DIO3_BIT
|
||||
#define DIO3_IFG_L DIO3_IFG &= ~DIO3_BIT
|
||||
#define DIO3_IES_H DIO3_IES |= DIO3_BIT
|
||||
#define DIO3_IES_L DIO3_IES &= ~DIO3_BIT
|
||||
#define DIO3_IE_H DIO3_IE |= DIO3_BIT
|
||||
#define DIO3_IE_L DIO3_IE &= ~DIO3_BIT
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : SX1276 I/O pins definitions
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Init_IO( void )
|
||||
{
|
||||
//DIO0为P2.0
|
||||
//P2DIR &= ~BIT0;
|
||||
//P2OUT |= BIT0; // Configure DIO0 as pulled-up
|
||||
//P2REN |= BIT0; // DIO0pull-up register enable
|
||||
DIO0_DIR&=~DIO0_BIT;
|
||||
DIO0_IES_L; // DIO0 Hi/Low edge
|
||||
DIO0_IE_L; // DIO0 interrupt enabled
|
||||
DIO0_IFG_L; // DIO0IFG cleared
|
||||
|
||||
//DIO1为P2.1
|
||||
//P2DIR &= ~BIT1;
|
||||
//P2OUT |= BIT1; // Configure DIO1 as pulled-up
|
||||
//P2REN |= BIT1; // DIO1pull-up register enable
|
||||
DIO1_DIR&=~DIO1_BIT;
|
||||
DIO1_IES_L; // DIO1 Hi/Low edge
|
||||
DIO1_IE_L; // DIO1 interrupt enabled
|
||||
DIO1_IFG_L; // DIO1IFG cleared
|
||||
|
||||
//DIO3为P2.3
|
||||
//P2DIR &= ~BIT3;
|
||||
//P2OUT |= BIT3; // Configure DIO3 as pulled-up
|
||||
//P2REN |= BIT3; // DIO3pull-up register enable
|
||||
DIO3_DIR&=~DIO3_BIT;
|
||||
DIO3_IES_L; // DIO3 Hi/Low edge
|
||||
DIO3_IE_L; // DIO3 interrupt enabled
|
||||
DIO3_IFG_L; // DIO3IFG cleared
|
||||
|
||||
|
||||
//SX1276 SPI I/O definitions
|
||||
// Configure SPI
|
||||
//SPI SET
|
||||
SPI_NSS_DIR_OUT;
|
||||
SPI_NSS_OUT_1; // /CS disable
|
||||
|
||||
// SPI option select
|
||||
SPI_PSEL |= SPI_SI_BIT+SPI_SO_BIT+SPI_CLK_BIT;
|
||||
|
||||
UCB0CTLW0 |= UCSWRST; // **Put state machine in reset**
|
||||
UCB0CTLW0 |= UCMST|UCSYNC|UCCKPH|UCMSB; // 3-pin, 8-bit SPI master
|
||||
// Clock polarity high, MSB
|
||||
UCB0CTLW0 |= UCSSEL__SMCLK; // SMCLK
|
||||
UCB0BR0 = 1; // /2,fBitClock = fBRCLK/(UCBRx+1).
|
||||
UCB0BR1 = 0; //
|
||||
UCB0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
|
||||
|
||||
//SX1276 RESET I/O definitions
|
||||
RST_PDIR |= RST_BIT;
|
||||
RST_POUT |= RST_BIT;
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 开启睡眠超时定时器
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void ON_Sleep_Timerout(void)
|
||||
{
|
||||
|
||||
//Timer1_A3 setup
|
||||
TA1R =0; //清除定时器计数器
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768;
|
||||
TA0CTL |= TASSEL_1 | MC_1; //开启超时定时器
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 关闭睡眠超时定时器
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void OFF_Sleep_Timerout(void)
|
||||
{
|
||||
//TA0R =0; //清除定时器计数器
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768;
|
||||
TA0CTL = TASSEL_1 | MC_0; //关闭定时器
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 复位
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Reset(void)
|
||||
{
|
||||
RST_POUT &= ~RST_BIT; //硬件复位IO口输出0
|
||||
DelayMs(6); //延时
|
||||
RST_POUT |= RST_BIT; //输出为1
|
||||
DelayMs(5);
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址连续发送数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
uint8_t i;
|
||||
SPI_PSEL |= SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
SPI_NSS_OUT_0;
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
UCB0IFG &= ~UCRXIFG; // Clear flag
|
||||
UCB0TXBUF = (addr | 0x80); // Send address
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for TX to finish
|
||||
UCB0IFG &= ~UCTXIFG; // Clear flag
|
||||
for( i = 0; i < size; i++ )
|
||||
{
|
||||
UCB0TXBUF = buffer[i]; // Send data
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for TX to finish
|
||||
UCB0IFG &= ~UCTXIFG;
|
||||
}
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
SPI_NSS_OUT_1;
|
||||
SPI_PSEL &= ~SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址连续读数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *buffer,存储数组指针 uint8_t size要读的长度
|
||||
// 返回参数 : 数据返回到*buffer中
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
uint8_t i;
|
||||
SPI_PSEL |= SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
SPI_NSS_OUT_0;
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
UCB0IFG &= ~UCRXIFG; // Clear flag
|
||||
UCB0TXBUF = (addr & 0x7F); // Send address
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for end of addr byte TX
|
||||
UCB0IFG &= ~UCTXIFG; // Clear flag
|
||||
for( i = 0; i < size; i++ )
|
||||
{
|
||||
UCB0TXBUF = 0; //Initiate next data RX
|
||||
while (!(UCB0IFG&UCRXIFG)); // Wait for RX to finish
|
||||
buffer[i] = UCB0RXBUF; // Store data from last data RX
|
||||
//读取UCB0RXBUF后,IFG自动Reset
|
||||
}
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
SPI_NSS_OUT_1;
|
||||
SPI_PSEL &= ~SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
UCB0IFG=0;
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址写1字节数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t data数据
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Write( uint8_t addr, uint8_t data )
|
||||
{
|
||||
SX1276WriteBuffer( addr, &data, 1 );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址读1字节数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *data读数据存储地址
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Read( uint8_t addr, uint8_t *data )
|
||||
{
|
||||
SX1276ReadBuffer( addr, data, 1 );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向FIFO写数据
|
||||
// 输入参数 : uint8_t *buffer,数组指针 uint8_t size长度
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
SX1276WriteBuffer( 0, buffer, size );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向FIFO读数据
|
||||
// 输入参数 : uint8_t *buffer,数组指针 uint8_t size长度
|
||||
// 返回参数 : uint8_t *buffer 存储读取内容
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
SX1276ReadBuffer( 0, buffer, size );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF TX/RX的PA切换
|
||||
// 输入参数 : bool txEnable 切换逻辑
|
||||
// 返回参数 : 无
|
||||
// 说明 :真:作为TX。假:作为RX 为硬件两个PA控制IO口
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteRxTx( bool txEnable )
|
||||
{
|
||||
if( txEnable != 0 ) //如果为真,为TX
|
||||
{
|
||||
;
|
||||
}
|
||||
else //为假,为RX
|
||||
{
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
//*****************************************************************************************
|
||||
#endif
|
||||
|
|
@ -0,0 +1,491 @@
|
|||
// Haybin_Wu
|
||||
// Shenitech-RD
|
||||
// 2016.5
|
||||
// Built with IAR Embedded Workbench v6.2
|
||||
//******************************************************************************
|
||||
// Modify by Qian Xianghong
|
||||
// 2020.10
|
||||
// 修改日志:将无线模块做成串口和RF双向透传模式。
|
||||
//******************************************************************************
|
||||
#include <msp430FR2433.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "FR2433-RFSX.h"
|
||||
#include "RF_SX1276.h"
|
||||
|
||||
// 射频配置参数
|
||||
lora_param_t Lora_Param;
|
||||
|
||||
#define TRAN_BUF_SIZE (1024)
|
||||
|
||||
// 用UA1串口做打印输出,方便调试
|
||||
char printBuf[200];
|
||||
void uart_print()
|
||||
{
|
||||
#if 0 // 打印串口的2个引脚用作MD0、MD1模式选择
|
||||
char *p = printBuf;
|
||||
while(*p)
|
||||
{
|
||||
if(*p == '\n') // 换行前添加回车
|
||||
{
|
||||
while(!(UCA1IFG & UCTXIFG));
|
||||
UCA1TXBUF = '\r';
|
||||
}
|
||||
while(!(UCA1IFG & UCTXIFG));
|
||||
UCA1TXBUF = *p++;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// 可变参数的宏定义
|
||||
#define PRINTF(format, ...) \
|
||||
{ \
|
||||
snprintf(printBuf, sizeof(printBuf), format, ##__VA_ARGS__); \
|
||||
uart_print(); \
|
||||
}
|
||||
|
||||
// UA0接收上位机数据的buf
|
||||
uint8_t UA0_RxBuf[TRAN_BUF_SIZE] = {0};
|
||||
uint16_t UA0_RxBuf_Length = 0;
|
||||
uint16_t UA0_RxBuf_offset = 0;
|
||||
// UA0接收超时
|
||||
volatile uint8_t UA0_Rx_Timeout = 1;
|
||||
|
||||
// RF接收数据的buf
|
||||
uint8_t RF_RxBuf[TRAN_BUF_SIZE] = {0};
|
||||
uint16_t RF_RxBuf_Length = 0;
|
||||
uint16_t RF_RxBuf_offset = 0;
|
||||
// RF接收超时标志
|
||||
volatile uint8_t RF_Rx_Timeout = 1;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 主串口初始化
|
||||
void UA0_Init(uint32_t baudrate)
|
||||
{
|
||||
// Configure UART
|
||||
UCA0CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
if(baudrate == 115200)
|
||||
{
|
||||
UCA0BR0 = 4; // 8000000/16/115200//这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.44444
|
||||
UCA0MCTLW = 0x5500 | UCOS16 | UCBRF_5;//微调Baud Rate
|
||||
}
|
||||
else if(baudrate == 38400)
|
||||
{
|
||||
UCA0BR0 = 13; // 8000000/16/38400 /这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.33333
|
||||
UCA0MCTLW = 0x8400 | UCOS16 | UCBRF_0;//微调Baud Rate
|
||||
}
|
||||
else
|
||||
{
|
||||
UCA0BR0 = 52; // 8000000/16/9600 /这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.33333
|
||||
UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;//微调Baud Rate
|
||||
}
|
||||
UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
}
|
||||
|
||||
// 主串口应答(配置命令)
|
||||
void UA0_Response(char *s)
|
||||
{
|
||||
while(*s)
|
||||
{
|
||||
while(!(UCA0IFG & UCTXIFG));
|
||||
UCA0TXBUF = *s++;
|
||||
}
|
||||
// 等待发送结束
|
||||
while(!(UCA0IFG & UCTXCPTIFG));
|
||||
DelayMs(2);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//主函数
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
int main(void)
|
||||
{
|
||||
uint8_t sendCh;
|
||||
|
||||
WDTCTL = (WDTPW | WDTHOLD); // Stop WDT
|
||||
// Port Configuration all un-used pins to output low
|
||||
P1DIR = 0xFF; P2DIR = 0xFF; P3DIR = 0xFF;
|
||||
P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00;
|
||||
PM5CTL0 &= ~LOCKLPM5;//开引脚功能
|
||||
|
||||
// Configure DCO Clock
|
||||
//外部时钟源启动
|
||||
P2SEL0 |= (BIT0 | BIT1); // set XT1 pin as second function
|
||||
do
|
||||
{
|
||||
CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag
|
||||
SFRIFG1 &= ~OFIFG;
|
||||
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
|
||||
//上面清除标志有助于降低功耗
|
||||
|
||||
__bis_SR_register(SCG0); // disable FLL
|
||||
CSCTL3 |= SELREF__XT1CLK; // 外部 32768hz reference source
|
||||
CSCTL0 = 0; // clear DCO and MOD registers
|
||||
CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
|
||||
CSCTL1 |= DCORSEL_3; //DCO=8Mhz
|
||||
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
|
||||
__delay_cycles(3);
|
||||
__bic_SR_register(SCG0); // enable FLL
|
||||
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
|
||||
|
||||
CSCTL4 = SELREF__XT1CLK + SELMS__DCOCLKDIV;// set XT1CLK(32768Hz) as ACLK source & MCLK/SMCLK=DCO
|
||||
|
||||
//Timer0_A0 setup
|
||||
TA0CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA0CCR0 = 32768 / 32; // 串口接收超时: 1000/32=31.25ms
|
||||
TA0CTL = MC__STOP | TACLR; // Stop mode, Clear counter
|
||||
|
||||
//Timer1_A0 setup
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768 / 4; // RF接收超时: 1000/4=250ms
|
||||
TA1CTL = MC__STOP | TACLR; // Stop mode, Clear counter
|
||||
|
||||
// 设置无线模块缺省参数
|
||||
Lora_Param.sof = 0xC2;
|
||||
Lora_Param.addr = 0xADF2; // 通信地址0xADF2
|
||||
Lora_Param.sf = 6; // sf=12
|
||||
Lora_Param.baud = 3; // 9600
|
||||
Lora_Param.cr = 0; // cr=4/5
|
||||
Lora_Param.ch = 9; // 479MHz
|
||||
Lora_Param.power = 1; // 17dBm
|
||||
Lora_Param.freqcast = 0; // freqcast off
|
||||
Lora_Param.bw = 9; // 500kHz
|
||||
Lora_Param.unicast = 0; // unicast off
|
||||
|
||||
// Configure UART pins
|
||||
P1SEL1 &= ~(BIT4 | BIT5); // set 2-UART pin as second function
|
||||
P1SEL0 |= (BIT4 | BIT5); // set 2-UART pin as second function
|
||||
if(Lora_Param.baud == 7)
|
||||
UA0_Init(115200);
|
||||
else if(Lora_Param.baud == 5)
|
||||
UA0_Init(38400);
|
||||
else
|
||||
UA0_Init(9600);
|
||||
|
||||
#if 0 // 配置打印串口
|
||||
// Configure UART pins
|
||||
P2SEL1 &= ~(BIT5 | BIT6); // set 2-UART pin as second function
|
||||
P2SEL0 |= (BIT5 | BIT6); // set 2-UART pin as second function
|
||||
// Configure UART
|
||||
UCA1CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
UCA1BR0 = 4; // 8000000/16/115200//这位大于16 UCOS16位要置位
|
||||
UCA1BR1 = 0; // Fractional portion = 0.44444
|
||||
UCA1MCTLW = 0x5500 | UCOS16 | UCBRF_5;//微调Baud Rate
|
||||
UCA1CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
|
||||
// 打印复位原因(电源引起,不包括看门狗)
|
||||
PRINTF("\nModule reseted: %04X\n", PMMIFG);
|
||||
|
||||
#else // 配置MD0、MD1模式
|
||||
P2SEL1 &= ~(BIT3 | BIT5 | BIT6); // set 2-UART pin as GPIO
|
||||
P2SEL0 &= ~(BIT3 | BIT5 | BIT6); // set 2-UART pin as GPIO
|
||||
P2DIR &= ~(BIT5 | BIT6); // Input
|
||||
P2REN |= (BIT5 | BIT6); // enable pull
|
||||
P2OUT &= ~(BIT5 | BIT6); // pull-down
|
||||
|
||||
P2DIR |= BIT3; // Output
|
||||
P2OUT |= BIT3; // Output high
|
||||
#endif
|
||||
|
||||
_EINT();
|
||||
|
||||
#if 0
|
||||
// 打印复位原因(电源引起,不包括看门狗)
|
||||
RF_RxBuf[0] = PMMIFG >> 8;
|
||||
RF_RxBuf[1] = PMMIFG & 0xFF;
|
||||
RF_RxBuf_Length = 2;
|
||||
RF_RxBuf_offset = 0;
|
||||
UCA0IE |= UCTXIE;
|
||||
while(UCA0IE & UCTXIE);
|
||||
#endif
|
||||
// 读寄存器,清除复位原因
|
||||
SYSRSTIV;
|
||||
|
||||
//无线模块初始化
|
||||
uint8_t try_count = 3; //最多初始化3次
|
||||
while(try_count)
|
||||
{
|
||||
if(SX127x_initLora(&Lora_Param) == NORMAL)
|
||||
break;
|
||||
try_count--;
|
||||
}
|
||||
if(try_count == 0) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
|
||||
// 初始处于接收模式
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
// 默认发送信道
|
||||
sendCh = Lora_Param.ch;
|
||||
|
||||
// 开启看门狗: 超时时间为2^27/SMCLK,在8000000主频下约为16s
|
||||
WDTCTL = (WDTPW | WDTCNTCL | WDTIS_1);
|
||||
|
||||
while(1)
|
||||
{
|
||||
#if 1
|
||||
// TODO: 喂狗
|
||||
WDTCTL = (WDTPW | WDTCNTCL | WDTIS_1);
|
||||
|
||||
// 配置模式
|
||||
if((P2IN & (BIT5 | BIT6)) == (BIT5 | BIT6))
|
||||
{
|
||||
if(UA0_RxBuf_Length - UA0_RxBuf_offset >= sizeof(Lora_Param))
|
||||
{
|
||||
if(UA0_RxBuf[UA0_RxBuf_offset] == 0xC2)
|
||||
{
|
||||
// 保存参数
|
||||
memmove(&Lora_Param, UA0_RxBuf + UA0_RxBuf_offset, sizeof(Lora_Param));
|
||||
// 颠倒地址高低字节
|
||||
Lora_Param.addr = (Lora_Param.addr << 8) | (Lora_Param.addr >> 8);
|
||||
|
||||
//无线模块初始化
|
||||
uint8_t try_count = 3; //最多初始化3次
|
||||
while(try_count)
|
||||
{
|
||||
// 其它参数有变化,无线模块初始化
|
||||
if(SX127x_initLora(&Lora_Param) == NORMAL)
|
||||
break;
|
||||
try_count--;
|
||||
}
|
||||
if(try_count == 0) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
|
||||
// 默认处于接收模式
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
// 默认发送信道
|
||||
sendCh = Lora_Param.ch;
|
||||
// 应答配置命令
|
||||
UA0_Response("OK\r\n");
|
||||
|
||||
// 改变串口波特率
|
||||
if(Lora_Param.baud == 7)
|
||||
UA0_Init(115200);
|
||||
else if(Lora_Param.baud == 5)
|
||||
UA0_Init(38400);
|
||||
else
|
||||
UA0_Init(9600);
|
||||
}
|
||||
|
||||
UA0_RxBuf_offset = UA0_RxBuf_Length;
|
||||
}
|
||||
}
|
||||
// 透传模式
|
||||
else if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
#endif
|
||||
{
|
||||
if(UA0_RxBuf_Length > UA0_RxBuf_offset)
|
||||
{
|
||||
// 定点传输,指定目标地址和信道发送
|
||||
if(Lora_Param.unicast) // 定点发送
|
||||
{
|
||||
if(UA0_RxBuf_offset == 0 && UA0_RxBuf_Length > 3)
|
||||
sendCh = UA0_RxBuf[2];
|
||||
}
|
||||
else if(Lora_Param.freqcast) // 指定信道发送
|
||||
{
|
||||
if(UA0_RxBuf_offset == 0 && UA0_RxBuf_Length > 1)
|
||||
{
|
||||
sendCh = UA0_RxBuf[0];
|
||||
UA0_RxBuf_offset = 1; // 不发送第1发个字节
|
||||
}
|
||||
}
|
||||
|
||||
if(UA0_RxBuf_Length - UA0_RxBuf_offset >= RF_PAYLOAD_LEN)
|
||||
{
|
||||
LSD_RF_FreqSet(sendCh);
|
||||
LSD_RF_SendPacket(UA0_RxBuf + UA0_RxBuf_offset, RF_PAYLOAD_LEN);
|
||||
UA0_RxBuf_offset += RF_PAYLOAD_LEN;
|
||||
PRINTF("Send packet\n");
|
||||
|
||||
// 切换到接收模式
|
||||
LSD_RF_FreqSet(Lora_Param.ch);
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
|
||||
}
|
||||
else if(UA0_Rx_Timeout)
|
||||
{
|
||||
LSD_RF_FreqSet(sendCh);
|
||||
LSD_RF_SendPacket(UA0_RxBuf + UA0_RxBuf_offset, UA0_RxBuf_Length - UA0_RxBuf_offset);
|
||||
UA0_RxBuf_offset = UA0_RxBuf_Length;
|
||||
PRINTF("Send packet\n");
|
||||
|
||||
// 切换到接收模式
|
||||
LSD_RF_FreqSet(Lora_Param.ch);
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(UA0_Rx_Timeout && UA0_RxBuf_offset == UA0_RxBuf_Length)
|
||||
P2OUT |= BIT3; // Output high
|
||||
}
|
||||
}
|
||||
|
||||
// Port 1 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=PORT1_VECTOR
|
||||
__interrupt void Port_1(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(PORT1_VECTOR))) Port_1 (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
uint8_t offset = 0;
|
||||
uint8_t len[1] = {0};
|
||||
uint8_t buf[RF_PAYLOAD_LEN];
|
||||
if(DIO0_IFG&DIO0_BIT) //数据传输中断处理
|
||||
{
|
||||
// 清中断
|
||||
DIO0_IFG &= ~DIO0_BIT;
|
||||
|
||||
// 读取RF数据
|
||||
LSD_RF_RxVariPacket(buf, len); //接收可变数据包,如果速率为大速率,只能用接收固定数据包长度
|
||||
|
||||
if(len[0] == 0)
|
||||
return;
|
||||
|
||||
TA1CTL = MC__STOP | TACLR; // 停止定时器,复位计数器
|
||||
TA1CTL = TASSEL__ACLK | MC__UP; // 重新开始计时
|
||||
|
||||
offset = 0;
|
||||
if(RF_Rx_Timeout) // 新的一组数据到来
|
||||
{
|
||||
RF_Rx_Timeout = 0;
|
||||
|
||||
// 复位缓冲区
|
||||
RF_RxBuf_Length = 0;
|
||||
RF_RxBuf_offset = 0;
|
||||
|
||||
if(Lora_Param.unicast)
|
||||
{
|
||||
// 定点传输,地址和信道校验失败
|
||||
if(len[0] <= 3 || buf[2] != Lora_Param.ch || ((buf[0] << 8) | buf[1]) != Lora_Param.addr)
|
||||
return;
|
||||
// 前3个字符丢掉
|
||||
offset = 3;
|
||||
len[0] -= offset;
|
||||
}
|
||||
}
|
||||
|
||||
PRINTF("Recv packet\n");
|
||||
|
||||
// 透传模式
|
||||
if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
{
|
||||
if(RF_RxBuf_Length + len[0] <= TRAN_BUF_SIZE)
|
||||
{
|
||||
memmove(RF_RxBuf + RF_RxBuf_Length, buf + offset, len[0]);
|
||||
// 中断方式向串口转发
|
||||
RF_RxBuf_Length += len[0];
|
||||
UCA0IE |= UCTXIE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Timer0 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER0_A0_VECTOR
|
||||
__interrupt void Timer0_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) Timer0_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 停止定时器,复位计数器
|
||||
TA0CTL = MC__STOP | TACLR;
|
||||
// 串口接收超时
|
||||
UA0_Rx_Timeout = 1;
|
||||
}
|
||||
|
||||
// Timer1 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER1_A0_VECTOR
|
||||
__interrupt void Timer1_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) Timer1_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 停止定时器,复位计数器
|
||||
TA1CTL = MC__STOP | TACLR;
|
||||
// RF接收超时
|
||||
RF_Rx_Timeout = 1;
|
||||
}
|
||||
|
||||
// UAR0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=USCI_A0_VECTOR
|
||||
__interrupt void USCI_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 接收中断
|
||||
if((UCA0IE & UCRXIE) && (UCA0IFG & UCRXIFG))
|
||||
{
|
||||
uint8_t c = UCA0RXBUF;
|
||||
|
||||
TA0CTL = MC__STOP | TACLR; // 停止定时器,复位计数器
|
||||
TA0CTL = TASSEL__ACLK | MC__UP; // 重新开始计时
|
||||
|
||||
if(UA0_Rx_Timeout) // 新的一组数据到来
|
||||
{
|
||||
UA0_Rx_Timeout = 0;
|
||||
// 复位缓冲区
|
||||
UA0_RxBuf_Length = 0;
|
||||
UA0_RxBuf_offset = 0;
|
||||
}
|
||||
|
||||
if(UA0_RxBuf_Length < TRAN_BUF_SIZE)
|
||||
{
|
||||
#if 1
|
||||
// 配置模式
|
||||
if((P2IN & (BIT5 | BIT6)) == (BIT5 | BIT6))
|
||||
{
|
||||
// 第1个字符必须为0xC2
|
||||
if(UA0_RxBuf_Length > 0 || c == 0xC2)
|
||||
UA0_RxBuf[UA0_RxBuf_Length++] = c;
|
||||
}
|
||||
// 透传模式
|
||||
else if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
#endif
|
||||
{
|
||||
// 主函数透传
|
||||
UA0_RxBuf[UA0_RxBuf_Length++] = c;
|
||||
}
|
||||
|
||||
P2OUT &= ~BIT3; // Output low
|
||||
}
|
||||
}
|
||||
|
||||
// 发送中断
|
||||
if((UCA0IE & UCTXIE) && (UCA0IFG & UCTXIFG))
|
||||
{
|
||||
UCA0TXBUF = RF_RxBuf[RF_RxBuf_offset++]; // 发送字符
|
||||
if(RF_RxBuf_offset >= RF_RxBuf_Length) // 全部发送完
|
||||
{
|
||||
// 禁止中断
|
||||
UCA0IE &= ~UCTXIE;
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,307 @@
|
|||
#ifndef FR2433_RFSX
|
||||
#define FR2433_RFSX
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 版权: Haybin.Wu@studio
|
||||
// 文件名:
|
||||
// 版本: V1.0
|
||||
// 工作环境: IAR v6.20
|
||||
// 作者: Haybin
|
||||
// 生成日期: 2016.05
|
||||
// 功能: API for FR4133
|
||||
// 修改日志:
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#include <MSP430FR2433.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
//======================================================================================
|
||||
#define CPU_MCLK 8000000
|
||||
#define DelayUs(us) __delay_cycles((CPU_MCLK/1000000UL) * us)
|
||||
#define DelayMs(ms) __delay_cycles((CPU_MCLK/1000UL) * ms)
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//只需修改下列引脚
|
||||
//SX1276 SPI I/O definitions
|
||||
#define SPI_PSEL P1SEL0
|
||||
#define SPI_PDIR P1DIR
|
||||
#define SPI_POUT P1OUT
|
||||
#define SPI_SI_BIT BIT2
|
||||
#define SPI_SO_BIT BIT3
|
||||
#define SPI_CLK_BIT BIT1
|
||||
|
||||
#define SPI_NSS_BIT BIT0
|
||||
#define SPI_NSS_PDIR P1DIR
|
||||
#define SPI_NSS_POUT P1OUT
|
||||
|
||||
//DIO0
|
||||
#define DIO0_BIT BIT6
|
||||
#define DIO0_DIR P1DIR
|
||||
#define DIO0_IFG P1IFG
|
||||
#define DIO0_IES P1IES
|
||||
#define DIO0_IE P1IE
|
||||
|
||||
//DIO1
|
||||
#define DIO1_BIT BIT7
|
||||
#define DIO1_DIR P1DIR
|
||||
#define DIO1_IFG P1IFG
|
||||
#define DIO1_IES P1IES
|
||||
#define DIO1_IE P1IE
|
||||
//DIO3
|
||||
#define DIO3_BIT BIT4
|
||||
#define DIO3_DIR P2DIR
|
||||
#define DIO3_IFG P2IFG
|
||||
#define DIO3_IES P2IES
|
||||
#define DIO3_IE P2IE
|
||||
//RST
|
||||
#define RST_BIT BIT1
|
||||
#define RST_PDIR P3DIR
|
||||
#define RST_POUT P3OUT
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//SX1276 SPI I/O definitions
|
||||
|
||||
//NSS
|
||||
#define SPI_NSS_DIR_OUT SPI_NSS_PDIR |= SPI_NSS_BIT //片选 out
|
||||
#define SPI_NSS_OUT_1 SPI_NSS_POUT |= SPI_NSS_BIT //1
|
||||
#define SPI_NSS_OUT_0 SPI_NSS_POUT &= (~SPI_NSS_BIT) //1
|
||||
|
||||
//DIO0
|
||||
#define DIO0_IFG_H DIO0_IFG |= DIO0_BIT
|
||||
#define DIO0_IFG_L DIO0_IFG &= ~DIO0_BIT
|
||||
#define DIO0_IES_H DIO0_IES |= DIO0_BIT
|
||||
#define DIO0_IES_L DIO0_IES &= ~DIO0_BIT
|
||||
#define DIO0_IE_H DIO0_IE |= DIO0_BIT
|
||||
#define DIO0_IE_L DIO0_IE &= ~DIO0_BIT
|
||||
|
||||
//DIO1
|
||||
#define DIO1_IFG_H DIO1_IFG |= DIO1_BIT
|
||||
#define DIO1_IFG_L DIO1_IFG &= ~DIO1_BIT
|
||||
#define DIO1_IES_H DIO1_IES |= DIO1_BIT
|
||||
#define DIO1_IES_L DIO1_IES &= ~DIO1_BIT
|
||||
#define DIO1_IE_H DIO1_IE |= DIO0_BIT
|
||||
#define DIO1_IE_L DIO1_IE &= ~DIO1_BIT
|
||||
|
||||
//DIO3
|
||||
#define DIO3_IFG_H DIO3_IFG |= DIO3_BIT
|
||||
#define DIO3_IFG_L DIO3_IFG &= ~DIO3_BIT
|
||||
#define DIO3_IES_H DIO3_IES |= DIO3_BIT
|
||||
#define DIO3_IES_L DIO3_IES &= ~DIO3_BIT
|
||||
#define DIO3_IE_H DIO3_IE |= DIO3_BIT
|
||||
#define DIO3_IE_L DIO3_IE &= ~DIO3_BIT
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : SX1276 I/O pins definitions
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Init_IO( void )
|
||||
{
|
||||
//DIO0为P2.0
|
||||
//P2DIR &= ~BIT0;
|
||||
//P2OUT |= BIT0; // Configure DIO0 as pulled-up
|
||||
//P2REN |= BIT0; // DIO0pull-up register enable
|
||||
DIO0_DIR&=~DIO0_BIT;
|
||||
DIO0_IES_L; // DIO0 Hi/Low edge
|
||||
DIO0_IE_L; // DIO0 interrupt enabled
|
||||
DIO0_IFG_L; // DIO0IFG cleared
|
||||
|
||||
//DIO1为P2.1
|
||||
//P2DIR &= ~BIT1;
|
||||
//P2OUT |= BIT1; // Configure DIO1 as pulled-up
|
||||
//P2REN |= BIT1; // DIO1pull-up register enable
|
||||
DIO1_DIR&=~DIO1_BIT;
|
||||
DIO1_IES_L; // DIO1 Hi/Low edge
|
||||
DIO1_IE_L; // DIO1 interrupt enabled
|
||||
DIO1_IFG_L; // DIO1IFG cleared
|
||||
|
||||
//DIO3为P2.3
|
||||
//P2DIR &= ~BIT3;
|
||||
//P2OUT |= BIT3; // Configure DIO3 as pulled-up
|
||||
//P2REN |= BIT3; // DIO3pull-up register enable
|
||||
DIO3_DIR&=~DIO3_BIT;
|
||||
DIO3_IES_L; // DIO3 Hi/Low edge
|
||||
DIO3_IE_L; // DIO3 interrupt enabled
|
||||
DIO3_IFG_L; // DIO3IFG cleared
|
||||
|
||||
|
||||
//SX1276 SPI I/O definitions
|
||||
// Configure SPI
|
||||
//SPI SET
|
||||
SPI_NSS_DIR_OUT;
|
||||
SPI_NSS_OUT_1; // /CS disable
|
||||
|
||||
// SPI option select
|
||||
SPI_PSEL |= SPI_SI_BIT+SPI_SO_BIT+SPI_CLK_BIT;
|
||||
|
||||
UCB0CTLW0 |= UCSWRST; // **Put state machine in reset**
|
||||
UCB0CTLW0 |= UCMST|UCSYNC|UCCKPH|UCMSB; // 3-pin, 8-bit SPI master
|
||||
// Clock polarity high, MSB
|
||||
UCB0CTLW0 |= UCSSEL__SMCLK; // SMCLK
|
||||
UCB0BR0 = 1; // /2,fBitClock = fBRCLK/(UCBRx+1).
|
||||
UCB0BR1 = 0; //
|
||||
UCB0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
|
||||
|
||||
//SX1276 RESET I/O definitions
|
||||
RST_PDIR |= RST_BIT;
|
||||
RST_POUT |= RST_BIT;
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 开启睡眠超时定时器
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void ON_Sleep_Timerout(void)
|
||||
{
|
||||
|
||||
//Timer1_A3 setup
|
||||
TA1R =0; //清除定时器计数器
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768;
|
||||
TA0CTL |= TASSEL_1 | MC_1; //开启超时定时器
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 关闭睡眠超时定时器
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void OFF_Sleep_Timerout(void)
|
||||
{
|
||||
//TA0R =0; //清除定时器计数器
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768;
|
||||
TA0CTL = TASSEL_1 | MC_0; //关闭定时器
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 复位
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Reset(void)
|
||||
{
|
||||
RST_POUT &= ~RST_BIT; //硬件复位IO口输出0
|
||||
DelayMs(6); //延时
|
||||
RST_POUT |= RST_BIT; //输出为1
|
||||
DelayMs(5);
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址连续发送数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *buffer,发送数组指针 uint8_t size指针长度
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
uint8_t i;
|
||||
SPI_PSEL |= SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
SPI_NSS_OUT_0;
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
UCB0IFG &= ~UCRXIFG; // Clear flag
|
||||
UCB0TXBUF = (addr | 0x80); // Send address
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for TX to finish
|
||||
UCB0IFG &= ~UCTXIFG; // Clear flag
|
||||
for( i = 0; i < size; i++ )
|
||||
{
|
||||
UCB0TXBUF = buffer[i]; // Send data
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for TX to finish
|
||||
UCB0IFG &= ~UCTXIFG;
|
||||
}
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
SPI_NSS_OUT_1;
|
||||
SPI_PSEL &= ~SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址连续读数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *buffer,存储数组指针 uint8_t size要读的长度
|
||||
// 返回参数 : 数据返回到*buffer中
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
uint8_t i;
|
||||
SPI_PSEL |= SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
SPI_NSS_OUT_0;
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
UCB0IFG &= ~UCRXIFG; // Clear flag
|
||||
UCB0TXBUF = (addr & 0x7F); // Send address
|
||||
while (!(UCB0IFG&UCTXIFG)); // Wait for end of addr byte TX
|
||||
UCB0IFG &= ~UCTXIFG; // Clear flag
|
||||
for( i = 0; i < size; i++ )
|
||||
{
|
||||
UCB0TXBUF = 0; //Initiate next data RX
|
||||
while (!(UCB0IFG&UCRXIFG)); // Wait for RX to finish
|
||||
buffer[i] = UCB0RXBUF; // Store data from last data RX
|
||||
//读取UCB0RXBUF后,IFG自动Reset
|
||||
}
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
// _NOP();_NOP();_NOP();_NOP();
|
||||
SPI_NSS_OUT_1;
|
||||
SPI_PSEL &= ~SPI_SO_BIT;//SPI的bug引起的功耗异常
|
||||
UCB0IFG=0;
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址写1字节数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t data数据
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Write( uint8_t addr, uint8_t data )
|
||||
{
|
||||
SX1276WriteBuffer( addr, &data, 1 );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向寄存器地址读1字节数据
|
||||
// 输入参数 : uint8_t addr,寄存器地址 uint8_t *data读数据存储地址
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276Read( uint8_t addr, uint8_t *data )
|
||||
{
|
||||
SX1276ReadBuffer( addr, data, 1 );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向FIFO写数据
|
||||
// 输入参数 : uint8_t *buffer,数组指针 uint8_t size长度
|
||||
// 返回参数 :
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
SX1276WriteBuffer( 0, buffer, size );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF 向FIFO读数据
|
||||
// 输入参数 : uint8_t *buffer,数组指针 uint8_t size长度
|
||||
// 返回参数 : uint8_t *buffer 存储读取内容
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
|
||||
{
|
||||
SX1276ReadBuffer( 0, buffer, size );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF TX/RX的PA切换
|
||||
// 输入参数 : bool txEnable 切换逻辑
|
||||
// 返回参数 : 无
|
||||
// 说明 :真:作为TX。假:作为RX 为硬件两个PA控制IO口
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276WriteRxTx( bool txEnable )
|
||||
{
|
||||
if( txEnable != 0 ) //如果为真,为TX
|
||||
{
|
||||
;
|
||||
}
|
||||
else //为假,为RX
|
||||
{
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
//*****************************************************************************************
|
||||
#endif
|
||||
|
|
@ -0,0 +1,491 @@
|
|||
// Haybin_Wu
|
||||
// Shenitech-RD
|
||||
// 2016.5
|
||||
// Built with IAR Embedded Workbench v6.2
|
||||
//******************************************************************************
|
||||
// Modify by Qian Xianghong
|
||||
// 2020.10
|
||||
// 修改日志:将无线模块做成串口和RF双向透传模式。
|
||||
//******************************************************************************
|
||||
#include <msp430FR2433.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "FR2433-RFSX.h"
|
||||
#include "RF_SX1276.h"
|
||||
|
||||
// 射频配置参数
|
||||
lora_param_t Lora_Param;
|
||||
|
||||
#define TRAN_BUF_SIZE (1024)
|
||||
|
||||
// 用UA1串口做打印输出,方便调试
|
||||
char printBuf[200];
|
||||
void uart_print()
|
||||
{
|
||||
#if 0 // 打印串口的2个引脚用作MD0、MD1模式选择
|
||||
char *p = printBuf;
|
||||
while(*p)
|
||||
{
|
||||
if(*p == '\n') // 换行前添加回车
|
||||
{
|
||||
while(!(UCA1IFG & UCTXIFG));
|
||||
UCA1TXBUF = '\r';
|
||||
}
|
||||
while(!(UCA1IFG & UCTXIFG));
|
||||
UCA1TXBUF = *p++;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// 可变参数的宏定义
|
||||
#define PRINTF(format, ...) \
|
||||
{ \
|
||||
snprintf(printBuf, sizeof(printBuf), format, ##__VA_ARGS__); \
|
||||
uart_print(); \
|
||||
}
|
||||
|
||||
// UA0接收上位机数据的buf
|
||||
uint8_t UA0_RxBuf[TRAN_BUF_SIZE] = {0};
|
||||
uint16_t UA0_RxBuf_Length = 0;
|
||||
uint16_t UA0_RxBuf_offset = 0;
|
||||
// UA0接收超时
|
||||
volatile uint8_t UA0_Rx_Timeout = 1;
|
||||
|
||||
// RF接收数据的buf
|
||||
uint8_t RF_RxBuf[TRAN_BUF_SIZE] = {0};
|
||||
uint16_t RF_RxBuf_Length = 0;
|
||||
uint16_t RF_RxBuf_offset = 0;
|
||||
// RF接收超时标志
|
||||
volatile uint8_t RF_Rx_Timeout = 1;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 主串口初始化
|
||||
void UA0_Init(uint32_t baudrate)
|
||||
{
|
||||
// Configure UART
|
||||
UCA0CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
if(baudrate == 115200)
|
||||
{
|
||||
UCA0BR0 = 4; // 8000000/16/115200//这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.44444
|
||||
UCA0MCTLW = 0x5500 | UCOS16 | UCBRF_5;//微调Baud Rate
|
||||
}
|
||||
else if(baudrate == 38400)
|
||||
{
|
||||
UCA0BR0 = 13; // 8000000/16/38400 /这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.33333
|
||||
UCA0MCTLW = 0x8400 | UCOS16 | UCBRF_0;//微调Baud Rate
|
||||
}
|
||||
else
|
||||
{
|
||||
UCA0BR0 = 52; // 8000000/16/9600 /这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0; // Fractional portion = 0.33333
|
||||
UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;//微调Baud Rate
|
||||
}
|
||||
UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
}
|
||||
|
||||
// 主串口应答(配置命令)
|
||||
void UA0_Response(char *s)
|
||||
{
|
||||
while(*s)
|
||||
{
|
||||
while(!(UCA0IFG & UCTXIFG));
|
||||
UCA0TXBUF = *s++;
|
||||
}
|
||||
// 等待发送结束
|
||||
while(!(UCA0IFG & UCTXCPTIFG));
|
||||
DelayMs(2);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//主函数
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
int main(void)
|
||||
{
|
||||
uint8_t sendCh;
|
||||
|
||||
WDTCTL = (WDTPW | WDTHOLD); // Stop WDT
|
||||
// Port Configuration all un-used pins to output low
|
||||
P1DIR = 0xFF; P2DIR = 0xFF; P3DIR = 0xFF;
|
||||
P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00;
|
||||
PM5CTL0 &= ~LOCKLPM5;//开引脚功能
|
||||
|
||||
// Configure DCO Clock
|
||||
//外部时钟源启动
|
||||
P2SEL0 |= (BIT0 | BIT1); // set XT1 pin as second function
|
||||
do
|
||||
{
|
||||
CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag
|
||||
SFRIFG1 &= ~OFIFG;
|
||||
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
|
||||
//上面清除标志有助于降低功耗
|
||||
|
||||
__bis_SR_register(SCG0); // disable FLL
|
||||
CSCTL3 |= SELREF__XT1CLK; // 外部 32768hz reference source
|
||||
CSCTL0 = 0; // clear DCO and MOD registers
|
||||
CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
|
||||
CSCTL1 |= DCORSEL_3; //DCO=8Mhz
|
||||
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
|
||||
__delay_cycles(3);
|
||||
__bic_SR_register(SCG0); // enable FLL
|
||||
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
|
||||
|
||||
CSCTL4 = SELREF__XT1CLK + SELMS__DCOCLKDIV;// set XT1CLK(32768Hz) as ACLK source & MCLK/SMCLK=DCO
|
||||
|
||||
//Timer0_A0 setup
|
||||
TA0CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA0CCR0 = 32768 / 32; // 串口接收超时: 1000/32=31.25ms
|
||||
TA0CTL = MC__STOP | TACLR; // Stop mode, Clear counter
|
||||
|
||||
//Timer1_A0 setup
|
||||
TA1CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA1CCR0 = 32768 / 4; // RF接收超时: 1000/4=250ms
|
||||
TA1CTL = MC__STOP | TACLR; // Stop mode, Clear counter
|
||||
|
||||
// 设置无线模块缺省参数
|
||||
Lora_Param.sof = 0xC2;
|
||||
Lora_Param.addr = 0xADF2; // 通信地址0xADF2
|
||||
Lora_Param.sf = 6; // sf=12
|
||||
Lora_Param.baud = 3; // 9600
|
||||
Lora_Param.cr = 0; // cr=4/5
|
||||
Lora_Param.ch = 9; // 479MHz
|
||||
Lora_Param.power = 1; // 17dBm
|
||||
Lora_Param.freqcast = 0; // freqcast off
|
||||
Lora_Param.bw = 9; // 500kHz
|
||||
Lora_Param.unicast = 0; // unicast off
|
||||
|
||||
// Configure UART pins
|
||||
P1SEL1 &= ~(BIT4 | BIT5); // set 2-UART pin as second function
|
||||
P1SEL0 |= (BIT4 | BIT5); // set 2-UART pin as second function
|
||||
if(Lora_Param.baud == 7)
|
||||
UA0_Init(115200);
|
||||
else if(Lora_Param.baud == 5)
|
||||
UA0_Init(38400);
|
||||
else
|
||||
UA0_Init(9600);
|
||||
|
||||
#if 0 // 配置打印串口
|
||||
// Configure UART pins
|
||||
P2SEL1 &= ~(BIT5 | BIT6); // set 2-UART pin as second function
|
||||
P2SEL0 |= (BIT5 | BIT6); // set 2-UART pin as second function
|
||||
// Configure UART
|
||||
UCA1CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
UCA1BR0 = 4; // 8000000/16/115200//这位大于16 UCOS16位要置位
|
||||
UCA1BR1 = 0; // Fractional portion = 0.44444
|
||||
UCA1MCTLW = 0x5500 | UCOS16 | UCBRF_5;//微调Baud Rate
|
||||
UCA1CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
|
||||
// 打印复位原因(电源引起,不包括看门狗)
|
||||
PRINTF("\nModule reseted: %04X\n", PMMIFG);
|
||||
|
||||
#else // 配置MD0、MD1模式
|
||||
P2SEL1 &= ~(BIT3 | BIT5 | BIT6); // set 2-UART pin as GPIO
|
||||
P2SEL0 &= ~(BIT3 | BIT5 | BIT6); // set 2-UART pin as GPIO
|
||||
P2DIR &= ~(BIT5 | BIT6); // Input
|
||||
P2REN |= (BIT5 | BIT6); // enable pull
|
||||
P2OUT &= ~(BIT5 | BIT6); // pull-down
|
||||
|
||||
P2DIR |= BIT3; // Output
|
||||
P2OUT |= BIT3; // Output high
|
||||
#endif
|
||||
|
||||
_EINT();
|
||||
|
||||
#if 0
|
||||
// 打印复位原因(电源引起,不包括看门狗)
|
||||
RF_RxBuf[0] = PMMIFG >> 8;
|
||||
RF_RxBuf[1] = PMMIFG & 0xFF;
|
||||
RF_RxBuf_Length = 2;
|
||||
RF_RxBuf_offset = 0;
|
||||
UCA0IE |= UCTXIE;
|
||||
while(UCA0IE & UCTXIE);
|
||||
#endif
|
||||
// 读寄存器,清除复位原因
|
||||
SYSRSTIV;
|
||||
|
||||
//无线模块初始化
|
||||
uint8_t try_count = 3; //最多初始化3次
|
||||
while(try_count)
|
||||
{
|
||||
if(SX127x_initLora(&Lora_Param) == NORMAL)
|
||||
break;
|
||||
try_count--;
|
||||
}
|
||||
if(try_count == 0) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
|
||||
// 初始处于接收模式
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
// 默认发送信道
|
||||
sendCh = Lora_Param.ch;
|
||||
|
||||
// 开启看门狗: 超时时间为2^27/SMCLK,在8000000主频下约为16s
|
||||
WDTCTL = (WDTPW | WDTCNTCL | WDTIS_1);
|
||||
|
||||
while(1)
|
||||
{
|
||||
#if 1
|
||||
// TODO: 喂狗
|
||||
WDTCTL = (WDTPW | WDTCNTCL | WDTIS_1);
|
||||
|
||||
// 配置模式
|
||||
if((P2IN & (BIT5 | BIT6)) == (BIT5 | BIT6))
|
||||
{
|
||||
if(UA0_RxBuf_Length - UA0_RxBuf_offset >= sizeof(Lora_Param))
|
||||
{
|
||||
if(UA0_RxBuf[UA0_RxBuf_offset] == 0xC2)
|
||||
{
|
||||
// 保存参数
|
||||
memmove(&Lora_Param, UA0_RxBuf + UA0_RxBuf_offset, sizeof(Lora_Param));
|
||||
// 颠倒地址高低字节
|
||||
Lora_Param.addr = (Lora_Param.addr << 8) | (Lora_Param.addr >> 8);
|
||||
|
||||
//无线模块初始化
|
||||
uint8_t try_count = 3; //最多初始化3次
|
||||
while(try_count)
|
||||
{
|
||||
// 其它参数有变化,无线模块初始化
|
||||
if(SX127x_initLora(&Lora_Param) == NORMAL)
|
||||
break;
|
||||
try_count--;
|
||||
}
|
||||
if(try_count == 0) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
|
||||
// 默认处于接收模式
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
// 默认发送信道
|
||||
sendCh = Lora_Param.ch;
|
||||
// 应答配置命令
|
||||
UA0_Response("OK\r\n");
|
||||
|
||||
// 改变串口波特率
|
||||
if(Lora_Param.baud == 7)
|
||||
UA0_Init(115200);
|
||||
else if(Lora_Param.baud == 5)
|
||||
UA0_Init(38400);
|
||||
else
|
||||
UA0_Init(9600);
|
||||
}
|
||||
|
||||
UA0_RxBuf_offset = UA0_RxBuf_Length;
|
||||
}
|
||||
}
|
||||
// 透传模式
|
||||
else if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
#endif
|
||||
{
|
||||
if(UA0_RxBuf_Length > UA0_RxBuf_offset)
|
||||
{
|
||||
// 定点传输,指定目标地址和信道发送
|
||||
if(Lora_Param.unicast) // 定点发送
|
||||
{
|
||||
if(UA0_RxBuf_offset == 0 && UA0_RxBuf_Length > 3)
|
||||
sendCh = UA0_RxBuf[2];
|
||||
}
|
||||
else if(Lora_Param.freqcast) // 指定信道发送
|
||||
{
|
||||
if(UA0_RxBuf_offset == 0 && UA0_RxBuf_Length > 1)
|
||||
{
|
||||
sendCh = UA0_RxBuf[0];
|
||||
UA0_RxBuf_offset = 1; // 不发送第1发个字节
|
||||
}
|
||||
}
|
||||
|
||||
if(UA0_RxBuf_Length - UA0_RxBuf_offset >= RF_PAYLOAD_LEN)
|
||||
{
|
||||
LSD_RF_FreqSet(sendCh);
|
||||
LSD_RF_SendPacket(UA0_RxBuf + UA0_RxBuf_offset, RF_PAYLOAD_LEN);
|
||||
UA0_RxBuf_offset += RF_PAYLOAD_LEN;
|
||||
PRINTF("Send packet\n");
|
||||
|
||||
// 切换到接收模式
|
||||
LSD_RF_FreqSet(Lora_Param.ch);
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
|
||||
}
|
||||
else if(UA0_Rx_Timeout)
|
||||
{
|
||||
LSD_RF_FreqSet(sendCh);
|
||||
LSD_RF_SendPacket(UA0_RxBuf + UA0_RxBuf_offset, UA0_RxBuf_Length - UA0_RxBuf_offset);
|
||||
UA0_RxBuf_offset = UA0_RxBuf_Length;
|
||||
PRINTF("Send packet\n");
|
||||
|
||||
// 切换到接收模式
|
||||
LSD_RF_FreqSet(Lora_Param.ch);
|
||||
LSD_RF_RXmode(RF_PAYLOAD_LEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(UA0_Rx_Timeout && UA0_RxBuf_offset == UA0_RxBuf_Length)
|
||||
P2OUT |= BIT3; // Output high
|
||||
}
|
||||
}
|
||||
|
||||
// Port 1 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=PORT1_VECTOR
|
||||
__interrupt void Port_1(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(PORT1_VECTOR))) Port_1 (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
uint8_t offset = 0;
|
||||
uint8_t len[1] = {0};
|
||||
uint8_t buf[RF_PAYLOAD_LEN];
|
||||
if(DIO0_IFG&DIO0_BIT) //数据传输中断处理
|
||||
{
|
||||
// 清中断
|
||||
DIO0_IFG &= ~DIO0_BIT;
|
||||
|
||||
// 读取RF数据
|
||||
LSD_RF_RxVariPacket(buf, len); //接收可变数据包,如果速率为大速率,只能用接收固定数据包长度
|
||||
|
||||
if(len[0] == 0)
|
||||
return;
|
||||
|
||||
TA1CTL = MC__STOP | TACLR; // 停止定时器,复位计数器
|
||||
TA1CTL = TASSEL__ACLK | MC__UP; // 重新开始计时
|
||||
|
||||
offset = 0;
|
||||
if(RF_Rx_Timeout) // 新的一组数据到来
|
||||
{
|
||||
RF_Rx_Timeout = 0;
|
||||
|
||||
// 复位缓冲区
|
||||
RF_RxBuf_Length = 0;
|
||||
RF_RxBuf_offset = 0;
|
||||
|
||||
if(Lora_Param.unicast)
|
||||
{
|
||||
// 定点传输,地址和信道校验失败
|
||||
if(len[0] <= 3 || buf[2] != Lora_Param.ch || ((buf[0] << 8) | buf[1]) != Lora_Param.addr)
|
||||
return;
|
||||
// 前3个字符丢掉
|
||||
offset = 3;
|
||||
len[0] -= offset;
|
||||
}
|
||||
}
|
||||
|
||||
PRINTF("Recv packet\n");
|
||||
|
||||
// 透传模式
|
||||
if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
{
|
||||
if(RF_RxBuf_Length + len[0] <= TRAN_BUF_SIZE)
|
||||
{
|
||||
memmove(RF_RxBuf + RF_RxBuf_Length, buf + offset, len[0]);
|
||||
// 中断方式向串口转发
|
||||
RF_RxBuf_Length += len[0];
|
||||
UCA0IE |= UCTXIE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Timer0 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER0_A0_VECTOR
|
||||
__interrupt void Timer0_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) Timer0_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 停止定时器,复位计数器
|
||||
TA0CTL = MC__STOP | TACLR;
|
||||
// 串口接收超时
|
||||
UA0_Rx_Timeout = 1;
|
||||
}
|
||||
|
||||
// Timer1 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER1_A0_VECTOR
|
||||
__interrupt void Timer1_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) Timer1_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 停止定时器,复位计数器
|
||||
TA1CTL = MC__STOP | TACLR;
|
||||
// RF接收超时
|
||||
RF_Rx_Timeout = 1;
|
||||
}
|
||||
|
||||
// UAR0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=USCI_A0_VECTOR
|
||||
__interrupt void USCI_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
// 接收中断
|
||||
if((UCA0IE & UCRXIE) && (UCA0IFG & UCRXIFG))
|
||||
{
|
||||
uint8_t c = UCA0RXBUF;
|
||||
|
||||
TA0CTL = MC__STOP | TACLR; // 停止定时器,复位计数器
|
||||
TA0CTL = TASSEL__ACLK | MC__UP; // 重新开始计时
|
||||
|
||||
if(UA0_Rx_Timeout) // 新的一组数据到来
|
||||
{
|
||||
UA0_Rx_Timeout = 0;
|
||||
// 复位缓冲区
|
||||
UA0_RxBuf_Length = 0;
|
||||
UA0_RxBuf_offset = 0;
|
||||
}
|
||||
|
||||
if(UA0_RxBuf_Length < TRAN_BUF_SIZE)
|
||||
{
|
||||
#if 1
|
||||
// 配置模式
|
||||
if((P2IN & (BIT5 | BIT6)) == (BIT5 | BIT6))
|
||||
{
|
||||
// 第1个字符必须为0xC2
|
||||
if(UA0_RxBuf_Length > 0 || c == 0xC2)
|
||||
UA0_RxBuf[UA0_RxBuf_Length++] = c;
|
||||
}
|
||||
// 透传模式
|
||||
else if((P2IN & (BIT5 | BIT6)) == 0)
|
||||
#endif
|
||||
{
|
||||
// 主函数透传
|
||||
UA0_RxBuf[UA0_RxBuf_Length++] = c;
|
||||
}
|
||||
|
||||
P2OUT &= ~BIT3; // Output low
|
||||
}
|
||||
}
|
||||
|
||||
// 发送中断
|
||||
if((UCA0IE & UCTXIE) && (UCA0IFG & UCTXIFG))
|
||||
{
|
||||
UCA0TXBUF = RF_RxBuf[RF_RxBuf_offset++]; // 发送字符
|
||||
if(RF_RxBuf_offset >= RF_RxBuf_Length) // 全部发送完
|
||||
{
|
||||
// 禁止中断
|
||||
UCA0IE &= ~UCTXIE;
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,388 @@
|
|||
// Haybin_Wu
|
||||
// Shenitech-RD
|
||||
// 2016.5
|
||||
// Built with IAR Embedded Workbench v6.2
|
||||
//******************************************************************************
|
||||
#include <msp430FR2433.h>
|
||||
#include <stdint.h>
|
||||
#include "FR2433-RFSX.h"
|
||||
#include "RF_SX1276.h"
|
||||
|
||||
uint32_t t=0;
|
||||
void FRAM_Write (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long);
|
||||
void FRAM_Read (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long);
|
||||
void Set_DT(void);
|
||||
void Refresh_Date(void);
|
||||
void UART0_Tx(uint8_t data);
|
||||
|
||||
#define FRAM_Date_START 0x1800 //Date 存储起始地址
|
||||
#define FRAM_ID_START 0x1806 //ID 存储起始地址
|
||||
#define RTC_Data 1920 //定义RTC定时周期 RTC_Data/32=?s
|
||||
|
||||
uint8_t Rx_Buf[64];
|
||||
uint8_t RF_RxBuf[64];
|
||||
uint8_t RF_RxBuf_size[1];
|
||||
uint8_t Rx_Data=0;
|
||||
uint8_t Date_Time[6]=
|
||||
{
|
||||
30,//0秒
|
||||
16,//1分
|
||||
10,//2时
|
||||
22,//3日
|
||||
05,//4月
|
||||
16,//5年
|
||||
};
|
||||
uint8_t Device_ID[4]={0xA6,0x52,0x40,0x01,};//设备ID
|
||||
|
||||
//UART发送
|
||||
void UART0_Tx(uint8_t data)
|
||||
{
|
||||
UCA0TXBUF = data;
|
||||
while((UCTXIFG&UCA0IFG)==0);
|
||||
UCA0IFG&=~UCTXIFG;
|
||||
}
|
||||
void Refresh_Date(void)
|
||||
{
|
||||
FRAM_Read(FRAM_Date_START,Date_Time,6);
|
||||
Date_Time[0]=RTCCNT/32;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//主函数
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
int main(void)
|
||||
{
|
||||
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
|
||||
// Port Configuration all un-used pins to output low
|
||||
P1DIR = 0xFF; P2DIR = 0xFF; P3DIR = 0xFF;
|
||||
P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00;
|
||||
PM5CTL0 &= ~LOCKLPM5;//开引脚功能
|
||||
|
||||
// Configure DCO Clock
|
||||
//外部时钟源启动
|
||||
P2SEL0 |= BIT0 | BIT1; // set XT1 pin as second function
|
||||
do
|
||||
{
|
||||
CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag
|
||||
SFRIFG1 &= ~OFIFG;
|
||||
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
|
||||
//上面清除标志有助于降低功耗
|
||||
|
||||
__bis_SR_register(SCG0); // disable FLL
|
||||
CSCTL3 |= SELREF__XT1CLK; // 外部 32768hz reference source
|
||||
CSCTL0 = 0; // clear DCO and MOD registers
|
||||
CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
|
||||
CSCTL1 |= DCORSEL_3; //DCO=8Mhz
|
||||
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
|
||||
__delay_cycles(3);
|
||||
__bic_SR_register(SCG0); // enable FLL
|
||||
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
|
||||
|
||||
CSCTL4 = SELREF__XT1CLK + SELMS__DCOCLKDIV;// set XT1CLK(32768Hz) as ACLK source & MCLK/SMCLK=DCO
|
||||
|
||||
|
||||
|
||||
|
||||
//Timer0_A3 setup
|
||||
TA0CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
TA0CCR0 = 32768;
|
||||
TA0CTL = TASSEL_1 | MC_1; // ACLK, continuous mode
|
||||
|
||||
// Initialize RTC
|
||||
RTCMOD = RTC_Data;
|
||||
RTCCTL = (RTCSS__XT1CLK + RTCPS__1024 + RTCIE);//+ RTCSR// Source = 32kHz crystal, divided by 1024
|
||||
if(RTCCNT>RTC_Data){RTCCTL |= RTCSR;WDTCTL=0;}
|
||||
Refresh_Date();//复位后刷新时间
|
||||
//FRCTL0 = FRCTLPW | NWAITS_1;//FRRAM
|
||||
FRAM_Read(FRAM_ID_START,Device_ID,4);//刷新设备ID
|
||||
|
||||
|
||||
// Configure UART pins
|
||||
P1SEL0 |= BIT4 | BIT5; // set 2-UART pin as second function
|
||||
// Configure UART
|
||||
UCA0CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
UCA0BR0 = 52; // 8000000/8/9600//这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0x00; // Fractional portion = 0.083
|
||||
//UCA0MCTLW = 0x11;//微调Baud Rate
|
||||
UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;//微调Baud Rate
|
||||
UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
|
||||
_EINT();
|
||||
|
||||
//无线模块测试化
|
||||
uint8_t RF_error_flag=0;
|
||||
for(uint8_t i=0;i<5;i++)//最多初始化3次
|
||||
{
|
||||
if(SX127x_init(Init_LoRa_0_8K)==NORMAL) break; //无线模块初始化失败复位
|
||||
else RF_error_flag=1;
|
||||
}
|
||||
if(RF_error_flag==1) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
LSD_RF_RXmode(64);
|
||||
//LSD_RF_SleepMode();//深度睡眠1.2uA
|
||||
|
||||
|
||||
__bis_SR_register(LPM3_bits | GIE); // Enter LPM3
|
||||
//uint32_t i=0;
|
||||
__no_operation(); // For debugger
|
||||
|
||||
while(1)
|
||||
{
|
||||
//for(uint8_t i=0;i<64;i++)Rx_Buf[i-1]=i;
|
||||
//LSD_RF_SendPacket(Rx_Buf,64); //发送64个字节数据测试
|
||||
//P3OUT ^= 0xC0; // Toggle P3.6,7 (LED) every 1s
|
||||
//UART0_Tx(0xE5);
|
||||
//if(SX127x_init(Init_LoRa_0_8K)==NORMAL);
|
||||
//LSD_RF_SleepMode();
|
||||
LSD_RF_RXmode(64);
|
||||
__bis_SR_register(LPM3_bits | GIE); // Enter LPM3
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Port 1 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=PORT1_VECTOR
|
||||
__interrupt void Port_1(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(PORT1_VECTOR))) Port_1 (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
if(DIO0_IFG&DIO0_BIT) //数据传输中断处理
|
||||
{
|
||||
LSD_RF_RxVariPacket(RF_RxBuf,RF_RxBuf_size); //接收可变数据包,如果速率为大速率,只能用接收固定数据包长度
|
||||
DelayMs(10);
|
||||
/*****************************************指令处理************************/
|
||||
//if((RF_RxBuf[0]==0x01)&&(RF_RxBuf[1]==0x02))//(RF_rxBuf_size==(RF_RxBuf[3]+6))
|
||||
{//判定指令是否有效!!!
|
||||
for(uint8_t i=0;i<RF_RxBuf_size[0];i++)
|
||||
{UART0_Tx(RF_RxBuf[i]);}
|
||||
}
|
||||
DIO0_IFG&=~DIO0_BIT;
|
||||
}
|
||||
// Clear P1.3 IFG
|
||||
//__bic_SR_register_on_exit(LPM3_bits); // Exit LPM3
|
||||
}
|
||||
|
||||
// Port 2 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=PORT2_VECTOR
|
||||
__interrupt void Port_2(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(PORT2_VECTOR))) Port_2 (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
P2IFG=0; // Clear P1.3 IFG
|
||||
//__bic_SR_register_on_exit(LPM3_bits); // Exit LPM3
|
||||
}
|
||||
/*
|
||||
// SPI-B0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=USCI_B0_VECTOR
|
||||
__interrupt void USCI_B0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCI_B0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
while (!(UCB0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
|
||||
UCB0TXBUF = UCB0RXBUF; // Echo received data
|
||||
}
|
||||
*/
|
||||
|
||||
// Timer0 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER0_A0_VECTOR
|
||||
__interrupt void Timer0_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) Timer0_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
t++;
|
||||
if(t>5)
|
||||
{
|
||||
t=0;//WDTCTL=0;
|
||||
//LSD_RF_RxVariPacket(Rxbuffer,Rxbuffer_size); //接收可变数据包,如果速率为大速率,只能用接收固定数据包长度
|
||||
//LSD_RF_RXmode(30); //每次发送一包数据后,进入接收状态,等待B模块应答
|
||||
__bic_SR_register_on_exit(LPM3_bits); // Exit LPM3
|
||||
}
|
||||
}
|
||||
// Timer1 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER1_A0_VECTOR
|
||||
__interrupt void Timer1_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) Timer1_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
;
|
||||
//if(t>5)WDTCTL=0;//P3OUT ^= 0xC0;
|
||||
}
|
||||
|
||||
// RTC interrupt service routine //一分钟一次
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=RTC_VECTOR
|
||||
__interrupt void RTC_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(RTC_VECTOR))) RTC_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
if(RTCIV&0x02)
|
||||
{
|
||||
Date_Time[0]=60;
|
||||
Set_DT();//万年历
|
||||
FRAM_Write (FRAM_Date_START,Date_Time,6);//写入铁电
|
||||
}
|
||||
}
|
||||
|
||||
// UAR0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=USCI_A0_VECTOR
|
||||
__interrupt void USCI_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
uint8_t CS=0;
|
||||
if((UCA0IV&USCI_UART_UCRXIFG)==USCI_UART_UCRXIFG)
|
||||
{
|
||||
Rx_Buf[Rx_Data++] = UCA0RXBUF;
|
||||
//UCA0IFG&=~UCRXIFG;
|
||||
}
|
||||
if(Rx_Data>=10)
|
||||
{
|
||||
for(uint8_t i=0;i<(Rx_Buf[3]+1);i++)
|
||||
CS+=Rx_Buf[i+2];
|
||||
if((Rx_Buf[0]==0x4D)&&(Rx_Buf[1]==0x4B)&&(Rx_Buf[Rx_Data-2]==0x55)&&(Rx_Buf[Rx_Data-1]==0x16))
|
||||
{
|
||||
FRAM_Read(FRAM_ID_START,Device_ID,4);//刷新设备ID
|
||||
//功能码01 设置ID//4D 4B 01 08 00 00 00 00 ID ID ID ID CS 16
|
||||
if((Rx_Buf[2]==0x01)&&(Rx_Buf[4]==Device_ID[0])&&(Rx_Buf[5]==Device_ID[1])&&(Rx_Buf[6]==Device_ID[2])&&(Rx_Buf[7]==Device_ID[3]))
|
||||
{
|
||||
Device_ID[0]=Rx_Buf[8];Device_ID[1]=Rx_Buf[9];Device_ID[2]=Rx_Buf[10];Device_ID[3]=Rx_Buf[11];
|
||||
FRAM_Write(FRAM_ID_START,Device_ID,4);
|
||||
//FRAM_Read(FRAM_ID_START,Device_ID,4);//刷新设备ID
|
||||
UART0_Tx(0xE5);
|
||||
Rx_Data=0;
|
||||
}
|
||||
//功能码06 读设备RTC//4D 4B 06 04 00 00 00 00 CS 16
|
||||
if((Rx_Buf[2]==0x06)&&(Rx_Buf[4]==Device_ID[0])&&(Rx_Buf[5]==Device_ID[1])&&(Rx_Buf[6]==Device_ID[2])&&(Rx_Buf[7]==Device_ID[3]))
|
||||
{
|
||||
Refresh_Date();//refresh time
|
||||
//Return 4D 4B 06 A0 ID ID ID ID DT DT DT DT DT DT E5 16
|
||||
UART0_Tx(0x4D);UART0_Tx(0x4B);UART0_Tx(0x06);UART0_Tx(0xA0);UART0_Tx(Device_ID[0]);UART0_Tx(Device_ID[1]);UART0_Tx(Device_ID[2]);UART0_Tx(Device_ID[3]);
|
||||
UART0_Tx(Date_Time[0]);UART0_Tx(Date_Time[1]);UART0_Tx(Date_Time[2]);UART0_Tx(Date_Time[3]);UART0_Tx(Date_Time[4]);UART0_Tx(Date_Time[5]);
|
||||
UART0_Tx(0xE5);UART0_Tx(0x16);
|
||||
Rx_Data=0;
|
||||
}
|
||||
//功能码07 同步RTC//4D 4B 06 04 00 00 00 00 CS 16
|
||||
if((Rx_Buf[2]==0x07)&&(Rx_Buf[4]==Device_ID[0])&&(Rx_Buf[5]==Device_ID[1])&&(Rx_Buf[6]==Device_ID[2])&&(Rx_Buf[7]==Device_ID[3]))
|
||||
{
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//万年历程序
|
||||
void Set_DT(void)
|
||||
{
|
||||
|
||||
if(Date_Time[0]>59)//秒进位
|
||||
{
|
||||
Date_Time[1]++;
|
||||
Date_Time[0]=0;
|
||||
}
|
||||
if(Date_Time[1]>59)//分进位
|
||||
{
|
||||
Date_Time[2]++;
|
||||
Date_Time[1]=0;
|
||||
}
|
||||
if(Date_Time[2]>23)//小时进位
|
||||
{
|
||||
Date_Time[3]++;
|
||||
Date_Time[2]=0;
|
||||
}
|
||||
//常31天情况
|
||||
if((Date_Time[4]==1)||(Date_Time[4]==3)||(Date_Time[4]==5)||(Date_Time[4]==7)||(Date_Time[4]==8)||(Date_Time[4]==10)||(Date_Time[4]==12))
|
||||
{
|
||||
if(Date_Time[3]>31)
|
||||
{
|
||||
Date_Time[3]=1;
|
||||
Date_Time[4]++;
|
||||
}
|
||||
if(Date_Time[4]>12)
|
||||
{
|
||||
Date_Time[4]=1;
|
||||
Date_Time[5]++;
|
||||
}
|
||||
if(Date_Time[5]>99)Date_Time[5]=0;
|
||||
}
|
||||
//常30天情况
|
||||
if((Date_Time[4]==4)||(Date_Time[4]==6)||(Date_Time[4]==9)||(Date_Time[4]==11))
|
||||
{
|
||||
if(Date_Time[3]>30)
|
||||
{
|
||||
Date_Time[3]=1;
|
||||
Date_Time[4]++;
|
||||
}
|
||||
}
|
||||
//2月特殊情况
|
||||
if(Date_Time[4]==2)
|
||||
{
|
||||
if((Date_Time[5]%4==0&&Date_Time[5]%100!=0) ||(Date_Time[5]%400==0))//闰年
|
||||
{
|
||||
if(Date_Time[3]>29)
|
||||
{
|
||||
Date_Time[3]=1;
|
||||
Date_Time[4]++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(Date_Time[3]>28)
|
||||
{
|
||||
Date_Time[3]=1;
|
||||
Date_Time[4]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FRAM_Write (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long)
|
||||
{
|
||||
SYSCFG0 &= ~DFWP; //Close FRAM Write Protection
|
||||
//FRAM_Date_START=*0x1800;
|
||||
for (uint8_t i = 0; i < Array_Long; i++)
|
||||
{
|
||||
*(uint8_t *)(FRAM_START+i)=Array[i];//
|
||||
}
|
||||
SYSCFG0 |= DFWP; //Open FRAM Write Protection
|
||||
}
|
||||
|
||||
void FRAM_Read (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long)
|
||||
{
|
||||
for (uint8_t i = 0; i < Array_Long; i++)
|
||||
{
|
||||
Array[i]=*(uint8_t *)(FRAM_START+i);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,395 @@
|
|||
// Haybin_Wu
|
||||
// Shenitech-RD
|
||||
// 2016.5
|
||||
// Built with IAR Embedded Workbench v6.2
|
||||
//******************************************************************************
|
||||
#include <msp430FR2433.h>
|
||||
#include <stdint.h>
|
||||
#include "FR2433-RFSX.h"
|
||||
#include "RF_SX1276.h"
|
||||
|
||||
uint32_t t=0;
|
||||
void FRAM_Write (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long);
|
||||
void FRAM_Read (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long);
|
||||
void Set_DT(void);
|
||||
void Refresh_Date(void);
|
||||
void UART0_Tx(uint8_t data);
|
||||
|
||||
#define FRAM_Date_START 0x1800 //Date 存储起始地址
|
||||
#define FRAM_ID_START 0x1806 //ID 存储起始地址
|
||||
#define RTC_Data 1920 //定义RTC定时周期 RTC_Data/32=?s
|
||||
|
||||
uint8_t Rx_Buf[64];
|
||||
uint8_t Rx_Length=0;
|
||||
uint8_t Rx_Flog=0;
|
||||
uint8_t Rx_Data=0;
|
||||
uint8_t Date_Time[6]=
|
||||
{
|
||||
30,//0秒
|
||||
16,//1分
|
||||
10,//2时
|
||||
22,//3日
|
||||
05,//4月
|
||||
16,//5年
|
||||
};
|
||||
uint8_t Device_ID[4]={0xA6,0x52,0x40,0x01,};//设备ID
|
||||
|
||||
//UART发送
|
||||
void UART0_Tx(uint8_t data)
|
||||
{
|
||||
UCA0TXBUF = data;
|
||||
while((UCTXIFG&UCA0IFG)==0);
|
||||
UCA0IFG&=~UCTXIFG;
|
||||
}
|
||||
void Refresh_Date(void)
|
||||
{
|
||||
FRAM_Read(FRAM_Date_START,Date_Time,6);
|
||||
Date_Time[0]=RTCCNT/32;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//主函数
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
int main(void)
|
||||
{
|
||||
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
|
||||
// Port Configuration all un-used pins to output low
|
||||
P1DIR = 0xFF; P2DIR = 0xFF; P3DIR = 0xFF;
|
||||
P1OUT = 0x00; P2OUT = 0x00; P3OUT = 0x00;
|
||||
PM5CTL0 &= ~LOCKLPM5;//开引脚功能
|
||||
|
||||
// Configure DCO Clock
|
||||
//外部时钟源启动
|
||||
P2SEL0 |= BIT0 | BIT1; // set XT1 pin as second function
|
||||
do
|
||||
{
|
||||
CSCTL7 &= ~(XT1OFFG | DCOFFG); // Clear XT1 and DCO fault flag
|
||||
SFRIFG1 &= ~OFIFG;
|
||||
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
|
||||
//上面清除标志有助于降低功耗
|
||||
|
||||
__bis_SR_register(SCG0); // disable FLL
|
||||
CSCTL3 |= SELREF__XT1CLK; // 外部 32768hz reference source
|
||||
CSCTL0 = 0; // clear DCO and MOD registers
|
||||
CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first
|
||||
CSCTL1 |= DCORSEL_3; //DCO=8Mhz
|
||||
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
|
||||
__delay_cycles(3);
|
||||
__bic_SR_register(SCG0); // enable FLL
|
||||
while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // Poll until FLL is locked
|
||||
|
||||
CSCTL4 = SELREF__XT1CLK + SELMS__DCOCLKDIV;// set XT1CLK(32768Hz) as ACLK source & MCLK/SMCLK=DCO
|
||||
|
||||
|
||||
|
||||
|
||||
//Timer0_A3 setup
|
||||
//TA0CCTL0 = CCIE; // TACCR0 interrupt enabled
|
||||
//TA0CCR0 = 32768;
|
||||
//TA0CTL = TASSEL_1 | MC_1; // ACLK, continuous mode
|
||||
|
||||
// Initialize RTC
|
||||
RTCMOD = RTC_Data;
|
||||
RTCCTL = (RTCSS__XT1CLK + RTCPS__1024 + RTCIE);//+ RTCSR// Source = 32kHz crystal, divided by 1024
|
||||
if(RTCCNT>RTC_Data){RTCCTL |= RTCSR;WDTCTL=0;}
|
||||
Refresh_Date();//复位后刷新时间
|
||||
//FRCTL0 = FRCTLPW | NWAITS_1;//FRRAM
|
||||
FRAM_Read(FRAM_ID_START,Device_ID,4);//刷新设备ID
|
||||
|
||||
|
||||
// Configure UART pins
|
||||
P1SEL0 |= BIT4 | BIT5; // set 2-UART pin as second function
|
||||
// Configure UART
|
||||
UCA0CTLW0 |=(UCSSEL__SMCLK+UCSWRST);//UCPEN+UCPAR+
|
||||
// Baud Rate calculation
|
||||
UCA0BR0 = 52; // 8000000/8/9600//这位大于16 UCOS16位要置位
|
||||
UCA0BR1 = 0x00; // Fractional portion = 0.083
|
||||
//UCA0MCTLW = 0x11;//微调Baud Rate
|
||||
UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;//微调Baud Rate
|
||||
UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
|
||||
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
|
||||
|
||||
_EINT();
|
||||
|
||||
//无线模块测试化
|
||||
uint8_t RF_error_flag=0;
|
||||
for(uint8_t i=0;i<5;i++)//最多初始化3次
|
||||
{
|
||||
if(SX127x_init(Init_LoRa_0_8K)==NORMAL) break; //无线模块初始化失败复位
|
||||
else RF_error_flag=1;
|
||||
}
|
||||
if(RF_error_flag==1) //无线初始化失败处理
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
LPM4;
|
||||
}
|
||||
LSD_RF_SleepMode();//深度睡眠1.2uA
|
||||
|
||||
|
||||
__bis_SR_register(LPM3_bits | GIE); // Enter LPM3
|
||||
//uint32_t i=0;
|
||||
__no_operation(); // For debugger
|
||||
|
||||
while(1)
|
||||
{
|
||||
//P3OUT ^= 0xC0;
|
||||
//for(uint8_t i=0;i<Rx_Data;i++);
|
||||
|
||||
do
|
||||
{
|
||||
Rx_Flog=0;
|
||||
DelayMs(450); //延时长短跟串口波特率有关系
|
||||
}
|
||||
while(Rx_Flog==1);
|
||||
|
||||
LSD_RF_SendPacket(Rx_Buf,Rx_Data); //发送个字节数据测试
|
||||
DelayMs(800);//延时长短跟发送数据长短和速率有关系
|
||||
Rx_Data=0;
|
||||
|
||||
//P3OUT ^= 0xC0; // Toggle P3.6,7 (LED) every 1s
|
||||
//UART0_Tx(0xE5);
|
||||
//if(SX127x_init(Init_LoRa_0_8K)==NORMAL);
|
||||
LSD_RF_SleepMode();
|
||||
__bis_SR_register(LPM3_bits | GIE); // Enter LPM3
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Port 2 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=PORT2_VECTOR
|
||||
__interrupt void Port_2(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(PORT2_VECTOR))) Port_2 (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
P2IFG=0; // Clear P1.3 IFG
|
||||
//__bic_SR_register_on_exit(LPM3_bits); // Exit LPM3
|
||||
}
|
||||
|
||||
/*
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=USCI_A0_VECTOR
|
||||
__interrupt void USCI_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
if(Rx_Length >= 100)
|
||||
{
|
||||
Rx_Length = 0;
|
||||
}
|
||||
Rx_Buf[Rx_Length]=UCA0RXBUF;
|
||||
Rx_Length++;
|
||||
Rx_Flog=1;
|
||||
}
|
||||
|
||||
|
||||
// SPI-B0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=USCI_B0_VECTOR
|
||||
__interrupt void USCI_B0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCI_B0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
while (!(UCB0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
|
||||
UCB0TXBUF = UCB0RXBUF; // Echo received data
|
||||
}
|
||||
*/
|
||||
|
||||
// Timer0 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER0_A0_VECTOR
|
||||
__interrupt void Timer0_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) Timer0_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
t++;
|
||||
if(t>5)
|
||||
{
|
||||
t=0;//WDTCTL=0;
|
||||
//LSD_RF_RxVariPacket(Rxbuffer,Rxbuffer_size); //接收可变数据包,如果速率为大速率,只能用接收固定数据包长度
|
||||
//LSD_RF_RXmode(30); //每次发送一包数据后,进入接收状态,等待B模块应答
|
||||
|
||||
}
|
||||
}
|
||||
// Timer1 A0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector = TIMER1_A0_VECTOR
|
||||
__interrupt void Timer1_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) Timer1_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
;
|
||||
//if(t>5)WDTCTL=0;//P3OUT ^= 0xC0;
|
||||
}
|
||||
|
||||
// RTC interrupt service routine //一分钟一次
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=RTC_VECTOR
|
||||
__interrupt void RTC_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(RTC_VECTOR))) RTC_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
if(RTCIV&0x02)
|
||||
{
|
||||
Date_Time[0]=60;
|
||||
Set_DT();//万年历
|
||||
FRAM_Write (FRAM_Date_START,Date_Time,6);//写入铁电
|
||||
}
|
||||
}
|
||||
|
||||
// UAR0 interrupt service routine
|
||||
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
||||
#pragma vector=USCI_A0_VECTOR
|
||||
__interrupt void USCI_A0_ISR(void)
|
||||
#elif defined(__GNUC__)
|
||||
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
|
||||
#else
|
||||
#error Compiler not supported!
|
||||
#endif
|
||||
{
|
||||
uint8_t CS=0;
|
||||
if((UCA0IV&USCI_UART_UCRXIFG)==USCI_UART_UCRXIFG)
|
||||
{
|
||||
Rx_Flog=1;
|
||||
Rx_Buf[Rx_Data] = UCA0RXBUF;
|
||||
Rx_Data++;
|
||||
//UCA0IFG&=~UCRXIFG;
|
||||
}
|
||||
if(Rx_Data>=10)
|
||||
{
|
||||
for(uint8_t i=0;i<(Rx_Buf[3]+1);i++)
|
||||
CS+=Rx_Buf[i+2];
|
||||
if((Rx_Buf[0]==0x4D)&&(Rx_Buf[1]==0x4B)&&(Rx_Buf[Rx_Data-2]==0x55)&&(Rx_Buf[Rx_Data-1]==0x16))
|
||||
{
|
||||
FRAM_Read(FRAM_ID_START,Device_ID,4);//刷新设备ID
|
||||
//功能码01 设置ID//4D 4B 01 08 00 00 00 00 ID ID ID ID CS 16
|
||||
if((Rx_Buf[2]==0x01)&&(Rx_Buf[4]==Device_ID[0])&&(Rx_Buf[5]==Device_ID[1])&&(Rx_Buf[6]==Device_ID[2])&&(Rx_Buf[7]==Device_ID[3]))
|
||||
{
|
||||
Device_ID[0]=Rx_Buf[8];Device_ID[1]=Rx_Buf[9];Device_ID[2]=Rx_Buf[10];Device_ID[3]=Rx_Buf[11];
|
||||
FRAM_Write(FRAM_ID_START,Device_ID,4);
|
||||
//FRAM_Read(FRAM_ID_START,Device_ID,4);//刷新设备ID
|
||||
UART0_Tx(0xE5);
|
||||
}
|
||||
//功能码06 读设备RTC//4D 4B 06 04 00 00 00 00 CS 16
|
||||
if((Rx_Buf[2]==0x06)&&(Rx_Buf[4]==Device_ID[0])&&(Rx_Buf[5]==Device_ID[1])&&(Rx_Buf[6]==Device_ID[2])&&(Rx_Buf[7]==Device_ID[3]))
|
||||
{
|
||||
Refresh_Date();//refresh time
|
||||
//Return 4D 4B 06 A0 ID ID ID ID DT DT DT DT DT DT E5 16
|
||||
UART0_Tx(0x4D);UART0_Tx(0x4B);UART0_Tx(0x06);UART0_Tx(0xA0);UART0_Tx(Device_ID[0]);UART0_Tx(Device_ID[1]);UART0_Tx(Device_ID[2]);UART0_Tx(Device_ID[3]);
|
||||
UART0_Tx(Date_Time[0]);UART0_Tx(Date_Time[1]);UART0_Tx(Date_Time[2]);UART0_Tx(Date_Time[3]);UART0_Tx(Date_Time[4]);UART0_Tx(Date_Time[5]);
|
||||
UART0_Tx(0xE5);UART0_Tx(0x16);
|
||||
}
|
||||
//功能码07 同步RTC//4D 4B 06 04 00 00 00 00 CS 16
|
||||
if((Rx_Buf[2]==0x07)&&(Rx_Buf[4]==Device_ID[0])&&(Rx_Buf[5]==Device_ID[1])&&(Rx_Buf[6]==Device_ID[2])&&(Rx_Buf[7]==Device_ID[3]))
|
||||
{
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
__bic_SR_register_on_exit(LPM3_bits); // Exit LPM3
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//万年历程序
|
||||
void Set_DT(void)
|
||||
{
|
||||
|
||||
if(Date_Time[0]>59)//秒进位
|
||||
{
|
||||
Date_Time[1]++;
|
||||
Date_Time[0]=0;
|
||||
}
|
||||
if(Date_Time[1]>59)//分进位
|
||||
{
|
||||
Date_Time[2]++;
|
||||
Date_Time[1]=0;
|
||||
}
|
||||
if(Date_Time[2]>23)//小时进位
|
||||
{
|
||||
Date_Time[3]++;
|
||||
Date_Time[2]=0;
|
||||
}
|
||||
//常31天情况
|
||||
if((Date_Time[4]==1)||(Date_Time[4]==3)||(Date_Time[4]==5)||(Date_Time[4]==7)||(Date_Time[4]==8)||(Date_Time[4]==10)||(Date_Time[4]==12))
|
||||
{
|
||||
if(Date_Time[3]>31)
|
||||
{
|
||||
Date_Time[3]=1;
|
||||
Date_Time[4]++;
|
||||
}
|
||||
if(Date_Time[4]>12)
|
||||
{
|
||||
Date_Time[4]=1;
|
||||
Date_Time[5]++;
|
||||
}
|
||||
if(Date_Time[5]>99)Date_Time[5]=0;
|
||||
}
|
||||
//常30天情况
|
||||
if((Date_Time[4]==4)||(Date_Time[4]==6)||(Date_Time[4]==9)||(Date_Time[4]==11))
|
||||
{
|
||||
if(Date_Time[3]>30)
|
||||
{
|
||||
Date_Time[3]=1;
|
||||
Date_Time[4]++;
|
||||
}
|
||||
}
|
||||
//2月特殊情况
|
||||
if(Date_Time[4]==2)
|
||||
{
|
||||
if((Date_Time[5]%4==0&&Date_Time[5]%100!=0) ||(Date_Time[5]%400==0))//闰年
|
||||
{
|
||||
if(Date_Time[3]>29)
|
||||
{
|
||||
Date_Time[3]=1;
|
||||
Date_Time[4]++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(Date_Time[3]>28)
|
||||
{
|
||||
Date_Time[3]=1;
|
||||
Date_Time[4]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FRAM_Write (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long)
|
||||
{
|
||||
SYSCFG0 &= ~DFWP; //Close FRAM Write Protection
|
||||
//FRAM_Date_START=*0x1800;
|
||||
for (uint8_t i = 0; i < Array_Long; i++)
|
||||
{
|
||||
*(uint8_t *)(FRAM_START+i)=Array[i];//
|
||||
}
|
||||
SYSCFG0 |= DFWP; //Open FRAM Write Protection
|
||||
}
|
||||
|
||||
void FRAM_Read (uint16_t FRAM_START,uint8_t *(Array),uint8_t Array_Long)
|
||||
{
|
||||
for (uint8_t i = 0; i < Array_Long; i++)
|
||||
{
|
||||
Array[i]=*(uint8_t *)(FRAM_START+i);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,264 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 版权: 利尔达科技集团股份有限公司
|
||||
// 文件名:
|
||||
// 版本: v2.0
|
||||
// 工作环境: IAR v5.30
|
||||
// 作者: 于海波
|
||||
// 生成日期: 2013.12
|
||||
// 功能: API
|
||||
// 相关文件:
|
||||
// 修改日志:
|
||||
// 见更新说明
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "sx1276-LoRa.h"
|
||||
#include "sx1276-f4152-Hal.h"
|
||||
#include "LSD_RF_SX1276.h"
|
||||
//===================================定义变量===================================================
|
||||
float G_BandWidthKHz = 500.0;//本地计算Symbol周期使用
|
||||
float G_TsXms = 1.024;//1.024ms
|
||||
S_LoRaConfig G_LoRaConfig = {
|
||||
470000000,
|
||||
BW500KHZ,
|
||||
SF08,
|
||||
CR_4_5,
|
||||
15,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
64,
|
||||
};
|
||||
|
||||
bool LoRaConfig_Check()
|
||||
{
|
||||
if((G_LoRaConfig.LoRa_Freq<137000000)||(G_LoRaConfig.LoRa_Freq>525000000))
|
||||
return false;
|
||||
G_LoRaConfig.BandWidth = (t_BandWidth)(G_LoRaConfig.BandWidth&0xF0);
|
||||
if(G_LoRaConfig.BandWidth>BW500KHZ)
|
||||
return false;
|
||||
//计算BandWidth
|
||||
switch(G_LoRaConfig.BandWidth){
|
||||
case BW500KHZ:G_BandWidthKHz = 500.0;break;
|
||||
case BW250KHZ:G_BandWidthKHz = 250.0;break;
|
||||
case BW125KHZ:G_BandWidthKHz = 125.0;break;
|
||||
case BW62_50KHZ:G_BandWidthKHz = 62.5;break;
|
||||
case BW41_66KHZ:G_BandWidthKHz = 41.66;break;
|
||||
case BW31_25KHZ:G_BandWidthKHz = 31.25;break;
|
||||
case BW20_83KHZ:G_BandWidthKHz = 20.83;break;
|
||||
case BW15_62KHZ:G_BandWidthKHz = 15.62;break;
|
||||
case BW10_41KHZ:G_BandWidthKHz = 10.41;break;
|
||||
case BW7_81KHZ:G_BandWidthKHz = 7.81;break;
|
||||
}
|
||||
G_LoRaConfig.SpreadingFactor = (t_SpreadingFactor)(G_LoRaConfig.SpreadingFactor&0xF0);
|
||||
if((G_LoRaConfig.SpreadingFactor>SF12)||(G_LoRaConfig.SpreadingFactor<SF06))
|
||||
return false;
|
||||
//计算LoRa码元周期,单位ms
|
||||
G_TsXms = (2<<((G_LoRaConfig.SpreadingFactor>>4)-1))/G_BandWidthKHz;
|
||||
|
||||
G_LoRaConfig.CodingRate = (t_CodingRate)(G_LoRaConfig.CodingRate&0x0E);
|
||||
if((G_LoRaConfig.CodingRate>CR_4_8)||(G_LoRaConfig.CodingRate<CR_4_5))
|
||||
return false;
|
||||
if(G_LoRaConfig.PowerCfig>15)
|
||||
return false;
|
||||
if(G_LoRaConfig.PayloadLength>127)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
//===================================子函数===================================================
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF初始化
|
||||
// 输入参数 : tSX127xInitPara initPara 输入速率Init_LoRa_0_8K, Init_LoRa_4_8K , Init_LoRa_10k,
|
||||
// 返回参数 : tSX127xError 错误枚举内容
|
||||
// 说明 : 初始化时,信道初始化默认为0信道
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
tSX127xError SX127x_init()
|
||||
{
|
||||
if(false==LoRaConfig_Check()) //如果输入参数错误
|
||||
{
|
||||
return PARAMETER_INVALID; //报错输入
|
||||
}
|
||||
SX1276InitIo(); // PAIO口初始化
|
||||
SX1276Reset(); //复位RF
|
||||
SX1276SPISetup(); //SPI初始化
|
||||
|
||||
//切换到LoRamode,standby状态
|
||||
SX1276Write( REG_LR_OPMODE, RFLR_OPMODE_SLEEP );
|
||||
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_SLEEP );
|
||||
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY );
|
||||
|
||||
/*------------------------------------------------
|
||||
SPI 验证 */
|
||||
uint8_t test = 0;
|
||||
SX1276Write( REG_LR_HOPPERIOD,0x91 );//选一个用不到的寄存器来做验证
|
||||
SX1276Read( REG_LR_HOPPERIOD,&test);
|
||||
if(test!=0x91)
|
||||
return SPI_READCHECK_WRONG;
|
||||
SX1276Write( REG_LR_DIOMAPPING2, RFLR_DIOMAPPING2_DIO4_01);
|
||||
//Frequency Configuration
|
||||
LSD_RF_FreqSet(); //设置频率
|
||||
|
||||
//PA Configuration
|
||||
LSD_RF_PoutSet();
|
||||
SX1276Write( REG_LR_PARAMP,RFLR_PARAMP_0100_US);
|
||||
// ↑PA Ramp的时间,如果用户LDO不能快速输出大电流(泵能力),适当增加PA Ramp时间
|
||||
// ↑如果Ramp时间过短超过了LDO的能力时,会出现进入TX后,系统电流为发射电流,但是RF信号不出现的现象
|
||||
SX1276Write( REG_LR_OCP,0x20|RFLR_OCP_TRIM_240_MA);//电流过载保护 Over Current Protection
|
||||
|
||||
//PayloadLength 初始化
|
||||
SX1276Write( REG_LR_PAYLOADLENGTH,G_LoRaConfig.PayloadLength);
|
||||
//注意,无头模式(Implicit Header)时,必须提前规定好收发双方的PL
|
||||
|
||||
//BW、CR、Header有无,初始化
|
||||
SX1276Write( REG_LR_MODEMCONFIG1,\
|
||||
(((uint8_t)G_LoRaConfig.BandWidth)|((uint8_t)G_LoRaConfig.CodingRate))|(\
|
||||
(true==G_LoRaConfig.ExplicitHeaderOn)?0x00:0x01));
|
||||
|
||||
//SF、CRC初始化
|
||||
SX1276Write( REG_LR_MODEMCONFIG2,\
|
||||
((uint8_t)G_LoRaConfig.SpreadingFactor)|(\
|
||||
(true==G_LoRaConfig.CRCON)?0x04:0x00));
|
||||
if(SF06==G_LoRaConfig.SpreadingFactor){ //慎用SF = 6,需要的配置很特殊
|
||||
uint8_t temp = 0;
|
||||
SX1276Read( 0x31,&temp);
|
||||
SX1276Write( 0x31,(temp& 0xF8)|0x05);
|
||||
SX1276Write( 0x37,0x0C);
|
||||
}
|
||||
|
||||
//低速率优化功能是否开启、AutoAGC默认开启
|
||||
SX1276Write( REG_LR_MODEMCONFIG3,((G_TsXms>16.0)?\
|
||||
RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON:RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF\
|
||||
)|RFLR_MODEMCONFIG3_AGCAUTO_ON);
|
||||
return NORMAL;
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF发送数据包
|
||||
// 输入参数 : uint8_t*data:发送数据指针
|
||||
// 返回参数 : 无
|
||||
// 说明 : 设置为发送是, preamble改回默认值
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276_TxPacket(uint8_t*data)
|
||||
{
|
||||
|
||||
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY );
|
||||
SX1276Write( REG_LR_PREAMBLEMSB,0);
|
||||
SX1276Write( REG_LR_PREAMBLELSB,10);
|
||||
SX1276Write( REG_LR_PAYLOADLENGTH,G_LoRaConfig.PayloadLength);
|
||||
SX1276WriteRxTx(true);
|
||||
SX1276Write( REG_LR_FIFOADDRPTR,0x80);
|
||||
SX1276WriteBuffer(REG_LR_FIFO,data,G_LoRaConfig.PayloadLength);
|
||||
SX1276Write(REG_LR_IRQFLAGS,0xff);
|
||||
SX1276Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_TXDONE));
|
||||
SX1276Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_01 );
|
||||
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_TRANSMITTER );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF进入接收状态
|
||||
// 输入参数 :
|
||||
// 返回参数 : 无
|
||||
// 说明 : 进入接收后preamble设置回默认值为
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void Rx_mode()
|
||||
{
|
||||
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY );
|
||||
SX1276Write( REG_LR_PREAMBLEMSB,0);
|
||||
SX1276Write( REG_LR_PREAMBLELSB,10);
|
||||
SX1276Write( REG_LR_PAYLOADLENGTH,G_LoRaConfig.PayloadLength);
|
||||
SX1276Write( REG_LR_IRQFLAGSMASK, ~(RFLR_IRQFLAGS_RXDONE));
|
||||
SX1276Write( REG_LR_DIOMAPPING1, RFLR_DIOMAPPING1_DIO0_00 );
|
||||
SX1276WriteRxTx(false);
|
||||
SX1276Write( REG_LR_FIFOADDRPTR,0x00);
|
||||
SX1276Write(REG_LR_IRQFLAGS,0xff);
|
||||
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_RECEIVER );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF接收数据包
|
||||
// 输入参数 : uint8_t*cbuf接收数组指针
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void LSD_RF_RxPacket(uint8_t*cbuf)
|
||||
{
|
||||
if(true==G_LoRaConfig.ExplicitHeaderOn){
|
||||
//有头那么从寄存器中读,否则按照G_LoRaConfig设置长度读取FIFO
|
||||
SX1276Read(REG_LR_NBRXBYTES,&G_LoRaConfig.PayloadLength);
|
||||
SX1276Write( REG_LR_FIFOADDRPTR,0x00);
|
||||
}
|
||||
SX1276ReadFifo(cbuf,G_LoRaConfig.PayloadLength);
|
||||
SX1276Write(REG_LR_IRQFLAGS,0xff);
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF进入SLEEP状态
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void LSD_RF_SleepMode(void)
|
||||
{
|
||||
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY );
|
||||
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_SLEEP );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF进入standby状态
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void LSD_RF_StandbyMode(void)
|
||||
{
|
||||
SX1276Write( REG_LR_OPMODE, 0x80|RFLR_OPMODE_STANDBY );
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF配置频率
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
tSX127xError LSD_RF_FreqSet()
|
||||
{
|
||||
|
||||
if((G_LoRaConfig.LoRa_Freq>525000000)||(G_LoRaConfig.LoRa_Freq<137000000))
|
||||
return PARAMETER_INVALID;
|
||||
uint32_t freq_reg = (uint32_t)(G_LoRaConfig.LoRa_Freq/FREQ_STEP);
|
||||
uint8_t test_FRFMSB = 0,test_FRFMID=0,test_FRFLSB=0;
|
||||
LSD_RF_StandbyMode();
|
||||
// FREQ = 474.6MHz
|
||||
SX1276Write( REG_LR_FRFMSB, (uint8_t)(freq_reg>>16));//Carrier Freq 470M
|
||||
SX1276Write( REG_LR_FRFMID, (uint8_t)(freq_reg>>8) );
|
||||
SX1276Write( REG_LR_FRFLSB, (uint8_t)(freq_reg) );
|
||||
|
||||
SX1276Read(REG_LR_FRFMSB,&test_FRFMSB);
|
||||
SX1276Read(REG_LR_FRFMID,&test_FRFMID);
|
||||
SX1276Read(REG_LR_FRFLSB,&test_FRFLSB);
|
||||
|
||||
if(test_FRFMSB != (uint8_t)(freq_reg>>16))
|
||||
return SPI_READCHECK_WRONG;
|
||||
if(test_FRFMID != (uint8_t)(freq_reg>>8))
|
||||
return SPI_READCHECK_WRONG;
|
||||
if(test_FRFLSB != (uint8_t)(freq_reg))
|
||||
return SPI_READCHECK_WRONG;
|
||||
return NORMAL;
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF配置功率
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
tSX127xError LSD_RF_PoutSet()
|
||||
{
|
||||
if(G_LoRaConfig.PowerCfig>15)
|
||||
return PARAMETER_INVALID;
|
||||
LSD_RF_StandbyMode();
|
||||
SX1276Write( REG_LR_PACONFIG, 0xf0|G_LoRaConfig.PowerCfig);
|
||||
uint8_t test = 0;
|
||||
SX1276Read(REG_LR_PACONFIG,&test);
|
||||
if((0xf0|G_LoRaConfig.PowerCfig)!=test)
|
||||
return SPI_READCHECK_WRONG;
|
||||
if(true==G_LoRaConfig.MaxPowerOn)
|
||||
SX1276Write( REG_LR_PADAC, 0x80|RFLR_PADAC_20DBM_ON );
|
||||
else
|
||||
SX1276Write( REG_LR_PADAC, 0x80|RFLR_PADAC_20DBM_OFF );
|
||||
return NORMAL;
|
||||
}
|
||||
|
|
@ -0,0 +1,133 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 版权: 利尔达科技集团股份有限公司
|
||||
// 文件名:
|
||||
// 版本: v1.0
|
||||
// 工作环境: IAR v5.30
|
||||
// 作者: 佟亚波、于海波
|
||||
// 生成日期: 2013.12
|
||||
// 功能: API
|
||||
// 相关文件:
|
||||
// 修改日志:
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef LSD_RF_SX1276_H
|
||||
#define LSD_RF_SX1276_H
|
||||
//===================================定义===================================================
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NORMAL, //正常
|
||||
PARAMETER_INVALID, //参数不可用
|
||||
SPI_READCHECK_WRONG, //SPI出错
|
||||
}tSX127xError; //定义出错枚举
|
||||
|
||||
typedef enum
|
||||
{
|
||||
// LORA [0: 7.8 kHz, 1: 10.4 kHz, 2: 15.6 kHz, 3: 20.8 kHz, 4: 31.2 kHz,
|
||||
// 5: 41.6 kHz, 6: 62.5 kHz, 7: 125 kHz, 8: 250 kHz, 9: 500 kHz, other: Reserved]
|
||||
BW500KHZ = 0x90,
|
||||
BW250KHZ = 0x80,
|
||||
BW125KHZ = 0x70,
|
||||
BW62_50KHZ = 0x60,
|
||||
BW41_66KHZ = 0x50,
|
||||
BW31_25KHZ = 0x40,
|
||||
BW20_83KHZ = 0x30,
|
||||
BW15_62KHZ = 0x20,
|
||||
BW10_41KHZ = 0x10,
|
||||
BW7_81KHZ = 0x00,
|
||||
}t_BandWidth; //定义带宽枚举
|
||||
typedef enum{
|
||||
// LORA [6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048, 12: 4096 chips]
|
||||
SF12 = 0xC0,
|
||||
SF11 = 0xB0,
|
||||
SF10 = 0xA0,
|
||||
SF09 = 0x90,
|
||||
SF08 = 0x80,
|
||||
SF07 = 0x70,
|
||||
SF06 = 0x60,
|
||||
}t_SpreadingFactor;
|
||||
typedef enum{
|
||||
// LORA [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
|
||||
CR_4_8 = 0x08,
|
||||
CR_4_7 = 0x06,
|
||||
CR_4_6 = 0x04,
|
||||
CR_4_5 = 0x02,
|
||||
}t_CodingRate;
|
||||
typedef struct S_LoRaConfig
|
||||
{
|
||||
uint32_t LoRa_Freq;
|
||||
t_BandWidth BandWidth;
|
||||
t_SpreadingFactor SpreadingFactor;
|
||||
t_CodingRate CodingRate;
|
||||
int8_t PowerCfig; //0~15,输出功率 = 2+PowerReg,具体参考数据手册
|
||||
//如果开启MaxPower,PowerReg = 15时,输出功率 = 19±1dBm
|
||||
bool MaxPowerOn; // [false: OFF, true: ON]
|
||||
bool CRCON; // [false: OFF, true: ON]
|
||||
bool ExplicitHeaderOn; // [false: OFF, true: ON]
|
||||
uint8_t PayloadLength; //1~127
|
||||
}S_LoRaConfig;
|
||||
|
||||
extern S_LoRaConfig G_LoRaConfig;
|
||||
extern float G_BandWidthKHz;//计算Symbol周期使用
|
||||
extern float G_TsXms;//Symbol周期,单位ms
|
||||
|
||||
//===================================函数声明===================================================
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF初始化
|
||||
// 输入参数 :
|
||||
// 返回参数 : tSX127xError 错误枚举内容
|
||||
// 说明 : 初始化时,调用全局变量G_LoRaConfig
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
tSX127xError SX127x_init();
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF发送数据包
|
||||
// 输入参数 : uint8_t*data:发送数据指针,uint8_t size发送数据长度
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void SX1276_TxPacket(uint8_t*data);
|
||||
void SX1276_Process(void);
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF进入接收状态
|
||||
// 输入参数 :
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void Rx_mode(void);
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF接收可变数据包
|
||||
// 输入参数 : uint8_t*cbuf接收数组指针
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void LSD_RF_RxPacket(uint8_t*cbuf);
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF进入SLEEP状态
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void LSD_RF_SleepMode(void);
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF进入standby状态
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void LSD_RF_StandbyMode(void);
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF设置频率
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
tSX127xError LSD_RF_FreqSet();
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : RF设置功率
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
tSX127xError LSD_RF_PoutSet();
|
||||
//*****************************************************************************************
|
||||
#endif
|
||||
|
|
@ -0,0 +1,262 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 版权: 利尔达科技集团股份有限公司
|
||||
// 文件名: main_tx/rx
|
||||
// 版本: v1.0
|
||||
// 工作环境: IAR v5.30
|
||||
// 作者: 于海波
|
||||
// 生成日期: 2013.12
|
||||
// 功能: A发送包书记给B,黄灯闪烁,B模块接到数据红灯闪烁,B将数据回传给A模块,
|
||||
// A接到数据后红灯闪烁, 循环次操作,
|
||||
// 相关文件:
|
||||
// 修改日志:
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "driver.h"
|
||||
#include "sx1276-f4152-Hal.h"
|
||||
#include "LSD_RF_SX1276.h"
|
||||
#include "LSD_RF_APPrf.h"
|
||||
#include "clock.h"
|
||||
//===================================定义变量===================================================
|
||||
long SysTick = 0;
|
||||
uint8_t TXbuffer[30]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29};
|
||||
uint8_t WakeAddr[8]={5,6,7,8,9,10,11,7};
|
||||
uint8_t Rxbuffer[64];
|
||||
//===================================函数声明===================================================
|
||||
|
||||
//===============================================================================================
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 主函数
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
typedef enum{
|
||||
Nope,
|
||||
B300bps,//BW = 500KHz SF = 7 CR = 4_6
|
||||
B1080bps,//BW = 125KHz SF = 9 CR = 4_6
|
||||
B4000bps,//BW = 125KHz SF = 7 CR = 4_5
|
||||
}t_Baudrate;
|
||||
t_Baudrate Baudrate = Nope;
|
||||
|
||||
unsigned char *point;
|
||||
unsigned char Reg_PKTSNR = 0;
|
||||
unsigned char Reg_PKTRssi = 0;
|
||||
unsigned char Reg_Rssi = 0;
|
||||
|
||||
unsigned char LCD_p[9] = {0,0,0,0,0,8,0,1,0xff};
|
||||
int T_Cnt = 0;
|
||||
int R_Cnt = 0;
|
||||
bool RESET_Flag = false;
|
||||
void main( void )
|
||||
{
|
||||
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
|
||||
platform_init(); //测试底板初始化
|
||||
LEDONBAND(LEDALL); //初始化过程点亮所有LED灯
|
||||
KEYBOARD_DIR &=~ (KEY_S1+KEY_S2);
|
||||
KEYBOARD_IFG &=~ (KEY_S1+KEY_S2);
|
||||
KEYBOARD_IES |= (KEY_S1+KEY_S2);
|
||||
KEYBOARD_IE |= (KEY_S1+KEY_S2);
|
||||
|
||||
point = (unsigned char *)(&(G_LoRaConfig.BandWidth));
|
||||
flash_read(FLASH_ADDRESS_D,point,3*2);
|
||||
if(G_LoRaConfig.BandWidth>BW500KHZ){
|
||||
G_LoRaConfig.BandWidth=BW125KHZ;
|
||||
G_LoRaConfig.SpreadingFactor = SF09;
|
||||
G_LoRaConfig.CodingRate = CR_4_6;
|
||||
flash_seg_clear(FLASH_ADDRESS_D);//写之前必清除
|
||||
flash_write(FLASH_ADDRESS_D,point,3*2);
|
||||
}
|
||||
if(G_LoRaConfig.SpreadingFactor==SF11){
|
||||
Baudrate = B300bps;
|
||||
LCD_p[8] = 1;
|
||||
}
|
||||
else{
|
||||
if(G_LoRaConfig.SpreadingFactor==SF07){
|
||||
Baudrate = B4000bps;
|
||||
LCD_p[8] = 3;
|
||||
}
|
||||
else{
|
||||
Baudrate = B1080bps;
|
||||
LCD_p[8] = 2;
|
||||
}
|
||||
}
|
||||
LCD_p[7] = 0xff;LCD_p[6] = 0;LCD_p[5] = 0;LCD_p[4] = 0;
|
||||
lcd_init();
|
||||
LCD_Disp_ALL_Num(LCD_p);
|
||||
//配置各个参数
|
||||
G_LoRaConfig.LoRa_Freq = 474600000; //中心频点470MHz
|
||||
//G_LoRaConfig.BandWidth = BW125KHZ; //BW = 125KHz
|
||||
//G_LoRaConfig.SpreadingFactor = SF09; //SF = 9
|
||||
//G_LoRaConfig.CodingRate = CR_4_6; //CR = 4/6
|
||||
G_LoRaConfig.PowerCfig = 15; //19±dBm
|
||||
G_LoRaConfig.MaxPowerOn = true;
|
||||
G_LoRaConfig.CRCON = true; //CRC开启
|
||||
G_LoRaConfig.ExplicitHeaderOn = true; //Header开启
|
||||
G_LoRaConfig.PayloadLength = 20; //数据包长度
|
||||
|
||||
if(SX127x_init()!=NORMAL) WDTCTL=0; //无线模块初始化失败复位
|
||||
KEYBOARD_IE |= (KEY_S1+KEY_S2);
|
||||
_EINT(); //开总中断
|
||||
LEDOFFBIT(LEDALL); //初始化完毕关闭所有LED灯
|
||||
ON_Timerout(); //开启定时器,1s一发数据
|
||||
while(1)
|
||||
{
|
||||
LPM3;
|
||||
if(RESET_Flag==true){
|
||||
flash_seg_clear(FLASH_ADDRESS_D);//写之前必清除
|
||||
flash_write(FLASH_ADDRESS_D,point,3*2);
|
||||
WDTCTL = 0;//RESET
|
||||
}
|
||||
|
||||
LSD_RF_RXmode(); //每次发送一包数据后,进入接收状态,等待B模块应答
|
||||
/****RSSI*****/
|
||||
|
||||
//中断中已经算过符号
|
||||
LCD_p[6] = Reg_PKTRssi/100%10;
|
||||
LCD_p[5] = Reg_PKTRssi/10%10;
|
||||
LCD_p[4] = Reg_PKTRssi%10;
|
||||
|
||||
LCD_p[0] = T_Cnt%10;
|
||||
LCD_p[1] = T_Cnt/10%10;
|
||||
LCD_p[2] = R_Cnt%10;
|
||||
LCD_p[3] = R_Cnt/10%10;
|
||||
/****Cnt *****/
|
||||
//LCD_p[0] = T_Cnt%10;
|
||||
//LCD_p[1] = T_Cnt/10%10;
|
||||
//LCD_p[2] = R_Cnt%10;
|
||||
//LCD_p[3] = R_Cnt/10%10;
|
||||
LCD_ClrLcd_ALL();
|
||||
LCD_Disp_ALL_Num(LCD_p);
|
||||
if(T_Cnt>=100)
|
||||
T_Cnt = 0;
|
||||
if(R_Cnt>=100)
|
||||
R_Cnt = 0;
|
||||
}
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 无线接收数据中断入口
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 :
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma vector = PORT1_VECTOR
|
||||
__interrupt void port1_isr(void)
|
||||
{
|
||||
if(KEYBOARD_IFG&(KEY_ALL)){
|
||||
char Keys_Flag = KEYBOARD_IFG&(KEY_ALL);
|
||||
switch(Keys_Flag&(KEY_S1|KEY_S2)){
|
||||
case KEY_S1:
|
||||
switch(Baudrate){
|
||||
case B1080bps:
|
||||
G_LoRaConfig.BandWidth = BW125KHZ; //BW = 125KHz
|
||||
G_LoRaConfig.SpreadingFactor = SF07; //SF = 9
|
||||
G_LoRaConfig.CodingRate = CR_4_6; //CR = 4/6
|
||||
Baudrate = B4000bps;
|
||||
break;
|
||||
case B4000bps:
|
||||
G_LoRaConfig.BandWidth = BW125KHZ; //BW = 125KHz
|
||||
G_LoRaConfig.SpreadingFactor = SF11; //SF = 9
|
||||
G_LoRaConfig.CodingRate = CR_4_8; //CR = 4/6
|
||||
Baudrate = B300bps;
|
||||
break;
|
||||
case B300bps:
|
||||
default:
|
||||
G_LoRaConfig.BandWidth = BW125KHZ; //BW = 125KHz
|
||||
G_LoRaConfig.SpreadingFactor = SF09; //SF = 9
|
||||
G_LoRaConfig.CodingRate = CR_4_6; //CR = 4/6
|
||||
Baudrate = B1080bps;
|
||||
break;
|
||||
}
|
||||
RESET_Flag = true;
|
||||
LPM3_EXIT;
|
||||
break;
|
||||
case KEY_S2:
|
||||
T_Cnt = 0;
|
||||
R_Cnt = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
KEYBOARD_IFG &= ~KEY_ALL;
|
||||
return;
|
||||
}
|
||||
if(DIO0_IFG) //判断是否是DIO0引起的中断
|
||||
{
|
||||
DIO0_IFG = 0; //清除DIO0中断标志位
|
||||
|
||||
LSD_RF_RxPacket(Rxbuffer); //接收数据包
|
||||
#include "sx1276-LoRa.h"
|
||||
signed int temp = 0,test;
|
||||
SX1276Read( REG_LR_PKTSNRVALUE,&Reg_PKTSNR);
|
||||
test = (signed char)Reg_PKTSNR;
|
||||
if((Reg_PKTSNR&0x80)!=0){//负数
|
||||
//LCD_p[3] = 10;//Reg_PKTSNR
|
||||
Reg_PKTSNR = ~(Reg_PKTSNR)+1;
|
||||
temp = -Reg_PKTSNR;
|
||||
}
|
||||
else{
|
||||
//LCD_p[3] = 0xff;//Reg_PKTSNR
|
||||
temp = Reg_PKTSNR;
|
||||
}
|
||||
test++;
|
||||
SX1276Read( REG_LR_PKTRSSIVALUE,&Reg_PKTRssi);
|
||||
if(temp>0){
|
||||
temp = -164+Reg_PKTRssi*16/15;
|
||||
//if(temp>-50)
|
||||
//temp = -137+Reg_PKTRssi;
|
||||
}
|
||||
else{
|
||||
temp = -164+Reg_PKTRssi+(signed char)(temp*0.25+0.5);
|
||||
}
|
||||
if(temp<0){
|
||||
LCD_p[7] = 10;
|
||||
Reg_PKTRssi = -temp;
|
||||
}
|
||||
else{
|
||||
LCD_p[7] = 0xff;
|
||||
Reg_PKTRssi = temp;
|
||||
}
|
||||
//SX1276Read( REG_LR_RSSIVALUE,&Reg_Rssi);
|
||||
//Reg_Rssi
|
||||
if(memcmp(Rxbuffer,TXbuffer,20)==0)
|
||||
{
|
||||
LEDONBIT(LED1); //状态指示灯
|
||||
DelayMs(60);
|
||||
LEDOFFBIT(LED1); //状态指示灯
|
||||
R_Cnt++;
|
||||
}
|
||||
LPM3_EXIT;
|
||||
}
|
||||
P1IFG=0;
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// 功能描述 : 超时定时器
|
||||
// 输入参数 : 无
|
||||
// 返回参数 : 无
|
||||
// 说明 : 用于误唤醒,或唤醒失败后超时时间到后重新进入WOR
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma vector = TIMER1_A0_VECTOR
|
||||
__interrupt void Timer1_A0_ISR()
|
||||
{
|
||||
static uint8 t=0;
|
||||
t++;
|
||||
if(Baudrate >= B1080bps)
|
||||
t = 5;
|
||||
if(Baudrate == B300bps)
|
||||
t++;
|
||||
if(t >= 5)
|
||||
{
|
||||
LEDONBIT(LED3);//发送状态指示灯
|
||||
G_LoRaConfig.PayloadLength = 20;
|
||||
SX1276Reset();
|
||||
if(SX127x_init()!=NORMAL) WDTCTL=0;
|
||||
LSD_RF_SendPacket(TXbuffer);//发送30个字节数据测试
|
||||
T_Cnt++;
|
||||
LEDOFFBIT(LED3);//发送状态指示灯
|
||||
LPM3_EXIT;
|
||||
t = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,880 @@
|
|||
|
||||
#ifndef __SX1276_LORA_H__
|
||||
#define __SX1276_LORA_H__
|
||||
|
||||
/*!
|
||||
* SX1276 LoRa General parameters definition
|
||||
*/
|
||||
typedef struct sLoRaSettings
|
||||
{
|
||||
uint32_t RFFrequency;
|
||||
int8_t Power;
|
||||
uint8_t SignalBw; // LORA [0: 7.8 kHz, 1: 10.4 kHz, 2: 15.6 kHz, 3: 20.8 kHz, 4: 31.2 kHz,
|
||||
// 5: 41.6 kHz, 6: 62.5 kHz, 7: 125 kHz, 8: 250 kHz, 9: 500 kHz, other: Reserved]
|
||||
uint8_t SpreadingFactor; // LORA [6: 64, 7: 128, 8: 256, 9: 512, 10: 1024, 11: 2048, 12: 4096 chips]
|
||||
uint8_t ErrorCoding; // LORA [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
|
||||
bool CrcOn; // [0: OFF, 1: ON]
|
||||
bool ImplicitHeaderOn; // [0: OFF, 1: ON]
|
||||
bool RxSingleOn; // [0: Continuous, 1 Single]
|
||||
bool FreqHopOn; // [0: OFF, 1: ON]
|
||||
uint8_t HopPeriod; // Hops every frequency hopping period symbols
|
||||
uint32_t TxPacketTimeout;
|
||||
uint32_t RxPacketTimeout;
|
||||
uint8_t PayloadLength;
|
||||
}tLoRaSettings;
|
||||
|
||||
/*!
|
||||
* RF packet definition
|
||||
*/
|
||||
#define RF_BUFFER_SIZE_MAX 128
|
||||
#define RF_BUFFER_SIZE 80
|
||||
|
||||
/*!
|
||||
* RF state machine
|
||||
*/
|
||||
//LoRa
|
||||
typedef enum
|
||||
{
|
||||
RFLR_STATE_IDLE,
|
||||
RFLR_STATE_RX_INIT,
|
||||
RFLR_STATE_RX_RUNNING,
|
||||
RFLR_STATE_RX_DONE,
|
||||
RFLR_STATE_RX_TIMEOUT,
|
||||
RFLR_STATE_TX_INIT,
|
||||
RFLR_STATE_TX_RUNNING,
|
||||
RFLR_STATE_TX_DONE,
|
||||
RFLR_STATE_TX_TIMEOUT,
|
||||
RFLR_STATE_CAD_INIT,
|
||||
RFLR_STATE_CAD_RUNNING,
|
||||
}tRFLRStates;
|
||||
|
||||
/*!
|
||||
* SX1276 definitions
|
||||
*/
|
||||
#define XTAL_FREQ 32000000
|
||||
#define FREQ_STEP 61.03515625
|
||||
|
||||
/*!
|
||||
* SX1276 Internal registers Address
|
||||
*/
|
||||
#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
|
||||
// end of documented register in datasheet
|
||||
// I/O settings
|
||||
#define REG_LR_DIOMAPPING1 0x40
|
||||
#define REG_LR_DIOMAPPING2 0x41
|
||||
// Version
|
||||
#define REG_LR_VERSION 0x42
|
||||
// Additional settings
|
||||
#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
|
||||
|
||||
|
||||
/*!
|
||||
* SX1276 LoRa bit control definition
|
||||
*/
|
||||
|
||||
/*!
|
||||
* RegFifo
|
||||
*/
|
||||
|
||||
/*!
|
||||
* RegOpMode
|
||||
*/
|
||||
#define RFLR_OPMODE_LONGRANGEMODE_MASK 0x7F
|
||||
#define RFLR_OPMODE_LONGRANGEMODE_OFF 0x00 // Default
|
||||
#define RFLR_OPMODE_LONGRANGEMODE_ON 0x80
|
||||
|
||||
#define RFLR_OPMODE_ACCESSSHAREDREG_MASK 0xBF
|
||||
#define RFLR_OPMODE_ACCESSSHAREDREG_ENABLE 0x40
|
||||
#define RFLR_OPMODE_ACCESSSHAREDREG_DISABLE 0x00 // Default
|
||||
|
||||
#define RFLR_OPMODE_FREQMODE_ACCESS_MASK 0xF7
|
||||
#define RFLR_OPMODE_FREQMODE_ACCESS_LF 0x08 // Default
|
||||
#define RFLR_OPMODE_FREQMODE_ACCESS_HF 0x00
|
||||
|
||||
#define RFLR_OPMODE_MASK 0xF8
|
||||
#define RFLR_OPMODE_SLEEP 0x00
|
||||
#define RFLR_OPMODE_STANDBY 0x01 // Default
|
||||
#define RFLR_OPMODE_SYNTHESIZER_TX 0x02
|
||||
#define RFLR_OPMODE_TRANSMITTER 0x03
|
||||
#define RFLR_OPMODE_SYNTHESIZER_RX 0x04
|
||||
#define RFLR_OPMODE_RECEIVER 0x05
|
||||
// LoRa specific modes
|
||||
#define RFLR_OPMODE_RECEIVER_SINGLE 0x06
|
||||
#define RFLR_OPMODE_CAD 0x07
|
||||
|
||||
/*!
|
||||
* RegBandSetting
|
||||
*/
|
||||
#define RFLR_BANDSETTING_MASK 0x3F
|
||||
#define RFLR_BANDSETTING_AUTO 0x00 // Default
|
||||
#define RFLR_BANDSETTING_DIV_BY_1 0x40
|
||||
#define RFLR_BANDSETTING_DIV_BY_2 0x80
|
||||
#define RFLR_BANDSETTING_DIV_BY_6 0xC0
|
||||
|
||||
/*!
|
||||
* RegFrf (MHz)
|
||||
*/
|
||||
|
||||
#define RFLR_FRFMSB_434_MHZ 0x6C // Default
|
||||
#define RFLR_FRFMID_434_MHZ 0x80 // Default
|
||||
#define RFLR_FRFLSB_434_MHZ 0x00 // Default
|
||||
#define RFLR_FRFMSB_470_MHZ 0x75
|
||||
#define RFLR_FRFMID_470_MHZ 0x80
|
||||
#define RFLR_FRFLSB_470_MHZ 0x00
|
||||
#define RFLR_FRFMSB_475_MHZ 0x76
|
||||
#define RFLR_FRFMID_475_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_475_MHZ 0x00
|
||||
|
||||
#define RFLR_FRFMSB_863_MHZ 0xD7
|
||||
#define RFLR_FRFMID_863_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_863_MHZ 0x00
|
||||
#define RFLR_FRFMSB_864_MHZ 0xD8
|
||||
#define RFLR_FRFMID_864_MHZ 0x00
|
||||
#define RFLR_FRFLSB_864_MHZ 0x00
|
||||
#define RFLR_FRFMSB_865_MHZ 0xD8
|
||||
#define RFLR_FRFMID_865_MHZ 0x40
|
||||
#define RFLR_FRFLSB_865_MHZ 0x00
|
||||
#define RFLR_FRFMSB_866_MHZ 0xD8
|
||||
#define RFLR_FRFMID_866_MHZ 0x80
|
||||
#define RFLR_FRFLSB_866_MHZ 0x00
|
||||
#define RFLR_FRFMSB_867_MHZ 0xD8
|
||||
#define RFLR_FRFMID_867_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_867_MHZ 0x00
|
||||
#define RFLR_FRFMSB_868_MHZ 0xD9
|
||||
#define RFLR_FRFMID_868_MHZ 0x00
|
||||
#define RFLR_FRFLSB_868_MHZ 0x00
|
||||
#define RFLR_FRFMSB_869_MHZ 0xD9
|
||||
#define RFLR_FRFMID_869_MHZ 0x40
|
||||
#define RFLR_FRFLSB_869_MHZ 0x00
|
||||
#define RFLR_FRFMSB_870_MHZ 0xD9
|
||||
#define RFLR_FRFMID_870_MHZ 0x80
|
||||
#define RFLR_FRFLSB_870_MHZ 0x00
|
||||
|
||||
#define RFLR_FRFMSB_902_MHZ 0xE1
|
||||
#define RFLR_FRFMID_902_MHZ 0x80
|
||||
#define RFLR_FRFLSB_902_MHZ 0x00
|
||||
#define RFLR_FRFMSB_903_MHZ 0xE1
|
||||
#define RFLR_FRFMID_903_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_903_MHZ 0x00
|
||||
#define RFLR_FRFMSB_904_MHZ 0xE2
|
||||
#define RFLR_FRFMID_904_MHZ 0x00
|
||||
#define RFLR_FRFLSB_904_MHZ 0x00
|
||||
#define RFLR_FRFMSB_905_MHZ 0xE2
|
||||
#define RFLR_FRFMID_905_MHZ 0x40
|
||||
#define RFLR_FRFLSB_905_MHZ 0x00
|
||||
#define RFLR_FRFMSB_906_MHZ 0xE2
|
||||
#define RFLR_FRFMID_906_MHZ 0x80
|
||||
#define RFLR_FRFLSB_906_MHZ 0x00
|
||||
#define RFLR_FRFMSB_907_MHZ 0xE2
|
||||
#define RFLR_FRFMID_907_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_907_MHZ 0x00
|
||||
#define RFLR_FRFMSB_908_MHZ 0xE3
|
||||
#define RFLR_FRFMID_908_MHZ 0x00
|
||||
#define RFLR_FRFLSB_908_MHZ 0x00
|
||||
#define RFLR_FRFMSB_909_MHZ 0xE3
|
||||
#define RFLR_FRFMID_909_MHZ 0x40
|
||||
#define RFLR_FRFLSB_909_MHZ 0x00
|
||||
#define RFLR_FRFMSB_910_MHZ 0xE3
|
||||
#define RFLR_FRFMID_910_MHZ 0x80
|
||||
#define RFLR_FRFLSB_910_MHZ 0x00
|
||||
#define RFLR_FRFMSB_911_MHZ 0xE3
|
||||
#define RFLR_FRFMID_911_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_911_MHZ 0x00
|
||||
#define RFLR_FRFMSB_912_MHZ 0xE4
|
||||
#define RFLR_FRFMID_912_MHZ 0x00
|
||||
#define RFLR_FRFLSB_912_MHZ 0x00
|
||||
#define RFLR_FRFMSB_913_MHZ 0xE4
|
||||
#define RFLR_FRFMID_913_MHZ 0x40
|
||||
#define RFLR_FRFLSB_913_MHZ 0x00
|
||||
#define RFLR_FRFMSB_914_MHZ 0xE4
|
||||
#define RFLR_FRFMID_914_MHZ 0x80
|
||||
#define RFLR_FRFLSB_914_MHZ 0x00
|
||||
#define RFLR_FRFMSB_915_MHZ 0xE4 // Default
|
||||
#define RFLR_FRFMID_915_MHZ 0xC0 // Default
|
||||
#define RFLR_FRFLSB_915_MHZ 0x00 // Default
|
||||
#define RFLR_FRFMSB_916_MHZ 0xE5
|
||||
#define RFLR_FRFMID_916_MHZ 0x00
|
||||
#define RFLR_FRFLSB_916_MHZ 0x00
|
||||
#define RFLR_FRFMSB_917_MHZ 0xE5
|
||||
#define RFLR_FRFMID_917_MHZ 0x40
|
||||
#define RFLR_FRFLSB_917_MHZ 0x00
|
||||
#define RFLR_FRFMSB_918_MHZ 0xE5
|
||||
#define RFLR_FRFMID_918_MHZ 0x80
|
||||
#define RFLR_FRFLSB_918_MHZ 0x00
|
||||
#define RFLR_FRFMSB_919_MHZ 0xE5
|
||||
#define RFLR_FRFMID_919_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_919_MHZ 0x00
|
||||
#define RFLR_FRFMSB_920_MHZ 0xE6
|
||||
#define RFLR_FRFMID_920_MHZ 0x00
|
||||
#define RFLR_FRFLSB_920_MHZ 0x00
|
||||
#define RFLR_FRFMSB_921_MHZ 0xE6
|
||||
#define RFLR_FRFMID_921_MHZ 0x40
|
||||
#define RFLR_FRFLSB_921_MHZ 0x00
|
||||
#define RFLR_FRFMSB_922_MHZ 0xE6
|
||||
#define RFLR_FRFMID_922_MHZ 0x80
|
||||
#define RFLR_FRFLSB_922_MHZ 0x00
|
||||
#define RFLR_FRFMSB_923_MHZ 0xE6
|
||||
#define RFLR_FRFMID_923_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_923_MHZ 0x00
|
||||
#define RFLR_FRFMSB_924_MHZ 0xE7
|
||||
#define RFLR_FRFMID_924_MHZ 0x00
|
||||
#define RFLR_FRFLSB_924_MHZ 0x00
|
||||
#define RFLR_FRFMSB_925_MHZ 0xE7
|
||||
#define RFLR_FRFMID_925_MHZ 0x40
|
||||
#define RFLR_FRFLSB_925_MHZ 0x00
|
||||
#define RFLR_FRFMSB_926_MHZ 0xE7
|
||||
#define RFLR_FRFMID_926_MHZ 0x80
|
||||
#define RFLR_FRFLSB_926_MHZ 0x00
|
||||
#define RFLR_FRFMSB_927_MHZ 0xE7
|
||||
#define RFLR_FRFMID_927_MHZ 0xC0
|
||||
#define RFLR_FRFLSB_927_MHZ 0x00
|
||||
#define RFLR_FRFMSB_928_MHZ 0xE8
|
||||
#define RFLR_FRFMID_928_MHZ 0x00
|
||||
#define RFLR_FRFLSB_928_MHZ 0x00
|
||||
|
||||
/*!
|
||||
* RegPaConfig
|
||||
*/
|
||||
#define RFLR_PACONFIG_PASELECT_MASK 0x7F
|
||||
#define RFLR_PACONFIG_PASELECT_PABOOST 0x80
|
||||
#define RFLR_PACONFIG_PASELECT_RFO 0x00 // Default
|
||||
|
||||
#define RFLR_PACONFIG_MAX_POWER_MASK 0x8F
|
||||
|
||||
#define RFLR_PACONFIG_OUTPUTPOWER_MASK 0xF0
|
||||
|
||||
/*!
|
||||
* RegPaRamp
|
||||
*/
|
||||
#define RFLR_PARAMP_TXBANDFORCE_MASK 0xEF
|
||||
#define RFLR_PARAMP_TXBANDFORCE_BAND_SEL 0x10
|
||||
#define RFLR_PARAMP_TXBANDFORCE_AUTO 0x00 // Default
|
||||
|
||||
#define RFLR_PARAMP_MASK 0xF0
|
||||
#define RFLR_PARAMP_3400_US 0x00
|
||||
#define RFLR_PARAMP_2000_US 0x01
|
||||
#define RFLR_PARAMP_1000_US 0x02
|
||||
#define RFLR_PARAMP_0500_US 0x03
|
||||
#define RFLR_PARAMP_0250_US 0x04
|
||||
#define RFLR_PARAMP_0125_US 0x05
|
||||
#define RFLR_PARAMP_0100_US 0x06
|
||||
#define RFLR_PARAMP_0062_US 0x07
|
||||
#define RFLR_PARAMP_0050_US 0x08
|
||||
#define RFLR_PARAMP_0040_US 0x09 // Default
|
||||
#define RFLR_PARAMP_0031_US 0x0A
|
||||
#define RFLR_PARAMP_0025_US 0x0B
|
||||
#define RFLR_PARAMP_0020_US 0x0C
|
||||
#define RFLR_PARAMP_0015_US 0x0D
|
||||
#define RFLR_PARAMP_0012_US 0x0E
|
||||
#define RFLR_PARAMP_0010_US 0x0F
|
||||
|
||||
/*!
|
||||
* RegOcp
|
||||
*/
|
||||
#define RFLR_OCP_MASK 0xDF
|
||||
#define RFLR_OCP_ON 0x20 // Default
|
||||
#define RFLR_OCP_OFF 0x00
|
||||
|
||||
#define RFLR_OCP_TRIM_MASK 0xE0
|
||||
#define RFLR_OCP_TRIM_045_MA 0x00
|
||||
#define RFLR_OCP_TRIM_050_MA 0x01
|
||||
#define RFLR_OCP_TRIM_055_MA 0x02
|
||||
#define RFLR_OCP_TRIM_060_MA 0x03
|
||||
#define RFLR_OCP_TRIM_065_MA 0x04
|
||||
#define RFLR_OCP_TRIM_070_MA 0x05
|
||||
#define RFLR_OCP_TRIM_075_MA 0x06
|
||||
#define RFLR_OCP_TRIM_080_MA 0x07
|
||||
#define RFLR_OCP_TRIM_085_MA 0x08
|
||||
#define RFLR_OCP_TRIM_090_MA 0x09
|
||||
#define RFLR_OCP_TRIM_095_MA 0x0A
|
||||
#define RFLR_OCP_TRIM_100_MA 0x0B // Default
|
||||
#define RFLR_OCP_TRIM_105_MA 0x0C
|
||||
#define RFLR_OCP_TRIM_110_MA 0x0D
|
||||
#define RFLR_OCP_TRIM_115_MA 0x0E
|
||||
#define RFLR_OCP_TRIM_120_MA 0x0F
|
||||
#define RFLR_OCP_TRIM_130_MA 0x10
|
||||
#define RFLR_OCP_TRIM_140_MA 0x11
|
||||
#define RFLR_OCP_TRIM_150_MA 0x12
|
||||
#define RFLR_OCP_TRIM_160_MA 0x13
|
||||
#define RFLR_OCP_TRIM_170_MA 0x14
|
||||
#define RFLR_OCP_TRIM_180_MA 0x15
|
||||
#define RFLR_OCP_TRIM_190_MA 0x16
|
||||
#define RFLR_OCP_TRIM_200_MA 0x17
|
||||
#define RFLR_OCP_TRIM_210_MA 0x18
|
||||
#define RFLR_OCP_TRIM_220_MA 0x19
|
||||
#define RFLR_OCP_TRIM_230_MA 0x1A
|
||||
#define RFLR_OCP_TRIM_240_MA 0x1B
|
||||
|
||||
/*!
|
||||
* RegLna
|
||||
*/
|
||||
#define RFLR_LNA_GAIN_MASK 0x1F
|
||||
#define RFLR_LNA_GAIN_G1 0x20 // Default
|
||||
#define RFLR_LNA_GAIN_G2 0x40
|
||||
#define RFLR_LNA_GAIN_G3 0x60
|
||||
#define RFLR_LNA_GAIN_G4 0x80
|
||||
#define RFLR_LNA_GAIN_G5 0xA0
|
||||
#define RFLR_LNA_GAIN_G6 0xC0
|
||||
|
||||
#define RFLR_LNA_BOOST_LF_MASK 0xE7
|
||||
#define RFLR_LNA_BOOST_LF_DEFAULT 0x00 // Default
|
||||
#define RFLR_LNA_BOOST_LF_GAIN 0x08
|
||||
#define RFLR_LNA_BOOST_LF_IP3 0x10
|
||||
#define RFLR_LNA_BOOST_LF_BOOST 0x18
|
||||
|
||||
#define RFLR_LNA_RXBANDFORCE_MASK 0xFB
|
||||
#define RFLR_LNA_RXBANDFORCE_BAND_SEL 0x04
|
||||
#define RFLR_LNA_RXBANDFORCE_AUTO 0x00 // Default
|
||||
|
||||
#define RFLR_LNA_BOOST_HF_MASK 0xFC
|
||||
#define RFLR_LNA_BOOST_HF_OFF 0x00 // Default
|
||||
#define RFLR_LNA_BOOST_HF_ON 0x03
|
||||
|
||||
/*!
|
||||
* RegFifoAddrPtr
|
||||
*/
|
||||
#define RFLR_FIFOADDRPTR 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegFifoTxBaseAddr
|
||||
*/
|
||||
#define RFLR_FIFOTXBASEADDR 0x80 // Default
|
||||
|
||||
/*!
|
||||
* RegFifoTxBaseAddr
|
||||
*/
|
||||
#define RFLR_FIFORXBASEADDR 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegFifoRxCurrentAddr (Read Only)
|
||||
*/
|
||||
|
||||
/*!
|
||||
* RegIrqFlagsMask
|
||||
*/
|
||||
#define RFLR_IRQFLAGS_RXTIMEOUT_MASK 0x80
|
||||
#define RFLR_IRQFLAGS_RXDONE_MASK 0x40
|
||||
#define RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK 0x20
|
||||
#define RFLR_IRQFLAGS_VALIDHEADER_MASK 0x10
|
||||
#define RFLR_IRQFLAGS_TXDONE_MASK 0x08
|
||||
#define RFLR_IRQFLAGS_CADDONE_MASK 0x04
|
||||
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL_MASK 0x02
|
||||
#define RFLR_IRQFLAGS_CADDETECTED_MASK 0x01
|
||||
|
||||
/*!
|
||||
* RegIrqFlags
|
||||
*/
|
||||
#define RFLR_IRQFLAGS_RXTIMEOUT 0x80
|
||||
#define RFLR_IRQFLAGS_RXDONE 0x40
|
||||
#define RFLR_IRQFLAGS_PAYLOADCRCERROR 0x20
|
||||
#define RFLR_IRQFLAGS_VALIDHEADER 0x10
|
||||
#define RFLR_IRQFLAGS_TXDONE 0x08
|
||||
#define RFLR_IRQFLAGS_CADDONE 0x04
|
||||
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL 0x02
|
||||
#define RFLR_IRQFLAGS_CADDETECTED 0x01
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* RegFifoRxNbBytes (Read Only) //
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
* RegRxHeaderCntValueMsb (Read Only) //
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
* RegRxHeaderCntValueLsb (Read Only) //
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
* RegRxPacketCntValueMsb (Read Only) //
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
* RegRxPacketCntValueLsb (Read Only) //
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
* RegModemStat (Read Only) //
|
||||
*/
|
||||
#define RFLR_MODEMSTAT_RX_CR_MASK 0x1F
|
||||
#define RFLR_MODEMSTAT_MODEM_STATUS_MASK 0xE0
|
||||
|
||||
/*!
|
||||
* RegPktSnrValue (Read Only) //
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
* RegPktRssiValue (Read Only) //
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
* RegRssiValue (Read Only) //
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
* RegModemConfig1
|
||||
*/
|
||||
#define RFLR_MODEMCONFIG1_BW_MASK 0x0F
|
||||
|
||||
#define RFLR_MODEMCONFIG1_BW_7_81_KHZ 0x00
|
||||
#define RFLR_MODEMCONFIG1_BW_10_41_KHZ 0x10
|
||||
#define RFLR_MODEMCONFIG1_BW_15_62_KHZ 0x20
|
||||
#define RFLR_MODEMCONFIG1_BW_20_83_KHZ 0x30
|
||||
#define RFLR_MODEMCONFIG1_BW_31_25_KHZ 0x40
|
||||
#define RFLR_MODEMCONFIG1_BW_41_66_KHZ 0x50
|
||||
#define RFLR_MODEMCONFIG1_BW_62_50_KHZ 0x60
|
||||
#define RFLR_MODEMCONFIG1_BW_125_KHZ 0x70 // Default
|
||||
#define RFLR_MODEMCONFIG1_BW_250_KHZ 0x80
|
||||
#define RFLR_MODEMCONFIG1_BW_500_KHZ 0x90
|
||||
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_MASK 0xF1
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_5 0x02
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_6 0x04 // Default
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_7 0x06
|
||||
#define RFLR_MODEMCONFIG1_CODINGRATE_4_8 0x08
|
||||
|
||||
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK 0xFE
|
||||
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_ON 0x01
|
||||
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegModemConfig2
|
||||
*/
|
||||
#define RFLR_MODEMCONFIG2_SF_MASK 0x0F
|
||||
#define RFLR_MODEMCONFIG2_SF_6 0x60
|
||||
#define RFLR_MODEMCONFIG2_SF_7 0x70 // Default
|
||||
#define RFLR_MODEMCONFIG2_SF_8 0x80
|
||||
#define RFLR_MODEMCONFIG2_SF_9 0x90
|
||||
#define RFLR_MODEMCONFIG2_SF_10 0xA0
|
||||
#define RFLR_MODEMCONFIG2_SF_11 0xB0
|
||||
#define RFLR_MODEMCONFIG2_SF_12 0xC0
|
||||
|
||||
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_MASK 0xF7
|
||||
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_ON 0x08
|
||||
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_OFF 0x00
|
||||
|
||||
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK 0xFB
|
||||
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON 0x04
|
||||
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_OFF 0x00 // Default
|
||||
|
||||
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK 0xFC
|
||||
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB 0x00 // Default
|
||||
|
||||
|
||||
/*!
|
||||
* RegHopChannel (Read Only)
|
||||
*/
|
||||
#define RFLR_HOPCHANNEL_PLL_LOCK_TIMEOUT_MASK 0x7F
|
||||
#define RFLR_HOPCHANNEL_PLL_LOCK_FAIL 0x80
|
||||
#define RFLR_HOPCHANNEL_PLL_LOCK_SUCCEED 0x00 // Default
|
||||
|
||||
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_MASK 0xBF
|
||||
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_ON 0x40
|
||||
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_OFF 0x00 // Default
|
||||
|
||||
#define RFLR_HOPCHANNEL_CHANNEL_MASK 0x3F
|
||||
|
||||
|
||||
/*!
|
||||
* RegSymbTimeoutLsb
|
||||
*/
|
||||
#define RFLR_SYMBTIMEOUTLSB_SYMBTIMEOUT 0x64 // Default
|
||||
|
||||
/*!
|
||||
* RegPreambleLengthMsb
|
||||
*/
|
||||
#define RFLR_PREAMBLELENGTHMSB 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegPreambleLengthLsb
|
||||
*/
|
||||
#define RFLR_PREAMBLELENGTHLSB 0x08 // Default
|
||||
|
||||
/*!
|
||||
* RegPayloadLength
|
||||
*/
|
||||
#define RFLR_PAYLOADLENGTH 0x0E // Default
|
||||
|
||||
/*!
|
||||
* RegPayloadMaxLength
|
||||
*/
|
||||
#define RFLR_PAYLOADMAXLENGTH 0xFF // Default
|
||||
|
||||
/*!
|
||||
* RegHopPeriod
|
||||
*/
|
||||
#define RFLR_HOPPERIOD_FREQFOPPINGPERIOD 0x00 // Default
|
||||
|
||||
|
||||
/*!
|
||||
* RegDioMapping1
|
||||
*/
|
||||
#define RFLR_DIOMAPPING1_DIO0_MASK 0x3F
|
||||
#define RFLR_DIOMAPPING1_DIO0_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO0_01 0x40
|
||||
#define RFLR_DIOMAPPING1_DIO0_10 0x80
|
||||
#define RFLR_DIOMAPPING1_DIO0_11 0xC0
|
||||
|
||||
#define RFLR_DIOMAPPING1_DIO1_MASK 0xCF
|
||||
#define RFLR_DIOMAPPING1_DIO1_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO1_01 0x10
|
||||
#define RFLR_DIOMAPPING1_DIO1_10 0x20
|
||||
#define RFLR_DIOMAPPING1_DIO1_11 0x30
|
||||
|
||||
#define RFLR_DIOMAPPING1_DIO2_MASK 0xF3
|
||||
#define RFLR_DIOMAPPING1_DIO2_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO2_01 0x04
|
||||
#define RFLR_DIOMAPPING1_DIO2_10 0x08
|
||||
#define RFLR_DIOMAPPING1_DIO2_11 0x0C
|
||||
|
||||
#define RFLR_DIOMAPPING1_DIO3_MASK 0xFC
|
||||
#define RFLR_DIOMAPPING1_DIO3_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING1_DIO3_01 0x01
|
||||
#define RFLR_DIOMAPPING1_DIO3_10 0x02
|
||||
#define RFLR_DIOMAPPING1_DIO3_11 0x03
|
||||
|
||||
/*!
|
||||
* RegDioMapping2
|
||||
*/
|
||||
#define RFLR_DIOMAPPING2_DIO4_MASK 0x3F
|
||||
#define RFLR_DIOMAPPING2_DIO4_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING2_DIO4_01 0x40
|
||||
#define RFLR_DIOMAPPING2_DIO4_10 0x80
|
||||
#define RFLR_DIOMAPPING2_DIO4_11 0xC0
|
||||
|
||||
#define RFLR_DIOMAPPING2_DIO5_MASK 0xCF
|
||||
#define RFLR_DIOMAPPING2_DIO5_00 0x00 // Default
|
||||
#define RFLR_DIOMAPPING2_DIO5_01 0x10
|
||||
#define RFLR_DIOMAPPING2_DIO5_10 0x20
|
||||
#define RFLR_DIOMAPPING2_DIO5_11 0x30
|
||||
|
||||
#define RFLR_DIOMAPPING2_MAP_MASK 0xFE
|
||||
#define RFLR_DIOMAPPING2_MAP_PREAMBLEDETECT 0x01
|
||||
#define RFLR_DIOMAPPING2_MAP_RSSI 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegVersion (Read Only)
|
||||
*/
|
||||
|
||||
/*!
|
||||
* RegAgcRef
|
||||
*/
|
||||
|
||||
/*!
|
||||
* RegAgcThresh1
|
||||
*/
|
||||
|
||||
/*!
|
||||
* RegAgcThresh2
|
||||
*/
|
||||
|
||||
/*!
|
||||
* RegAgcThresh3
|
||||
*/
|
||||
|
||||
/*!
|
||||
* RegFifoRxByteAddr (Read Only)
|
||||
*/
|
||||
|
||||
/*!
|
||||
* RegPllHop
|
||||
*/
|
||||
#define RFLR_PLLHOP_FASTHOP_MASK 0x7F
|
||||
#define RFLR_PLLHOP_FASTHOP_ON 0x80
|
||||
#define RFLR_PLLHOP_FASTHOP_OFF 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegTcxo
|
||||
*/
|
||||
#define RFLR_TCXO_TCXOINPUT_MASK 0xEF
|
||||
#define RFLR_TCXO_TCXOINPUT_ON 0x10
|
||||
#define RFLR_TCXO_TCXOINPUT_OFF 0x00 // Default
|
||||
|
||||
/*!
|
||||
* RegPaDac
|
||||
*/
|
||||
#define RFLR_PADAC_20DBM_MASK 0xF8
|
||||
#define RFLR_PADAC_20DBM_ON 0x07
|
||||
#define RFLR_PADAC_20DBM_OFF 0x04 // Default
|
||||
|
||||
/*!
|
||||
* RegPll
|
||||
*/
|
||||
#define RFLR_PLL_BANDWIDTH_MASK 0x3F
|
||||
#define RFLR_PLL_BANDWIDTH_75 0x00
|
||||
#define RFLR_PLL_BANDWIDTH_150 0x40
|
||||
#define RFLR_PLL_BANDWIDTH_225 0x80
|
||||
#define RFLR_PLL_BANDWIDTH_300 0xC0 // Default
|
||||
|
||||
/*!
|
||||
* RegPllLowPn
|
||||
*/
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_MASK 0x3F
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_75 0x00
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_150 0x40
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_225 0x80
|
||||
#define RFLR_PLLLOWPN_BANDWIDTH_300 0xC0 // Default
|
||||
|
||||
/*!
|
||||
* RegModemConfig3
|
||||
*/
|
||||
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK 0xF7
|
||||
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON 0x08
|
||||
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF 0x00 // Default
|
||||
|
||||
#define RFLR_MODEMCONFIG3_AGCAUTO_MASK 0xFB
|
||||
#define RFLR_MODEMCONFIG3_AGCAUTO_ON 0x04 // Default
|
||||
#define RFLR_MODEMCONFIG3_AGCAUTO_OFF 0x00
|
||||
|
||||
/*!
|
||||
* RegFormerTemp
|
||||
*/
|
||||
|
||||
typedef struct sSX1276LR
|
||||
{
|
||||
uint8_t RegFifo; // 0x00
|
||||
// Common settings
|
||||
uint8_t RegOpMode; // 0x01
|
||||
|
||||
uint8_t RegTestReserved02[0x06 - 0x02]; // 0x02-0x05
|
||||
// uint8_t RegRes02; // 0x02
|
||||
// uint8_t RegRes03; // 0x03
|
||||
// uint8_t RegBandSetting; // 0x04
|
||||
// uint8_t RegRes05; // 0x05
|
||||
|
||||
uint8_t RegFrfMsb; // 0x06
|
||||
uint8_t RegFrfMid; // 0x07
|
||||
uint8_t RegFrfLsb; // 0x08
|
||||
// Tx settings
|
||||
uint8_t RegPaConfig; // 0x09
|
||||
uint8_t RegPaRamp; // 0x0A
|
||||
uint8_t RegOcp; // 0x0B
|
||||
// Rx settings
|
||||
uint8_t RegLna; // 0x0C
|
||||
|
||||
// LoRa registers
|
||||
uint8_t RegFifoAddrPtr; // 0x0D
|
||||
uint8_t RegFifoTxBaseAddr; // 0x0E
|
||||
uint8_t RegFifoRxBaseAddr; // 0x0F
|
||||
uint8_t RegFifoRxCurrentAddr; // 0x10
|
||||
uint8_t RegIrqFlagsMask; // 0x11
|
||||
uint8_t RegIrqFlags; // 0x12
|
||||
uint8_t RegNbRxBytes; // 0x13
|
||||
uint8_t RegRxHeaderCntValueMsb; // 0x14
|
||||
uint8_t RegRxHeaderCntValueLsb; // 0x15
|
||||
uint8_t RegRxPacketCntValueMsb; // 0x16
|
||||
uint8_t RegRxPacketCntValueLsb; // 0x17
|
||||
uint8_t RegModemStat; // 0x18
|
||||
uint8_t RegPktSnrValue; // 0x19
|
||||
uint8_t RegPktRssiValue; // 0x1A
|
||||
uint8_t RegRssiValue; // 0x1B
|
||||
uint8_t RegHopChannel; // 0x1C
|
||||
uint8_t RegModemConfig1; // 0x1D
|
||||
uint8_t RegModemConfig2; // 0x1E
|
||||
uint8_t RegSymbTimeoutLsb; // 0x1F
|
||||
uint8_t RegPreambleMsb; // 0x20
|
||||
uint8_t RegPreambleLsb; // 0x21
|
||||
uint8_t RegPayloadLength; // 0x22
|
||||
uint8_t RegMaxPayloadLength; // 0x23
|
||||
uint8_t RegHopPeriod; // 0x24
|
||||
uint8_t RegFifoRxByteAddr; // 0x25
|
||||
uint8_t RegModemConfig3; // 0x26
|
||||
uint8_t RegTestReserved27[0x31 - 0x27]; // 0x27-0x30
|
||||
//void SX1276LoRaSetNbTrigPeaks( uint8_t value )Óõ½
|
||||
uint8_t RegTestReserved31; // 0x31
|
||||
uint8_t RegTestReserved32[0x40 - 0x32]; // 0x32-0x3F
|
||||
// I/O settings
|
||||
uint8_t RegDioMapping1; // 0x40
|
||||
uint8_t RegDioMapping2; // 0x41
|
||||
// Version
|
||||
uint8_t RegVersion; // 0x42
|
||||
|
||||
uint8_t RegTestReserved43[0x4B - 0x43]; // 0x43-0x4A
|
||||
uint8_t RegTcxo; // 0x4B
|
||||
uint8_t RegTestReserved4C; // 0x4C
|
||||
uint8_t RegPaDac; // 0x4D
|
||||
uint8_t RegTestReserved4E[0x5B - 0x4E]; // 0x4E-0x5A
|
||||
uint8_t RegFormerTemp; // 0x5B
|
||||
uint8_t RegTestReserved5C[0x61 - 0x5C]; // 0x5C-0x60
|
||||
// Additional settings
|
||||
uint8_t RegAgcRef; // 0x61
|
||||
uint8_t RegAgcThresh1; // 0x62
|
||||
uint8_t RegAgcThresh2; // 0x63
|
||||
uint8_t RegAgcThresh3; // 0x64
|
||||
uint8_t RegTestReserved65[0x70 - 0x65]; // 0x65-0x6F
|
||||
uint8_t RegPll; // 0x70
|
||||
}tSX1276LR;
|
||||
|
||||
extern tSX1276LR* SX1276LR;
|
||||
|
||||
/*!
|
||||
* \brief Initializes the SX1276
|
||||
*/
|
||||
void SX1276LoRaInit( void );
|
||||
|
||||
/*!
|
||||
* \brief Sets the SX1276 to datasheet default values
|
||||
*/
|
||||
void SX1276LoRaSetDefaults( void );
|
||||
|
||||
/*!
|
||||
* \brief Enables/Disables the LoRa modem
|
||||
*
|
||||
* \param [IN]: enable [true, false]
|
||||
*/
|
||||
void SX1276LoRaSetLoRaOn( bool enable );
|
||||
|
||||
/*!
|
||||
* \brief Sets the SX1276 operating mode
|
||||
*
|
||||
* \param [IN] opMode New operating mode
|
||||
*/
|
||||
void SX1276LoRaSetOpMode( uint8_t opMode );
|
||||
|
||||
/*!
|
||||
* \brief Gets the SX1276 operating mode
|
||||
*
|
||||
* \retval opMode Current operating mode
|
||||
*/
|
||||
uint8_t SX1276LoRaGetOpMode( void );
|
||||
|
||||
/*!
|
||||
* \brief Reads the current Rx gain setting
|
||||
*
|
||||
* \retval rxGain Current gain setting
|
||||
*/
|
||||
uint8_t SX1276LoRaReadRxGain( void );
|
||||
|
||||
/*!
|
||||
* \brief Trigs and reads the current RSSI value
|
||||
*
|
||||
* \retval rssiValue Current RSSI value in [dBm]
|
||||
*/
|
||||
double SX1276LoRaReadRssi( void );
|
||||
|
||||
/*!
|
||||
* \brief Gets the Rx gain value measured while receiving the packet
|
||||
*
|
||||
* \retval rxGainValue Current Rx gain value
|
||||
*/
|
||||
uint8_t SX1276LoRaGetPacketRxGain( void );
|
||||
|
||||
/*!
|
||||
* \brief Gets the SNR value measured while receiving the packet
|
||||
*
|
||||
* \retval snrValue Current SNR value in [dB]
|
||||
*/
|
||||
int8_t SX1276LoRaGetPacketSnr( void );
|
||||
|
||||
/*!
|
||||
* \brief Gets the RSSI value measured while receiving the packet
|
||||
*
|
||||
* \retval rssiValue Current RSSI value in [dBm]
|
||||
*/
|
||||
double SX1276LoRaGetPacketRssi( void );
|
||||
|
||||
/*!
|
||||
* \brief Sets the radio in Rx mode. Waiting for a packet
|
||||
*/
|
||||
void SX1276LoRaStartRx( void );
|
||||
|
||||
/*!
|
||||
* \brief Gets a copy of the current received buffer
|
||||
*
|
||||
* \param [IN]: buffer Buffer pointer
|
||||
* \param [IN]: size Buffer size
|
||||
*/
|
||||
void SX1276LoRaGetRxPacket( void *buffer, uint16_t *size );
|
||||
|
||||
/*!
|
||||
* \brief Sets a copy of the buffer to be transmitted
|
||||
*
|
||||
* \param [IN]: buffer Buffer pointer
|
||||
* \param [IN]: size Buffer size
|
||||
*/
|
||||
void SX1276LoRaSetTxPacket( const void *buffer, uint16_t size );
|
||||
|
||||
/*!
|
||||
* \brief Gets the current RFState
|
||||
*
|
||||
* \retval rfState Current RF state [RF_IDLE, RF_BUSY,
|
||||
* RF_RX_DONE, RF_RX_TIMEOUT,
|
||||
* RF_TX_DONE, RF_TX_TIMEOUT]
|
||||
*/
|
||||
tRFLRStates SX1276LoRaGetRFState( void );
|
||||
|
||||
/*!
|
||||
* \brief Sets the new state of the RF state machine
|
||||
*
|
||||
* \param [IN]: state New RF state machine state
|
||||
*/
|
||||
void SX1276LoRaSetRFState( tRFLRStates state );
|
||||
|
||||
/*!
|
||||
* \brief Process the LoRa modem Rx and Tx state machines depending on the
|
||||
* SX1276 operating mode.
|
||||
*
|
||||
* \retval rfState Current RF state [RF_IDLE, RF_BUSY,
|
||||
* RF_RX_DONE, RF_RX_TIMEOUT,
|
||||
* RF_TX_DONE, RF_TX_TIMEOUT]
|
||||
*/
|
||||
uint32_t SX1276LoRaProcess( void );
|
||||
|
||||
#endif //__SX1276_LORA_H__
|
||||
Loading…
Reference in New Issue