ShipCentralControl/RF-AP/20201015鼎力调通/FR2433-RFSX.h

307 lines
11 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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