nRF24L01_driver.rar

  • gathon
    了解作者
  • C/C++
    开发工具
  • 7KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 1
    下载次数
  • 2017-08-14 12:47
    上传日期
nRF24L01驱动,基本上直接将接口修改一下就可以驱动了,这个驱动是买模块时厂家送的,稍微修改了一下。
nRF24L01_driver.rar
  • nRF24L01_driver
  • drv_RF24L01.h
    9.9KB
  • drv_RF24L01.c
    19.4KB
内容介绍
/** ****************************************************************************** * @author gathon * @version V3.0 * @date 2017-08-08 * @brief NRF24L01配置C文件 ****************************************************************************** */ #include "drv_RF24L01.h" #include "spi.h" #include "usart.h" const char *g_ErrorString = "RF24L01 is not find !..."; /* RFTxdata 第9个数据为数据发送请求标识,1:请求发送 0:无数据可发送 */ u8 RFTxdata[9] = {7,1,9,8,3,2,0,1,1}; u8 RFRxdata[8] = {0}; #define drv_spi_read_write_byte(Data) SPI2_ReadWriteByte(Data) /** * @brief :NRF24L01读寄存器 * @param : * @Addr :寄存器地址 * @note :地址在设备中有效 * @retval:读取的数据 */ uint8_t NRF24L01_Read_Reg( uint8_t RegAddr ) { uint8_t btmp; RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( NRF_READ_REG | RegAddr ); //读命令 地址 btmp = drv_spi_read_write_byte( 0xFF ); //读数据 RF24L01_SET_CS_HIGH( ); //取消片选 return btmp; } /** * @brief :NRF24L01读指定长度的数据 * @param : * @reg :地址 * @pBuf :数据存放地址 * @len :数据长度 * @note :数据长度不超过255,地址在设备中有效 * @retval:读取状态 */ void NRF24L01_Read_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len ) { uint8_t btmp; RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( NRF_READ_REG | RegAddr ); //读命令 地址 for( btmp = 0; btmp < len; btmp ++ ) { *( pBuf + btmp ) = drv_spi_read_write_byte( 0xFF ); //读数据 } RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :NRF24L01写寄存器 * @param :无 * @note :地址在设备中有效 * @retval:读写状态 */ void NRF24L01_Write_Reg( uint8_t RegAddr, uint8_t Value ) { RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ); //写命令 地址 drv_spi_read_write_byte( Value ); //写数据 RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :NRF24L01写指定长度的数据 * @param : * @reg :地址 * @pBuf :写入的数据地址 * @len :数据长度 * @note :数据长度不超过255,地址在设备中有效 * @retval:写状态 */ void NRF24L01_Write_Buf( uint8_t RegAddr, uint8_t *pBuf, uint8_t len ) { uint8_t i; RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( NRF_WRITE_REG | RegAddr ); //写命令 地址 for( i = 0; i < len; i ++ ) { drv_spi_read_write_byte( *( pBuf + i ) ); //写数据 } RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :清空TX缓冲区 * @param :无 * @note :无 * @retval:无 */ void NRF24L01_Flush_Tx_Fifo ( void ) { RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( FLUSH_TX ); //清TX FIFO命令 RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :清空RX缓冲区 * @param :无 * @note :无 * @retval:无 */ void NRF24L01_Flush_Rx_Fifo( void ) { RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( FLUSH_RX ); //清RX FIFO命令 RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :重新使用上一包数据 * @param :无 * @note :无 * @retval:无 */ void NRF24L01_Reuse_Tx_Payload( void ) { RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( REUSE_TX_PL ); //重新使用上一包命令 RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :NRF24L01空操作 * @param :无 * @note :无 * @retval:无 */ void NRF24L01_Nop( void ) { RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( NOP ); //空操作命令 RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :NRF24L01读状态寄存器 * @param :无 * @note :无 * @retval:RF24L01状态 */ uint8_t NRF24L01_Read_Status_Register( void ) { uint8_t Status; RF24L01_SET_CS_LOW( ); //片选 Status = drv_spi_read_write_byte( NRF_READ_REG + STATUS ); //读状态寄存器 RF24L01_SET_CS_HIGH( ); //取消片选 return Status; } /** * @brief :NRF24L01清中断 * @param : * @IRQ_Source:中断源 * @note :无 * @retval:清除后状态寄存器的值 */ uint8_t NRF24L01_Clear_IRQ_Flag( uint8_t IRQ_Source ) { uint8_t btmp = 0; IRQ_Source &= ( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ); //中断标志处理 btmp = NRF24L01_Read_Status_Register( ); //读状态寄存器 RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( NRF_WRITE_REG + STATUS ); //写状态寄存器命令 drv_spi_read_write_byte( IRQ_Source | btmp ); //清相应中断标志 RF24L01_SET_CS_HIGH( ); //取消片选 return ( NRF24L01_Read_Status_Register( )); //返回状态寄存器状态 } /** * @brief :读RF24L01中断状态 * @param :无 * @note :无 * @retval:中断状态 */ uint8_t RF24L01_Read_IRQ_Status( void ) { return ( NRF24L01_Read_Status_Register( ) & (( 1 << RX_DR ) | ( 1 << TX_DS ) | ( 1 << MAX_RT ))); //返回中断状态 } /** * @brief :读FIFO中数据宽度 * @param :无 * @note :无 * @retval:数据宽度 */ uint8_t NRF24L01_Read_Top_Fifo_Width( void ) { uint8_t btmp; RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( R_RX_PL_WID ); //读FIFO中数据宽度命令 btmp = drv_spi_read_write_byte( 0xFF ); //读数据 RF24L01_SET_CS_HIGH( ); //取消片选 return btmp; } /** * @brief :读接收到的数据 * @param :无 * @note :无 * @retval: * @pRxBuf:数据存放地址首地址 */ uint8_t NRF24L01_Read_Rx_Payload( uint8_t *pRxBuf ) { uint8_t Width, PipeNum; PipeNum = ( NRF24L01_Read_Reg( STATUS ) >> 1 ) & 0x07; //读接收状态 Width = NRF24L01_Read_Top_Fifo_Width( ); //读接收数据个数 RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( RD_RX_PLOAD ); //读有效数据命令 for( PipeNum = 0; PipeNum < Width; PipeNum ++ ) { *( pRxBuf + PipeNum ) = drv_spi_read_write_byte( 0xFF ); //读数据 } RF24L01_SET_CS_HIGH( ); //取消片选 NRF24L01_Flush_Rx_Fifo( ); //清空RX FIFO return Width; } /** * @brief :发送数据(带应答) * @param : * @pTxBuf:发送数据地址 * @len :长度 * @note :一次不超过32个字节 * @retval:无 */ void NRF24L01_Write_Tx_Payload_Ack( uint8_t *pTxBuf, uint8_t len ) { uint8_t btmp; uint8_t length = ( len > 32 ) ? 32 : len; //数据长达大约32 则只发送32个 NRF24L01_Flush_Tx_Fifo( ); //清TX FIFO RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( WR_TX_PLOAD ); //发送命令 for( btmp = 0; btmp < length; btmp ++ ) { drv_spi_read_write_byte( *( pTxBuf + btmp ) ); //发送数据 } RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :发送数据(不带应答) * @param : * @pTxBuf:发送数据地址 * @len :长度 * @note :一次不超过32个字节 * @retval:无 */ void NRF24L01_Write_Tx_Payload_NoAck( uint8_t *pTxBuf, uint8_t len ) { if( len > 32 || len == 0 ) { return ; //数据长度大于32 或者等于0 不执行 } RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( WR_TX_PLOAD_NACK ); //发送命令 while( len-- ) { drv_spi_read_write_byte( *pTxBuf ); //发送数据 pTxBuf++; } RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :在接收模式下向TX FIFO写数据(带ACK) * @param : * @pData :数据地址 * @len :长度 * @note :一次不超过32个字节 * @retval:无 */ void NRF24L01_Write_Tx_Payload_InAck( uint8_t *pData, uint8_t len ) { uint8_t btmp; len = ( len > 32 ) ? 32 : len; //数据长度大于32个则只写32个字节 RF24L01_SET_CS_LOW( ); //片选 drv_spi_read_write_byte( W_ACK_PLOAD ); //命令 for( btmp = 0; btmp < len; btmp ++ ) { drv_spi_read_write_byte( *( pData + btmp ) ); //写数据 } RF24L01_SET_CS_HIGH( ); //取消片选 } /** * @brief :设置发送地址 * @param : * @pAddr :地址存放地址 * @len :长度 * @note :无 * @retval:无 */ void NRF24L01_S
评论
    相关推荐