307 lines
11 KiB
C
307 lines
11 KiB
C
#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 |