您的位置:首页 > Web前端

基于stm32固件库的的spi 对NRF905SE无线模块操作的API

2011-08-17 22:01 501 查看
前段时间,写了一个基于stm32的spi 对无线模块 NRF905SE 操作的C语言API,整个设计采用了一种分层的函数式的思想,在此拿来和大家一起分享,和大家共同交流,希望大家指正!

废话少说,上代码:

1. NRF905SE 模块的的的头文件:

/******************** (C) COPYRIGHT 2011 sdu emlib ********************
**** 	filename: nrf905.h
***		description: This file provides  the declarations in  NRF905SE.
***		author: wzb
***		date: 2011/5/13
*********************************************************************/
/**** prevent the recursive inclusion *********/
#ifndef __NRF905SE_H_
#define __NRF905SE_H_

/*** include files *****/
#include "stm32f10x_lib.h"

/***************射频芯片相关定义***************/

#define NRF905SE_BufferSize 	32
#define NRF905SE_AddressSize    4
#define NOP             0xFF						/*** SPI 全双工时的空操作 ***/
/*****************全局变量**********************/
extern u8 NRF905SE_TxBuffer[NRF905SE_BufferSize];      /*****发送数据所在数组***/
extern u8 NRF905SE_RxBuffer[NRF905SE_BufferSize];      /*****接收数据所在数组***/

extern u8 NRF905SE_TxAddress[NRF905SE_AddressSize];     /*****发送地址所在数组***/
extern u8 NRF905SE_RxAddress[NRF905SE_AddressSize];     /*****接收地址所在数组***/

extern u8 TxAddress[NRF905SE_AddressSize];
extern u8 RxAddress[NRF905SE_AddressSize];
extern u8 NRF905SE_DR_FLAG;                          /**数据发送完成或接受完成标志!**/

//------------define the SPI using-----------
#define SPI_USING                  SPI1

/****************NRF905SE引脚配置*************/

#define NRF905SE_CE_PIN  			GPIO_Pin_0      /*** A0 ***/
#define NRF905SE_TX_EN_PIN			GPIO_Pin_3		/*** A3 ***/

#define NRF905SE_CSN_PIN			GPIO_Pin_4		/*** A4 ***/ // SPI1 NSS

#define NRF905SE_DR_PIN				GPIO_Pin_0		/*** C0 ***/
#define NRF905SE_AM_PIN 			GPIO_Pin_1      /*** C1 ***/
#define NRF905SE_CD_PIN				GPIO_Pin_2		/*** C2 ***/
#define NRF905SE_PWR_UP_PIN			GPIO_Pin_3      /*** C3 ***/

#define NRF905SE_IRQ_PIN      		GPIO_Pin_0		/*** C0 ***/

/**** SPI SELECTED /DESELECTED ***/
#define NRF905SE_POWER_ON()             GPIOC->BSRR = NRF905SE_PWR_UP_PIN
#define NRF905SE_POWER_OFF()            GPIOC->BRR  = NRF905SE_PWR_UP_PIN

#define NRF905SE_CSN_ON() 	 		GPIOA->BSRR = NRF905SE_CSN_PIN    /*** SPI SELECTED CANCEL ***/
#define NRF905SE_CSN_OFF()   		GPIOA->BRR =  NRF905SE_CSN_PIN	   /*** SPI SELECTED  ***/
#define NRF905SE_SPI_START()		NRF905SE_CSN_OFF()
#define NRF905SE_SPI_END() 			NRF905SE_CSN_ON()

#define NRF905SE_CE_ON()     		GPIOA->BSRR = NRF905SE_CE_PIN
#define NRF905SE_CE_OFF()    		GPIOA->BRR =  NRF905SE_CE_PIN
#define NRF905SE_STANDBY()			NRF905SE_CE_OFF()
#define NRF905SE_SHOCKBURST_TRX()	NRF905SE_CE_ON()
#define NRF905SE_Standby()	 		NRF905SE_CE_OFF()
#define NRF905SE_ShockBurst_TRx()	NRF905SE_CE_ON()

#define NRF905SE_TX_EN_ON()       GPIOA->BSRR = NRF905SE_TX_EN_PIN
#define NRF905SE_TX_EN_OFF()      GPIOA->BRR =  NRF905SE_TX_EN_PIN
#define NRF905SE_MODE_TX()	 NRF905SE_TX_EN_ON()
#define NRF905SE_MODE_RX()	 NRF905SE_TX_EN_OFF()

/****************op of data ready  flag: dr indentify ****/

#define NRF905SE_Is_Data_RxFinished()      	        NRF905SE_DR_FLAG
#define NRF905SE_Is_Data_TxFinished()      			NRF905SE_DR_FLAG
#define NRF905SE_Reset_Data_RxFinished_Flag()      	NRF905SE_DR_FLAG = 0
#define NRF905SE_Reset_Data_TxFinished_Flag()   	NRF905SE_DR_FLAG = 0

//#define NRF905SE_IsDataReady()                      ( GPIOA->IDR & NRF905SE_DR_PIN)

/**************NRF905SE外部中断源配置************/
#define GPIO_PORT_SOURCE_IRQ_NRF905SE    GPIO_PortSourceGPIOA
#define GPIO_PIN_SOURCE_IRQ_NRF905SE     GPIO_PinSource3
#define EXTI_LINE_IRQ_NRF905SE           EXTI_Line3

typedef enum  {
CRCMode_8bit = 0,
CRCMode_16bit
} CRCMode;

/*********************NRF905SE SPI接口 控制指令 宏定义**************/
#define NRF905SE_WC 	0x00        // 设置配置寄存器 (write RF-Configeration Register)
#define NRF905SE_RC		0x10		// 读取配置寄存器 (read  RF-Configeration Register)

#define NRF905SE_WAR	0x01		//设置自动重传 AUTO_RETRAN 模式 (set:0x20\ restset:0x00)
#define NRF905SE_RAR	0x11		//读取自动重传 AUTO_RETRAN 模式 (set:0x20\ restset:0x00)

#define NRF905SE_WTRX_AFW 0x02		// 设置收发地址格式的宽度(字节个数)(Bit[7]:没用; TX_AFW[2:0] Bit[3]:没用; RX_AFW[2:0] 默认值 0100_0100 : 0x44)
#define NRF905SE_RTRX_AFW 0x12      // 读取收发地址格式的宽度(字节个数)(Bit[7]:没用; TX_AFW[2:0] Bit[3]:没用; RX_AFW[2:0] 默认值0100_0100 : 0x44 )

#define NRF905SE_WRX_PW 0x03		//设置接受数据的rx-payload寄存器的有效数据的宽度 (Bit[7:6]没用RX_PWR[5:0] 默认值 0010_0000 : 0x20)
#define NRF905SE_RRX_PW 0x13		//读取接受数据的rx-payload寄存器的有效数据的宽度 (Bit[7:6]没用RX_PWR[5:0] 默认值 0010_0000 : 0x20)

#define NRF905SE_WTX_PW 0x04		//设置接受数据的tx-payload寄存器的有效数据的宽度 (Bit[7:6]没用RX_PWR[5:0] 默认值 0010_0000 : 0x20)
#define NRF905SE_RTX_PW 0x14		//读取接受数据的tx-payload寄存器的有效数据的宽度 (Bit[7:6]没用RX_PWR[5:0] 默认值 0010_0000 : 0x20)

#define NRF905SE_WRA	0x05		// 设置位于配置寄存器第5-8的4个字节的Rx-Address (write RX-Address)
#define NRF905SE_RRA	0x15		// 读取位于配置寄存器第5-8的4个字节的Rx-Address	(read Rx-Address)

#define NRF905SE_WCRC 	0x09 	// 设置CRC 校验的模式
#define NRF905SE_RCRC 	0x19 	// 读取CRC 校验的模式

#define NRF905SE_WTP	0x20		// 向TX-Payload 寄存器写入有效数据 (write the payload data to the Tx-payload register)
#define NRF905SE_RTP 	0x21		// 从Tx-payload 寄存器中读出有效数据 read the payload data in the Tx-payload register)

#define NRF905SE_WTA 	0x22		// 向Tx-Address 寄存器写入发送地址,即目标地址(write the destination address in the Tx-Address register)
#define NRF905SE_RTA	0x23		// 从Tx-Address	寄存器读取发送地址,(read the destination address from the Tx-Address register)

#define NRF905SE_RRP	0x24		// 从Tx-Payload 寄存器中读取接收到的有效数据(read the payload data from the Rx-Payload register)

/*------------ NRF905SE     functions ---------------------------------------*/

void NRF905SE_SetRxMode(void);
void NRF905SE_SetTxMode(void);

bool NRF905SE_RxPacket(void);
bool NRF905SE_TxPacket(void);

void NRF905SE_Configuration(void);
void NRF905SE_EXTI_DoIt(void);

/*****NRF905SE初始化,包括设置默认配置及发送、接收地址****/
void 	NRF905SE_Configuration(void);

/*---------------------------NRF905SE MODE setting functions------------------*/
void NRF905SE_SetSPIMode(void);
void NRF905SE_SetTxMode(void);
void NRF905SE_SetRxMode(void);
/*----------------endof NRF905SE MODE setting  functions----------------------*/

/*------------NRF905SE   functions -------------------------------------*/

bool 	NRF905SE_IsAutoRetranEnable(void);
bool	NRF905SE_GetAutoRetranMode(void);
void	NRF905SE_SetAutoRetranMode(bool auto_retran_en);

bool 	NRF905SE_IsCRCModeEnable(void);
u8 		NRF905SE_GetCRCMode(void);
void	NRF905SE_SetCRCMode(CRCMode CRC_mode);

u8 		NRF905SE_GetRxAddressSize(void);
void 	NRF905SE_SetRxAddressSize(u8 size) ;

u8 		NRF905SE_GetTxAddressSize(void);
void 	NRF905SE_SetTxAddressSize(u8 size);

u8 		NRF905SE_GetRxPayloadSize(void);
void 	NRF905SE_SetRxPayloadSize(u8 size);

u8 		NRF905SE_GetTxPayloadSize(void);
void 	NRF905SE_SetTxPayloadSize(u8 size);

u8 * 	NRF905SE_GetTxPayload(u8 * payload_array, u8 payload_array_length);
void 	NRF905SE_SetTxPayload(const u8 * addr_array, u8 addr_array_length);

u8 * 	NRF905SE_GetRxPayload(u8 * payload_array, u8 payload_array_length);
void 	NRF905SE_SetRxPayload(const u8 * addr_array, u8 addr_array_length);

void NRF905SE_SetTxAddress( const u8 * addr_array, u8 addr_array_length);
u8 * NRF905SE_GetTxAddress(u8 * addr_array, u8 addr_array_length);

void NRF905SE_SetRxAddress(const u8 * addr_array, u8 addr_array_length);
u8 * NRF905SE_GetRxAddress(u8 * addr_array, u8 addr_array_length);

void NRF905SE_SendData(void);
void NRF905SE_ReceiveData(void);

bool  NRF905SE_SendTxPacket(const u8 * payload_array, u8 payload_size, const u8 * tx_address_array, u8 tx_address_length);
bool  NRF905SE_SendPacket(const u8 * payload_array, u8 payload_size);
u8 *  NRF905SE_ReceivePacket(u8 * payload_array, u8 payload_size);

//外部中断处理函数
void  NRF905SE_EXTI_DoIt();

#endif  /** END OF DEFINE __NRF905SE_H_ ****/

 

2. NRF905SE模块的功能函数的实现:

/******************** (C) COPYRIGHT 2011 sdu emlib ********************
**** 	filename: nrf905.c
***		description: This file provides  the fuctions implemented in NRF905SE.
***		author: wzb
***		date: 2011/5/13
*********************************************************************/

/***********************include files *******************************/
#include "nrf905.h"

/*********************** global variables ***************************/
u8 NRF905SE_RxBuffer[NRF905SE_BufferSize];
u8 NRF905SE_TxBuffer[NRF905SE_BufferSize] = {
0x30,0x32,0x33,0x41, 0x42,0x43,0x44,0x45,  0x30,0x32,0x33,0x41, 0x42,0x43,0x44,0x45,//16
0x30,0x32,0x33,0x41, 0x42,0x43,0x44,0x45,  0x30,0x32,0x33,0x41, 0x42,0x43,0x44,0x45//32												 //54
};
u8 NRF905SE_TxAddress[NRF905SE_AddressSize] = {0x31, 0x32, 0x33, 0x34};
u8 NRF905SE_RxAddress[NRF905SE_AddressSize] = {0x30, 0x31, 0x32, 0x33};

u8 TxAddress[NRF905SE_AddressSize];
u8 RxAddress[NRF905SE_AddressSize];

u8 NRF905SE_DR_FLAG = 0;

/************************NRF905SE configer register type**********/
typedef struct __NRFConfig__ {
u8 NRF905SE_Config_Length;  /* the bytes size of the configer */
u8 NRF905SE_Config_Buf[10];
}NRF905SE_InitTypeDef;

u8 NRF905SE_Config_Buf[11] =
{
10,                               //配置命令 数组的长度
0x4c,                             //CH_NO,配置频段在430MHZ
0x0c,                             //输出功率为10db,不重发,节电为正常模式
0x44,                             //地址宽度设置,为4字节
0x20,0x20,                        //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC,              //接收地址
0x58,                            //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};

/*---------------------- NRF905SE biscal read/write  functions ---------------*/
static void NRF905SE_GPIO_Config(void);
static void NRF905SE_NVIC_Config(void);
static void NRF905SE_EXTI_Config(void);
static void NRF905SE_InitWriteCR(void);

static void SPI_SendByte(SPI_TypeDef * SPIx, u8 data);
static u8 SPI_ReceiveByte(SPI_TypeDef * SPIx) ;

static u8 		NRF905SE_ReadReg_u8(u8 op);
static void 	NRF905SE_WriteReg_u8(u8 op, u8 value);

static u8 		NRF905SE_ReadWriteReg_u8(u8 op, u8 value);

static void 	NRF905SE_WriteReg_Byte(u8 op,  u8 value) ;
static u8		NRF905SE_ReadReg_Byte(u8 op);

static u8 * 	NRF905SE_ReadReg_Bytes(u8 op_r, u8* arrayPtr, u8 arraySize);
static void 	NRF905SE_WriteReg_Bytes(u8 op_w, const u8* arrayPtr, u8 arraySize);

static u8 * NRF905SE_GetTxRxAddress(u8 op_r, u8* addr_array, u8 addr_array_length);
static void NRF905SE_SetTxRxAddress(u8 op_w, const u8 * addr_array, u8 addr_array_length);

/*------------end of NRF905SE  biscal read/write  functions ------------------*/

/*******************************************
函数功能:NRF905SE GPIO配置
入口参数:无
返回:    无
备注:
配置IRQ、CSN(SPI的NSS引脚)、CE引脚
CSN引脚的模式为普通的输出,而不是复用
*********************************************/
static void NRF905SE_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* clock  enable **/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC| RCC_APB2Periph_AFIO, ENABLE);

/*  NRF905SE CE pin configuration PA.00 */
GPIO_InitStructure.GPIO_Pin = NRF905SE_CE_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/*  NRF905SE Tx_EN pin configuration  PA.03*/
GPIO_InitStructure.GPIO_Pin = NRF905SE_TX_EN_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/*  NRF905SE CSN pin configuration  PA.04 */
GPIO_InitStructure.GPIO_Pin = NRF905SE_CSN_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* NRF905SE IRQ pin configeration PC.00 */
GPIO_InitStructure.GPIO_Pin = NRF905SE_IRQ_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/*  NRF905SE_AM_PIN pin configuration  PC.01*/
GPIO_InitStructure.GPIO_Pin = NRF905SE_AM_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/*  NRF905SE_CD_PIN pin configuration PC.02*/
GPIO_InitStructure.GPIO_Pin = NRF905SE_CD_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

/*  NRF905SE_PWR_UP_PIN pin configuration PC.03 */
GPIO_InitStructure.GPIO_Pin = NRF905SE_PWR_UP_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

}

/**********************************************
函数功能:NRF905SE NVIC配置
入口参数:无
返回:   无
备注:
配置中断线优先级
*********************************************/
static void NRF905SE_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

#ifdef  VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

/* Enable the EXTI3 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

/****************************************************
函数功能:NRF905SE 外部中断配置
入口参数:无
返回:    无
备注:
配置中断引脚线、中断模式、高/低使能
***************************************************/

static void NRF905SE_EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

}

/*****************************************************
function name: 			NRF905SE_InitWriteCR;
function description: initialize the configer regester of NRF905SE;

parameters: none;
return:  none;
author: wzb
time:	2011/5/13/pm

notes: the internal function provided for the fuction: void NRF905SE_Configuration(void);
***********************************************/
void NRF905SE_InitWriteCR(void) {
NRF905SE_InitTypeDef *  NRF905SE_InitStructurePtr =
(NRF905SE_InitTypeDef *) NRF905SE_Config_Buf ;
NRF905SE_WriteReg_Bytes(NRF905SE_WC, NRF905SE_InitStructurePtr->NRF905SE_Config_Buf,
NRF905SE_InitStructurePtr->NRF905SE_Config_Length);
}

/******************************************************
function name: 			NRF905SE_Configuraton;
function description: initialization  of NRF905SE;

parameters: none;
return:  none;
author: wzb
time:	2011/5/13/pm

notes: none
***********************************************/
void NRF905SE_Configuration(void) {

NRF905SE_GPIO_Config();
NRF905SE_NVIC_Config();
NRF905SE_EXTI_Config();
NRF905SE_InitWriteCR();	// initialize the Configer register of NRF905SE

/********设置接收地址和发送地址*****/
NRF905SE_SetRxAddress(NRF905SE_RxAddress, NRF905SE_AddressSize);
NRF905SE_SetTxAddress(NRF905SE_TxAddress, NRF905SE_AddressSize);

NRF905SE_POWER_ON();
NRF905SE_STANDBY();
}

/*********** set the mode spi/tx/rx ******************************************/

/*******************************************************************************
* Function Name  : NRF905SE_SetSPIMode
* Description    : set NRF905SE into SPI mode : means
*				   NRF90RSE Enter to standby mode:
*                  standby mode enable : NRF905SE_TRX_CE = 0.
*
* Input          : None.
* Output         : None.
* Return         : None.
* Note			 : the change of mode  needs some interval time (>=650us).
*******************************************************************************/
void NRF905SE_SetSPIMode(void) {
NRF905SE_POWER_ON();
NRF905SE_STANDBY();
}

/*******************************************************************************
* Function Name  : NRF905SE_SetTxMode
* Description    : set NRF905SE into Tx mode :
*					Tx enanble				:	NRF905SE_TX_EN = 1;
*                  	ShockBurst Mode enable	:	NRF905SE_TRX_CE = 1.
*
* Input          : None.
* Output         : None.
* Return         : None.
* Note			 : the change of mode  needs some interval time (>=650us).
*******************************************************************************/
void NRF905SE_SetTxMode(void)
{
NRF905SE_POWER_ON();
NRF905SE_MODE_TX();
NRF905SE_SHOCKBURST_TRX();
//delay_10us(130);   /***CE_ON至少持续650us,650us后NRF905SE开始检测空中信息 此时延为转换时研无需额外时延**/
}

/*******************************************************************************
* Function Name  : NRF905SE_SetRxMode
* Description    : set NRF905SE into Rx mode :
*				  Rx enable    			:		NRF905SE_TX_EN = 0;
*                 ShockBurst Mode enable: 		NRF905SE_TRX_CE = 1.
*
* Input          : None.
* Output         : None.
* Return         : None.
* Note			 : the change of mode  needs some interval time (>=650us).
*******************************************************************************/
void NRF905SE_SetRxMode(void)
{
NRF905SE_POWER_ON();
NRF905SE_MODE_RX();
NRF905SE_SHOCKBURST_TRX();
//delay_10us(10);   /***CE_ON至少持续650us,650us后NRF905SE开始检测空中信息**/
}
/***********end of  set the mode spi/tx/rx ***********************************/

/*********************Private functions ******************************/

static void SPI_SendByte(SPI_TypeDef * SPIx, u8 data) {
SPI_I2S_SendData(SPIx, (u16)data);
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
}

static u8 SPI_ReceiveByte(SPI_TypeDef * SPIx) {
while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
return (u8)SPI_I2S_ReceiveData(SPIx);

}

/*******************************************************************************
* Function Name  : NRF905SE_Read_u8
* Description    :  internal fuction,it opterates after spi starts.
*
*
*
* Input          : None.
* Output         : valuePtr: u8 * - the pointer of the read value
* Return         : return the read value.
* Note			 : it is an internal private function: scope only in this file (static).
*******************************************************************************/
static u8 NRF905SE_Read_u8(u8 * valuePtr) {
SPI_SendByte(SPI_USING, NOP);
*valuePtr = SPI_ReceiveByte(SPI_USING);
return *valuePtr;
}

/*******************************************************************************
* Function Name  : NRF905SE_Write_u8
* Description    :  internal fuction,it opterates after spi starts.
*
*
*
* Input          : None.
* Output         : valuePtr: u8 * - the pointer of the write value
* Return         : void.
* Note			 : it is an internal private function: scope only in this file (static)
*******************************************************************************/
static void NRF905SE_Write_u8(const u8 * valuePtr) {
SPI_SendByte(SPI_USING, *valuePtr);
SPI_ReceiveByte(SPI_USING);
}

/********************* end of Private functions ******************************/

/******** the basical fuctions *************************************************/

/*******************************************************************************
* Function Name  : NRF905SE_ReadReg_u8
* Description    : the function read  a byte from the register which is decided by op .
*
*
*
* Input          : op:- op_r -- to indicate which register to be opterated .
* Output         : none.
* Return         : return the read value of the specifical register.
* Note			 : none.
*******************************************************************************/
u8 NRF905SE_ReadReg_u8(u8 op) {

u8 retval;
NRF905SE_SetSPIMode();
NRF905SE_SPI_START();

NRF905SE_Write_u8(&op);
NRF905SE_Read_u8(&retval);

NRF905SE_SPI_END();

return retval;
}

/*******************************************************************************
* Function Name  : NRF905SE_WriteReg_u8
* Description    :   the function writes  a byte to the register which is decided by op .
*
*
*
* Input          : op:- op_w -- to indicate which register to be opterated .
*				  value: u8 ---the byte will be written to the resigester.
* Output         : none.
* Return         : none.
* Note			 : none.
*******************************************************************************/
void NRF905SE_WriteReg_u8(u8 op, u8 value) {
NRF905SE_SetSPIMode();
NRF905SE_SPI_START();

NRF905SE_Write_u8(&op);
NRF905SE_Write_u8(&value);

NRF905SE_SPI_END();
}

/*******************************************************************************
* Function Name  : NRF905SE_ReadWrite_u8
* Description    :  internal fuction,it opterates after spi starts.
*
*
*
* Input          : op: -op_r/op_w (read/write op code);
*				  when op is a op_r, value = NOP, otherwise, value is a write value.
* Output         :  none.
* Return         : return the read value when op_r , otherwise unvildate data.
* Note			 : expired.
*******************************************************************************/
u8 NRF905SE_ReadWriteReg_u8(u8 op, u8 value) {
u8 retval;

NRF905SE_SetSPIMode();
NRF905SE_SPI_START();

NRF905SE_Write_u8(&op);

SPI_SendByte(SPI_USING, value);
retval=SPI_ReceiveByte(SPI_USING);

NRF905SE_SPI_END();

return retval;
}

/*****************************************************
function name: 			NRF905SE_WriteReg_Byte;
function description:  this fuction is  the same as NRF905SE_WriteReg_u8  as alias ;

parameters:  op: u8- operation code to indicate the register to operate;
value : 	the value will be written to the specifical regiseter.
return:  none;
author: wzb
time:	2011/5/13/pm

notes: reference to the fuction NRF905SE_WriteReg_u8 , also is its alias;
****************************************************/
static void NRF905SE_WriteReg_Byte(u8 op,  u8 value) {
NRF905SE_WriteReg_u8(op, value);

}

/************************************************
function name: 			NRF905SE_ReadReg_Byte .
function description:  this fuction is  the same as NRF905SE_ReadReg_u8  as alias .

parameters:  op: u8- operation code to indicate the register to operate.
return:  none.
author: wzb
time:	2011/5/13/pm

notes: reference to the fuction NRF905SE_ReadReg_u8 , also is its alias.

***************************************************/
static u8  NRF905SE_ReadReg_Byte(u8 op) {
return NRF905SE_ReadReg_u8(op);
}

/*******************************************************************************
* Function Name  : NRF905SE_ReadReg_Bytes
* Description    : this fuction can read the register multibyts once.
*
*
*
* Input          : op_r:-(read operation code);
*				   arraySize: the number of bytes will be read.
* Output         : arrayPtr: the pointer of multibytes will be read.
* Return         : return the poiter of the mutibytes.
* Note			 : none.
*******************************************************************************/

u8 * NRF905SE_ReadReg_Bytes(u8 op_r, u8* arrayPtr, u8 arraySize) {
u8 i;
NRF905SE_SetSPIMode();
NRF905SE_SPI_START();

NRF905SE_Write_u8(&op_r);

for(i=0; i<arraySize; i++) {
NRF905SE_Read_u8(arrayPtr+i);
}

NRF905SE_SPI_END();

return arrayPtr;
}

/*******************************************************************************
* Function Name  : NRF905SE_WriteReg_Bytes
* Description    : this fuction can Write the register multibyts once.
*
*
*
* Input          : op_w:-(Write operation code);
*				   arrayPtr: the pointer of multibytes will be written.
*				   arraySize: the number of bytes will be witten.
* Output         : none.
* Return         : void.
* Note			 : none.
*******************************************************************************/
void NRF905SE_WriteReg_Bytes(u8 op_w, const u8* arrayPtr, u8 arraySize) {
u8 i;
NRF905SE_SetSPIMode();
NRF905SE_SPI_START();

NRF905SE_Write_u8(&op_w);

for(i=0; i<arraySize; i++) {
NRF905SE_Write_u8(arrayPtr+i);
}

NRF905SE_SPI_END();
}

/*************************end of the basical fuctions ************************/

/************************* the extend fuctions of NRF905SE *******************/

/*******************************************************************************
* Function Name  : NRF905SE_IsCRCModeEnable
* Description    : this fuction can get CRC Mode state: enable /disable.
*
*
*
* Input          : none.
*
*
* Output         : none.
* Return         : bool:- TRUE/FALSE
* Note			 : none.
*******************************************************************************/
bool NRF905SE_IsCRCModeEnable(void) {
u8 op, mode;
op = NRF905SE_RCRC;
mode = NRF905SE_ReadReg_u8(op);
mode &= 0x40;
return  mode ? TRUE : FALSE ;
}

/*******************************************************************************
* Function Name  : NRF905SE_GetCRCMode
* Description    : this fuction can get the mode of CRC : CRCMode_8bit/CRCMode_16bits.
*
*
*
* Input          : none.
*
*
* Output         : none.
* Return         : the mode of CRC: CRCMode_8bit/CRCMode_16bits.
* Note			 : none.
*******************************************************************************/
u8 NRF905SE_GetCRCMode(void) {
u8 op, mode;
op = NRF905SE_RCRC;
mode = NRF905SE_ReadReg_u8(op);
mode &= 0x80;

return  mode  >> 7;
}

/*******************************************************************************
* Function Name  : NRF905SE_SetCRCMode
* Description    : this fuction can Set the mode of  CRC.
*
*
*
* Input          : CRC_mode : CRCMode --CRCMode_8bits /CRCMode_16bits.
*
*
* Output         : none.
* Return         : none.
* Note			 : none.
*******************************************************************************/
void NRF905SE_SetCRCMode(CRCMode CRC_mode) {
u8 op, mode;
op = NRF905SE_RCRC;

mode =NRF905SE_ReadReg_u8(op);
mode &= 0x7F;
mode |=  CRC_mode ? 0x80 : 0x00;

op = NRF905SE_WCRC;
NRF905SE_WriteReg_u8(op, mode);

}

/*******************************************************************************
* Function Name  : NRF905SE_IsAutoRetranEnable
* Description    : this fuction can get the mode of  auto_retransmit.
*
*
*
* Input          : none.
*
*
* Output         : none.
* Return         : bool:- TRUE/FALSE
* Note			 : none.
*******************************************************************************/
bool NRF905SE_IsAutoRetranEnable(void) {
u8 op, mode;
op = NRF905SE_RAR;
mode = NRF905SE_ReadReg_u8(op);
mode &= 0x20;
return  mode ? TRUE : FALSE ;
}

/*******************************************************************************
* Function Name  : NRF905SE_GetAutoRetranMode
* Description    : this fuction can get the mode of  auto_retransmit.
*
*
*
* Input          : none.
*
*
* Output         : none.
* Return         : the mode of auto_retransmit.
* Note			 : none.
*******************************************************************************/
bool NRF905SE_GetAutoRetranMode(void) {
u8 op, mode;
op = NRF905SE_RAR;
mode = NRF905SE_ReadReg_u8(op);
mode &= 0x20;

return  mode ? TRUE : FALSE ;
}

/*******************************************************************************
* Function Name  : NRF905SE_SetAutoRetran_Mode
* Description    : this fuction can Set the mode of  auto_retransmit.
*
*
*
* Input          : auto_retran_en : bool --TRUE/FALSE.
*
*
* Output         : none.
* Return         : none.
* Note			 : none.
*******************************************************************************/
void NRF905SE_SetAutoRetranMode(bool auto_retran_en) {
u8 op, mode;
op = NRF905SE_WAR;

mode =NRF905SE_ReadReg_u8(NRF905SE_RAR);
mode &= 0xDF;
mode |=  auto_retran_en ? 0x20 : 0x00;
NRF905SE_WriteReg_u8(op, mode);

}

/*******************************************************************************
* Function Name  : NRF905SE_GetRxAddressSize
* Description    : this fuction can get the size of RxAddress in configer register.
*
*
*
* Input          : none.
*
*
* Output         : none.
* Return         : the size of RxAddress.
* Note			 : none.
*******************************************************************************/
u8 NRF905SE_GetRxAddressSize(void) {
u8 op, size;
op = NRF905SE_RTRX_AFW;
size = NRF905SE_ReadReg_u8(op);
size &= 0x07;
return size;
}

/*******************************************************************************
* Function Name  : NRF905SE_SetRxAddressSize
* Description    : this fuction can set the size of RxAddress in configer register.
*
*
*
* Input          : size : u8 --- available values: 1-4 .
*
*
* Output         : none.
* Return         : the size of RxAddress.
* Note			 : none.
*******************************************************************************/
void NRF905SE_SetRxAddressSize(u8 size) {
u8 op, i;
op = NRF905SE_RTRX_AFW;
//i = NRF905SE_GetRxAddressSize();
i = NRF905SE_ReadReg_u8(op);
i &= 0xF8;
size &= 0x07;
size |= i;
op = NRF905SE_WTRX_AFW;
NRF905SE_WriteReg_u8(op, size);
}

/*******************************************************************************
* Function Name  : NRF905SE_GetTxAddressSize
* Description    : this fuction can get the size of RxAddress in configer register.
*
*
*
* Input          : none.
*
*
* Output         : none.
* Return         : the size of TxAddress.
* Note			 : none.
*******************************************************************************/
u8 NRF905SE_GetTxAddressSize(void) {
u8 op, size;
op = NRF905SE_RTRX_AFW;
size = NRF905SE_ReadReg_u8(op);
size &= 0x70;

return size >> 4;
}

/*******************************************************************************
* Function Name  : NRF905SE_SetTxAddressSize
* Description    : this fuction can set the size of TxAddress in configer register.
*
*
*
* Input          : size: u8--- the size of Tx-Address register to be set, available values: 0-4 .
*
*
* Output         : none.
* Return         : the size of TxAddress.
* Note			 : none.
*******************************************************************************/
void NRF905SE_SetTxAddressSize(u8 size) {
u8 op, i;
op = NRF905SE_RTRX_AFW;
//i = NRF905SE_GetTxAddressSize();
i = NRF905SE_ReadReg_u8(op);
i &= 0x8F;
size &= 0x07;
size = size << 4;
size |= i;
op = NRF905SE_WTRX_AFW;
NRF905SE_WriteReg_u8(op, size);
}

/*******************************************************************************
* Function Name  : NRF905SE_GetRxPayloadSize
* Description    : this fuction can get the size of payload in Rx-Paylaod register.
*
*
*
* Input          : none.
*
*
* Output         : none.
* Return         : the size of payload in Rx-Payload.
* Note			 : none.
*******************************************************************************/
u8 NRF905SE_GetRxPayloadSize(void) {
u8 op, size;
op = NRF905SE_RRX_PW ;
size = NRF905SE_ReadReg_u8(op);
size &= 0x3f;
return size;
}

/*******************************************************************************
* Function Name  : NRF905SE_SetRxPayloadSize
* Description    : this fuction can set the size of payload in Rx-Paylaod register.
*
*
*
* Input          : size: u8 --- the size of Rx-Payload register to be set; available values: 0-32.
*
*
* Output         : none
* Return         : the size of payload in Rx-Payload register.
* Note			 : none.
*******************************************************************************/
void NRF905SE_SetRxPayloadSize(u8 size) {
u8 i, op;
op = NRF905SE_RRX_PW ;
i = NRF905SE_ReadReg_u8(op);
i &= 0xc0;
size &= 0x3f;
size |= i;
op = NRF905SE_WRX_PW ;
NRF905SE_ReadWriteReg_u8(op, size);
}

/*******************************************************************************
* Function Name  : NRF905SE_GetTxPayloadSize
* Description    : this fuction can get the size of payload in TxPaylaod register.
*
*
*
* Input          :none.
*
*
* Output         : none.
* Return         : the size of payload.
* Note			 : none.
*******************************************************************************/

u8 NRF905SE_GetTxPayloadSize(void) {
u8 op, size;
op = NRF905SE_RTX_PW ;
size = NRF905SE_ReadReg_u8(op);
size &= 0x3f;
return size;
}

/*******************************************************************************
* Function Name  : NRF905SE_SetTxPayloadSize
* Description    : this fuction can set the size of payload in Tx-Paylaod register.
*
*
*
* Input          : size: u8 --- the size of Tx-Payload register to be set; available values: 0-32.
*
*
* Output         : none.
* Return         : the size of payload in Tx-Payload register.
* Note			 : none.
*******************************************************************************/
void NRF905SE_SetTxPayloadSize(u8 size) {
u8 i, op;
op = NRF905SE_RTX_PW ;
i = NRF905SE_ReadReg_u8(op);
i &= 0xc0;
size &= 0x3f;
size |= i;
op = NRF905SE_WTX_PW ;
NRF905SE_ReadWriteReg_u8(op, size);
}

/*****************************************************
function name: 			NRF905SE_Get_TxRxPayload 	;
function description: get Payload  in Tx-Payload/Rx-Payload register  of NRF905SE;

parameters:	 @1-- op_r: u8 --) indicate which register (tx-payload or rx-payload ) to be operated.
@2-- payload_array : u8 * : the array which will contain the payload .
@3-- payload_length :  u8 --- will be  indicated by tx-payload or rx-payload  size;
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
static u8 * NRF905SE_GetTxRxPayload(u8 op_r, u8 * payload_array, u8 payload_array_length)
{
NRF905SE_ReadReg_Bytes(op_r, payload_array, payload_array_length);
return payload_array;
}

/*****************************************************
function name: 			NRF905SE_SetTxRxPayload 	;
function description: Set Payload  in Tx-Payload/Rx-Payload register  of NRF905SE;

parameters:	 @1-- op_W: u8 --) indicate which register (Tx-payload or Rx-payload ) to be operated.
@2-- payload_array : u8 * : the array which will contain the payload .
@3-- payload_length :  u8 --- will be  indicated by tx-payload or rx-payload  size;
return:  none;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
static void NRF905SE_SetTxRxPayload(u8 op_w, const u8 * payload_array, u8 payload_array_length)
{
NRF905SE_WriteReg_Bytes(op_w, payload_array, payload_array_length);
}

/*****************************************************
function name: 			NRF905SE_GetTxPayload 	;
function description: get Payload  in Tx-Payload register  of NRF905SE;

parameters:
@1-- payload_array : u8 * : the array which will contain the payload .
@2-- payload_length :  u8 --- will be  indicated by tx-payload size;
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
u8 * NRF905SE_GetTxPayload(u8 * payload_array, u8 payload_array_length)
{
NRF905SE_GetTxRxPayload(NRF905SE_RTP, payload_array, payload_array_length);

return payload_array;
}

/*****************************************************
function name: 			NRF905SE_SetTxPayload 	;
function description: set payload  in Tx-Payload register  of NRF905SE;

parameters:
@1-- addr_array : u8 * : the array which contains the payload.
@2-- payload_length :  u8 --- will be  indicated by Tx-payload size.
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes: none.
***********************************************/
void NRF905SE_SetTxPayload(const u8 * addr_array, u8 addr_array_length)
{
NRF905SE_SetTxRxPayload(NRF905SE_WTP, addr_array, addr_array_length);
}

/*****************************************************
function name: 			NRF905SE_GetRxPayload 	;
function description: get Payload  in Rx-Payload register  of NRF905SE;

parameters:
@1-- payload_array : u8 * : the array which will contain the payload .
@2-- payload_length :  u8 --- will be  indicated by tx-payload size;
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
u8 * NRF905SE_GetRxPayload(u8 * payload_array, u8 payload_array_length)
{
NRF905SE_GetTxRxPayload(NRF905SE_RRP, payload_array, payload_array_length);

return payload_array;
}

/*****************************************************
function name: 			NRF905SE_Set_RxPayload 	;
function description: set payload  in Rx-Payload register  of NRF905SE;

parameters:
@1-- addr_array : u8 * : the array which contains the payload.
@2-- payload_length :  u8 --- will be  indicated by Rx-payload size.
return:  none;
author: wzb
time:	2011/5/13/pm

notes:  if the Rx-Payload register is read-only, this function will be dropped! But now the instruction NRF905SE_WRP NOT DEFINED!
***********************************************/
void NRF905SE_SetRxPayload(const u8 * addr_array, u8 addr_array_length)
{
//NRF905SE_Set_TxRxPayload(NRF905SE_WRP=0x25, addr_array, addr_array_length);
}

/************* the generous address register operation functions **************/

/*****************************************************
function name: 			NRF905SE_GetTxRxAddress 	;
function description: get Address  in tx-address/rx-address register  of NRF905SE;

parameters:  @1-- op_r : u8 * --- the operation code of tx-address or rx-address register.
@2-- addr_array : u8 * : the array which contains the address.
@3-- addr_array_length :  u8;
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
u8 * NRF905SE_GetTxRxAddress(u8 op_r, u8* addr_array, u8 addr_array_length)
{
NRF905SE_ReadReg_Bytes(op_r, addr_array, addr_array_length);

return addr_array;
}

/*****************************************************
function name: 			NRF905SE_SetTxRxAddress 	;
function description: set Address  in tx-address/rx-addess register  of NRF905SE;

parameters:  @1-- op_w : u8 * --- the operation code of tx-address or rx-address register.
@2-- addr_array : u8 * : the array which contains the address.
@3-- addr_array_length :  u8;
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
void NRF905SE_SetTxRxAddress(u8 op_w, const u8 * addr_array, u8 addr_array_length)
{
NRF905SE_WriteReg_Bytes(op_w, addr_array, addr_array_length);
}

/*****************************************************
function name: 			NRF905SE_SetTxAddress 	;
function description: set Address  in tx-address register  of NRF905SE;

parameters:
@1-- addr_array : u8 * : the array which contains the address.
@2-- addr_array_length :  u8;
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
void NRF905SE_SetTxAddress( const u8 * addr_array, u8 addr_array_length)
{
NRF905SE_SetTxRxAddress(NRF905SE_WTA, addr_array, addr_array_length);
}

/*****************************************************
function name: 			NRF905SE_GetTxAddress 	;
function description: get Address  in tx-address register  of NRF905SE;

parameters:
@1-- addr_array : u8 * : the array which contains the address.
@2-- addr_array_length :  u8;
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
u8 * NRF905SE_GetTxAddress(u8 * addr_array, u8 addr_array_length)
{
NRF905SE_GetTxRxAddress(NRF905SE_RTA, addr_array, addr_array_length);

return addr_array;
}

/*****************************************************
function name: 			NRF905SE_SetRxAddress 	;
function description: set Address  in Rx-address register  of NRF905SE;

parameters:
@1-- addr_array : u8 * : the array which contains the address.
@2-- addr_array_length :  u8;
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
void NRF905SE_SetRxAddress(const u8 * addr_array, u8 addr_array_length)
{
NRF905SE_SetTxRxAddress(NRF905SE_WRA, addr_array, addr_array_length);
}

/*****************************************************
function name: 			NRF905SE_GetRxAddress 	;
function description: get Address  in Rx-address register  of NRF905SE;

parameters:
@1-- addr_array : u8 * : the array which contains the address.
@2-- addr_array_length :  u8;
return:  u8 *;
author: wzb
time:	2011/5/13/pm

notes:  none;
***********************************************/
u8 * NRF905SE_GetRxAddress(u8 * addr_array, u8 addr_array_length)
{
NRF905SE_GetTxRxAddress(NRF905SE_RRA, addr_array, addr_array_length);

return addr_array;
}

/*******************************************************************************
* Function Name  :  NRF905SE_SendData
* Description    : this functions descripts the process of NRF905SE send data.
*
*
* Input          : None.
* Output         : None.
* Return         : None.
* Note			 : This function will block until data send process  finished,
*						implemented by the while recycle with the flag variable.
*******************************************************************************/
void NRF905SE_SendData(void) {
// set the tx mode
NRF905SE_SetTxMode();

// wait for send finished
while(!( NRF905SE_Is_Data_TxFinished())) ;

// reset the flag
NRF905SE_Reset_Data_TxFinished_Flag();

//set NRF905SE to the standby  mode
NRF905SE_STANDBY();

}

/*******************************************************************************
* Function Name  :  NRF905SE_ReceiveData
* Description    : this functions descripts the process of NRF905SE receive data.
*
*
* Input          : None.
* Output         : None.
* Return         : None.
* Note			 : This function will block until data receive process  finished,
*						implemented by the while recycle with the flag variable.
*******************************************************************************/
void NRF905SE_ReceiveData(void) {
//set rx mode
NRF905SE_SetRxMode();

//wait for recieve finished
while(! ( NRF905SE_Is_Data_RxFinished() ) );

//reset the flag
NRF905SE_Reset_Data_RxFinished_Flag();

//set NRF905SE to the standby  mode
NRF905SE_STANDBY();

}

/******************************packet send /receive **********/

/*******************************************************************************
* Function Name  :  NRF905SE_SendTxPacket
* Description    : this functions descripts the process of NRF905SE send  data, and you can set the payload
and destination address through payload_array and tx_address_array;
*
*
* Input          : payload_size: -- u8 ,.
tx_address_length -- u8;
* Output         : payload_array:  set the data in the Tx_payload register;
tx_address_array --  the destination address to send

* Return         : None.
* Note			 : This function will block until data send process  finished,
*						implemented by the while recycle with the flag variable.
*******************************************************************************/
bool NRF905SE_SendTxPacket(const u8 * payload_array, u8 payload_size, const u8 * tx_address_array, u8 tx_address_length) {

// prepare the data to be sent means set the payload to be sent
NRF905SE_SetTxPayload(payload_array, payload_size);

// set tx-address
NRF905SE_SetTxAddress(tx_address_array, tx_address_length);

// send data
NRF905SE_SendData();

return TRUE;

}

/*******************************************************************************
* Function Name  :  NRF905SE_SendTxPacket
* Description    : this functions descripts the process of NRF905SE receive data, and you can get the payload
through payload_array to the default Tx_address;
*
*
* Input          : payload_size: -- u8 ,.

* Output         : payload_array: set the data in the Tx_payload register;

* Return         : None.
* Note			 : This function will block until data send process  finished,
*						implemented by the while recycle with the flag variable.
*******************************************************************************/
bool NRF905SE_SendPacket(const u8 * payload_array, u8 payload_size) {

// prepare the data to be sent means set the payload to be sent
NRF905SE_SetTxPayload(payload_array, payload_size);

// set tx-address default
//NRF905SE_SetTxAddress(NRF905SE_TxAddress,NRF905SE_AddressSize);

// send data
NRF905SE_SendData();

return TRUE;

}
/*******************************************************************************
* Function Name  :  NRF905SE_ReceivePacket
* Description    : this functions descripts the process of NRF905SE receive data, and you can get the payload
through payload_array;
*
*
* Input          : payload_size: -- u8 ,.
* Output         : payload_array: the data in the Rx_payload register;
* Return         : None.
* Note			 : This function will block until data receive process  finished,
*						implemented by the while recycle with the flag variable.
*******************************************************************************/
u8 *  NRF905SE_ReceivePacket(u8 * payload_array, u8 payload_size) {
// start receive data
NRF905SE_ReceiveData();

// receive data finished
NRF905SE_GetRxPayload(payload_array, payload_size);

return payload_array;

}

/*** interrupt process ****/

void NRF905SE_EXTI_DoIt() {

NRF905SE_DR_FLAG = 1;
EXTI_ClearITPendingBit(EXTI_Line0);

}


3. 后记:本程序中部分GPIO口的配置,外部中断的配置于相应的硬件相关,需要根据具体的板子进行重新配置!

.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息