nrf24l01.h
1 #define uchar unsigned char 2 #define uint unsigned int 3 4 //****************************************IO端口定义*************************************** 5 6 #define CE_PORT P5OUT 7 #define CSN_PORT P5OUT 8 #define SCK_PORT P5OUT 9 #define MOSI_PORT P4OUT 10 #define MISO_PORT P4IN 11 #define IRQ_PORT P4OUT 12 13 #define CE_BIT BIT1 14 #define CSN_BIT BIT3 15 #define SCK_BIT BIT2 16 #define MOSI_BIT BIT5 17 #define MISO_BIT BIT4 18 #define IRQ_BIT BIT2 19 20 21 //*********************************************NRF24L01************************************* 22 23 #define TX_ADR_WIDTH 5 // 5 uints TX address width 24 #define RX_ADR_WIDTH 5 // 5 uints RX address width 25 #define TX_PLOAD_WIDTH 20 // 20 uints TX payload 26 #define RX_PLOAD_WIDTH 20 // 20 uints TX payload 27 28 29 //***************************************NRF24L01寄存器指令******************************************************* 30 31 #define READ_REG 0x00 // 读寄存器指令 32 #define WRITE_REG 0x20 // 写寄存器指令 33 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 34 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 35 #define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令 36 #define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令 37 #define REUSE_TX_PL 0xE3 // 定义重复装载数据指令 38 #define NOP 0xFF // 保留 39 40 //*************************************SPI(nRF24L01)寄存器地址**************************************************** 41 42 #define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式 43 #define EN_AA 0x01 // 自动应答功能设置 44 #define EN_RXADDR 0x02 // 可用信道设置 45 #define SETUP_AW 0x03 // 收发地址宽度设置 46 #define SETUP_RETR 0x04 // 自动重发功能设置 47 #define RF_CH 0x05 // 工作频率设置 48 #define RF_SETUP 0x06 // 发射速率、功耗功能设置 49 #define STATUS 0x07 // 状态寄存器 50 #define OBSERVE_TX 0x08 // 发送监测功能 51 #define CD 0x09 // 地址检测 52 #define RX_ADDR_P0 0x0A // 频道0接收数据地址 53 #define RX_ADDR_P1 0x0B // 频道1接收数据地址 54 #define RX_ADDR_P2 0x0C // 频道2接收数据地址 55 #define RX_ADDR_P3 0x0D // 频道3接收数据地址 56 #define RX_ADDR_P4 0x0E // 频道4接收数据地址 57 #define RX_ADDR_P5 0x0F // 频道5接收数据地址 58 #define TX_ADDR 0x10 // 发送地址寄存器 59 #define RX_PW_P0 0x11 // 接收频道0接收数据长度 60 #define RX_PW_P1 0x12 // 接收频道0接收数据长度 61 #define RX_PW_P2 0x13 // 接收频道0接收数据长度 62 #define RX_PW_P3 0x14 // 接收频道0接收数据长度 63 #define RX_PW_P4 0x15 // 接收频道0接收数据长度 64 #define RX_PW_P5 0x16 // 接收频道0接收数据长度 65 #define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置 66 67 68 void Delay(unsigned int x); 69 void InerDelay_us(unsigned long n); 70 void Init_NRF24L01(void); 71 uint SPI_RW(uint uuchar); 72 uchar SPI_Read(uchar reg); 73 void SetRX_Mode(void); 74 uint SPI_RW_Reg(uchar reg, uchar value); 75 uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); 76 uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); 77 unsigned char NRF24L01_RxPacket(unsigned char* rx_buf); 78 void NRF24L01_TxPacket(unsigned char * tx_buf) ;
nrf24l01.c
1 #include <msp430f149.h> 2 #include "nrf24l01.h" 3 4 //************************************************************************************** 5 6 uint sta; //状态标志 7 8 #define RX_DR sta & BIT6 9 #define TX_DS sta & BIT5 10 #define MAX_RT sta & BIT4 11 12 uchar RX_ADDRESS[RX_ADR_WIDTH]= {0x10,0x10,0x10,0x10,0x10}; //接收地址 13 uchar TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; 14 15 void Init_NRF24L01(void) 16 { 17 //配置端口 18 P4DIR &= ~MISO_BIT; 19 P4DIR |= MOSI_BIT + IRQ_BIT ; 20 P5DIR |= CE_BIT + SCK_BIT + CSN_BIT; 21 22 __delay_cycles(800); 23 CE_PORT &= ~ CE_BIT; //CE=0; 24 CSN_PORT |= CSN_BIT; // CSN=1; 25 SCK_PORT &= ~SCK_BIT; //SCK=0; 26 27 28 SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写发送端地址 29 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收的地址 30 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许禁止 4 31 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0 5 发送时注意这两点 32 SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); //禁止自动重发 33 SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致 34 SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 35 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB 36 } 37 38 uint SPI_RW(uint uuchar) 39 { 40 uint bit_ctr; 41 42 for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit 43 { 44 if(uuchar & 0x80) MOSI_PORT |= MOSI_BIT; // output 'uchar', MSB to MOSI 45 else MOSI_PORT &= ~MOSI_BIT; 46 uuchar = (uuchar << 1); // shift next bit into MSB.. 47 SCK_PORT |= SCK_BIT; //SCK=1; // Set SCK high.. 48 if(MISO_PORT & MISO_BIT) 49 uuchar |= 0x01; // capture current MISO bit 50 SCK_PORT &= ~SCK_BIT; //SCK=0; // ..then set SCK low again 51 } 52 return(uuchar); // return read uchar 53 } 54 55 56 57 58 uchar SPI_Read(uchar reg) 59 { 60 uchar reg_val; 61 62 CSN_PORT &= ~CSN_BIT; //CSN = 0; // CSN low, initialize SPI communication... 63 SPI_RW(reg); // Select register to read from.. 64 reg_val = SPI_RW(0); // ..then read registervalue 65 CSN_PORT |= CSN_BIT; // CSN = 1; // CSN high, terminate SPI communication 66 return(reg_val); // return register value 67 } 68 69 70 71 72 uint SPI_RW_Reg(uchar reg, uchar value) 73 { 74 uint status; 75 76 CSN_PORT &= ~CSN_BIT; //CSN = 0; // CSN low, init SPI transaction 77 status = SPI_RW(reg); // select register 78 SPI_RW(value); // ..and write value to it.. 79 CSN_PORT |= CSN_BIT;//CSN = 1; // CSN high again 80 return(status); // return nRF24L01 status uchar 81 } 82 83 84 85 86 uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) 87 { 88 89 uint status,uchar_ctr; 90 91 CSN_PORT &= ~CSN_BIT;//CSN = 0; // Set CSN low, init SPI tranaction 92 status = SPI_RW(reg); // Select register to write to and read status uchar 93 for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++) 94 { 95 pBuf[uchar_ctr] = SPI_RW(0); // 96 } 97 CSN_PORT |= CSN_BIT;//CSN = 1; 98 return(status); // return nRF24L01 status uchar 99 } 100 101 102 103 104 uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) 105 { 106 uint status,uchar_ctr; 107 108 CSN_PORT &= ~CSN_BIT;// CSN = 0; //SPI使能 109 status = SPI_RW(reg); 110 for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) // 111 { 112 SPI_RW(*pBuf++); 113 } 114 CSN_PORT |= CSN_BIT;//CSN = 1; //关闭SPI 115 return(status); // 116 } 117 118 119 120 121 void SetRX_Mode(void) 122 { 123 CE_PORT &= ~CE_BIT;//CE = 0; 124 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收 125 CE_PORT |= CE_BIT;//CE = 1; 126 //InerDelay_us(130); 127 __delay_cycles(1000); 128 } 129 130 131 132 133 unsigned char NRF24L01_RxPacket(unsigned char* rx_buf) 134 135 { 136 unsigned char revale=0; 137 sta = SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况 138 if(RX_DR) // 判断是否接收到数据 139 { 140 CE_PORT &= ~CE_BIT; //CE = 0; //SPI使能 141 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer 142 revale =1; //读取数据完成标志 143 } 144 SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志 145 return revale; 146 } 147 148 149 150 void NRF24L01_TxPacket(unsigned char * tx_buf) 151 152 { 153 CE_PORT &= ~CE_BIT; //CE = 0; //StandBy I模式 154 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据 155 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送 156 CE_PORT |= CE_BIT; // CE = 1; //置高CE,激发数据发送 157 //InerDelay_us(50); 158 __delay_cycles(400); 159 }