#ifndef FR2433_RFSX #define FR2433_RFSX //////////////////////////////////////////////////////////////////////////////// // 版权: Haybin.Wu@studio // 文件名: // 版本: V1.0 // 工作环境: IAR v6.20 // 作者: Haybin // 生成日期: 2016.05 // 功能: API for FR4133 // 修改日志: //////////////////////////////////////////////////////////////////////////////// #include #include //====================================================================================== #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