前段时间,写了一个基于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口的配置,外部中断的配置于相应的硬件相关,需要根据具体的板子进行重新配置!
.