#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