nRF24L01 library adapt to RangeFire

Dependents:   RC_Green Drown RC_RX

Committer:
Ucial
Date:
Sun Dec 15 02:48:57 2019 +0000
Revision:
8:62cdaa369cfa
Parent:
7:fa987efaeecd
complish RX and TX

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ucial 0:4caead137300 1 #include "nRF24L01P.h"
Ucial 0:4caead137300 2
Ucial 1:c41959327807 3
Ucial 0:4caead137300 4 uint8_t NRF24L01_RXDATA[32];
Ucial 0:4caead137300 5 uint8_t NRF24L01_TXDATA[32];
Ucial 5:d0c9b8b5cf75 6 uint8_t TX_ADDRESS[5]= {0x00,0x00,0x00,0x00,0x08};
Ucial 5:d0c9b8b5cf75 7 uint8_t RX_ADDRESS[5]= {0x00,0x00,0x00,0x00,0x08};
Ucial 0:4caead137300 8 int Nrf_Erro=0;
Ucial 0:4caead137300 9 int ledtick;
Ucial 5:d0c9b8b5cf75 10
Ucial 5:d0c9b8b5cf75 11
Ucial 5:d0c9b8b5cf75 12 void nRF24L01P::setRxAddress(int RxAdd)
Ucial 5:d0c9b8b5cf75 13 {
Ucial 5:d0c9b8b5cf75 14 RX_ADDRESS[4]=RxAdd&0xFF;
Ucial 5:d0c9b8b5cf75 15 }
Ucial 5:d0c9b8b5cf75 16 void nRF24L01P::setTxAddress(int TxAdd)
Ucial 5:d0c9b8b5cf75 17 {
Ucial 5:d0c9b8b5cf75 18 TX_ADDRESS[4]=TxAdd&0xFF;
Ucial 5:d0c9b8b5cf75 19 }
Ucial 0:4caead137300 20
Ucial 0:4caead137300 21 uint8_t nRF24L01P::NRF_Read_Reg(uint8_t reg)
Ucial 0:4caead137300 22 {
Ucial 0:4caead137300 23 uint8_t reg_val;
Ucial 0:4caead137300 24 nCS_=0;
Ucial 0:4caead137300 25 spi_.write(reg);
Ucial 0:4caead137300 26 reg_val = spi_.write(0);
Ucial 0:4caead137300 27 nCS_=1;
Ucial 0:4caead137300 28 return reg_val;
Ucial 0:4caead137300 29
Ucial 0:4caead137300 30 }
Ucial 0:4caead137300 31 uint8_t nRF24L01P::NRF_Write_Reg(uint8_t reg, uint8_t value)
Ucial 0:4caead137300 32 {
Ucial 0:4caead137300 33 uint8_t status;
Ucial 0:4caead137300 34 nCS_=0;
Ucial 0:4caead137300 35 status = spi_.write(reg);
Ucial 0:4caead137300 36 spi_.write(value);
Ucial 0:4caead137300 37 nCS_=1;
Ucial 0:4caead137300 38 return status;
Ucial 0:4caead137300 39 }
Ucial 0:4caead137300 40 uint8_t nRF24L01P::NRF_Read_Buff(uint8_t reg, uint8_t *pBuf, uint8_t uchars)
Ucial 0:4caead137300 41 {
Ucial 0:4caead137300 42 uint8_t i;
Ucial 0:4caead137300 43 uint8_t status;
Ucial 0:4caead137300 44 nCS_=0;
Ucial 0:4caead137300 45 status = spi_.write(reg);
Ucial 0:4caead137300 46 for(i=0; i<uchars; i++)
Ucial 0:4caead137300 47 {
Ucial 0:4caead137300 48 pBuf[i] = spi_.write(0);
Ucial 0:4caead137300 49 }
Ucial 0:4caead137300 50 nCS_=1;
Ucial 0:4caead137300 51 return status;
Ucial 0:4caead137300 52 }
Ucial 0:4caead137300 53 uint8_t nRF24L01P::NRF_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars)
Ucial 0:4caead137300 54 {
Ucial 0:4caead137300 55 uint8_t i;
Ucial 0:4caead137300 56 uint8_t status;
Ucial 0:4caead137300 57 nCS_=0;
Ucial 0:4caead137300 58 status = spi_.write(reg);
Ucial 0:4caead137300 59 for(i=0; i<uchars; i++)
Ucial 0:4caead137300 60 {
Ucial 0:4caead137300 61 spi_.write(pBuf[i]);
Ucial 0:4caead137300 62 }
Ucial 0:4caead137300 63 nCS_=1;
Ucial 0:4caead137300 64 return status;
Ucial 0:4caead137300 65 }
Ucial 0:4caead137300 66 void nRF24L01P::NRF24L01_Set_TX(void)
Ucial 0:4caead137300 67 {
Ucial 0:4caead137300 68 ce_=0;
Ucial 8:62cdaa369cfa 69 NRF_Write_Reg(NRF_WRITE_REG + CONFIG,0x0E);
Ucial 0:4caead137300 70 ce_=1;
Ucial 0:4caead137300 71 }
Ucial 0:4caead137300 72 void nRF24L01P::NRF24L01_Set_RX(void)
Ucial 0:4caead137300 73 {
Ucial 0:4caead137300 74 ce_=0;
Ucial 0:4caead137300 75 NRF_Write_Reg(NRF_WRITE_REG + CONFIG,0x0F);//½ÓÊÕ
Ucial 0:4caead137300 76 ce_=1;
Ucial 0:4caead137300 77 }
Ucial 0:4caead137300 78 void nRF24L01P::NRF_Send_TX(uint8_t * tx_buf, uint8_t len)
Ucial 0:4caead137300 79 {
Ucial 8:62cdaa369cfa 80 NRF24L01_Set_TX();
Ucial 0:4caead137300 81 ce_=0;
Ucial 8:62cdaa369cfa 82 NRF_Write_Buf(WR_TX_PLOAD, tx_buf, len);
Ucial 0:4caead137300 83 ce_=1;
Ucial 0:4caead137300 84 wait_us(10);
Ucial 0:4caead137300 85 ledtick++;
Ucial 0:4caead137300 86 if(ledtick>=50)
Ucial 0:4caead137300 87 {
Ucial 0:4caead137300 88 check_led=!check_led;
Ucial 0:4caead137300 89 ledtick=0;
Ucial 0:4caead137300 90 }
Ucial 0:4caead137300 91 }
Ucial 2:bee3d3ba881f 92 void nRF24L01P::NRF_Send_TX(int * tx_buf, uint8_t len)
Ucial 2:bee3d3ba881f 93 {
Ucial 2:bee3d3ba881f 94 uint8_t i;
Ucial 2:bee3d3ba881f 95 uint8_t tx_buff[32];
Ucial 2:bee3d3ba881f 96 for(i=0;i<len;i++)
Ucial 2:bee3d3ba881f 97 tx_buff[i]=tx_buf[i]&0xFF;
Ucial 8:62cdaa369cfa 98 NRF24L01_Set_TX();
Ucial 2:bee3d3ba881f 99 ce_=0;
Ucial 8:62cdaa369cfa 100 NRF_Write_Buf(WR_TX_PLOAD, tx_buff, len);
Ucial 2:bee3d3ba881f 101 ce_=1;
Ucial 2:bee3d3ba881f 102 wait_us(10);
Ucial 2:bee3d3ba881f 103 ledtick++;
Ucial 2:bee3d3ba881f 104 if(ledtick>=50)
Ucial 2:bee3d3ba881f 105 {
Ucial 2:bee3d3ba881f 106 check_led=!check_led;
Ucial 2:bee3d3ba881f 107 ledtick=0;
Ucial 2:bee3d3ba881f 108 }
Ucial 2:bee3d3ba881f 109 }
Ucial 0:4caead137300 110 nRF24L01P::nRF24L01P(PinName mosi,
Ucial 0:4caead137300 111 PinName miso,
Ucial 0:4caead137300 112 PinName sck,
Ucial 0:4caead137300 113 PinName csn,
Ucial 0:4caead137300 114 PinName ce,
Ucial 0:4caead137300 115 PinName irq):spi_(mosi,miso,sck),nCS_(csn),ce_(ce),nIRQ_(irq),check_led(PC_13)
Ucial 0:4caead137300 116 {
Ucial 0:4caead137300 117 nCS_ = 1;
Ucial 0:4caead137300 118
Ucial 0:4caead137300 119 spi_.frequency(9000000);
Ucial 0:4caead137300 120 spi_.format(8,0);
Ucial 0:4caead137300 121 wait_us(4); // Wait for Power-on reset
Ucial 0:4caead137300 122 }
Ucial 0:4caead137300 123
Ucial 0:4caead137300 124
Ucial 0:4caead137300 125 void nRF24L01P::NRF24L01_Check(void)
Ucial 0:4caead137300 126 {
Ucial 0:4caead137300 127 uint8_t buf[5];
Ucial 0:4caead137300 128 uint8_t i;
Ucial 0:4caead137300 129 NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,5);
Ucial 0:4caead137300 130 NRF_Read_Buff(TX_ADDR,buf,5);
Ucial 0:4caead137300 131 for(i=0;i<5;i++)
Ucial 0:4caead137300 132 {
Ucial 0:4caead137300 133 if(buf[i]!=TX_ADDRESS[i])
Ucial 0:4caead137300 134 break;
Ucial 0:4caead137300 135 }
Ucial 0:4caead137300 136
Ucial 0:4caead137300 137 if(i==5)
Ucial 0:4caead137300 138 {
Ucial 0:4caead137300 139 uint8_t ledt;
Ucial 0:4caead137300 140 for(ledt=0;ledt<5;ledt++)
Ucial 0:4caead137300 141 {
Ucial 0:4caead137300 142 check_led=0;
Ucial 0:4caead137300 143 wait_ms(100);
Ucial 0:4caead137300 144 check_led=1;
Ucial 0:4caead137300 145 wait_ms(100);
Ucial 0:4caead137300 146 }
Ucial 0:4caead137300 147 }
Ucial 8:62cdaa369cfa 148 else
Ucial 8:62cdaa369cfa 149 {
Ucial 8:62cdaa369cfa 150 uint8_t ledt;
Ucial 8:62cdaa369cfa 151 for(ledt=0;ledt<2;ledt++)
Ucial 8:62cdaa369cfa 152 {
Ucial 8:62cdaa369cfa 153 check_led=0;
Ucial 8:62cdaa369cfa 154 wait_ms(500);
Ucial 8:62cdaa369cfa 155 check_led=1;
Ucial 8:62cdaa369cfa 156 wait_ms(500);
Ucial 8:62cdaa369cfa 157 }
Ucial 8:62cdaa369cfa 158 }
Ucial 0:4caead137300 159 }
Ucial 0:4caead137300 160 void nRF24L01P::NRF24L01_Init(uint8_t Chanal,uint8_t Mode)
Ucial 0:4caead137300 161 {
Ucial 7:fa987efaeecd 162 // init_time++;
Ucial 7:fa987efaeecd 163 // if(init_time>=3)
Ucial 7:fa987efaeecd 164 // return;
Ucial 0:4caead137300 165 ce_=0;
Ucial 0:4caead137300 166 ledtick=0;
Ucial 0:4caead137300 167 NRF_Write_Reg(FLUSH_TX,0xff);
Ucial 0:4caead137300 168 NRF_Write_Reg(FLUSH_RX,0xff);
Ucial 0:4caead137300 169 NRF_Write_Buf(NRF_WRITE_REG + TX_ADDR, TX_ADDRESS,5);
Ucial 0:4caead137300 170 NRF_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0,RX_ADDRESS,5);
Ucial 0:4caead137300 171
Ucial 0:4caead137300 172 NRF_Write_Reg(NRF_WRITE_REG + EN_AA, 0x01);
Ucial 0:4caead137300 173 NRF_Write_Reg(NRF_WRITE_REG + EN_RXADDR, 0x01);
Ucial 0:4caead137300 174 NRF_Write_Reg(NRF_WRITE_REG + SETUP_RETR,0x1a);
Ucial 0:4caead137300 175 NRF_Write_Reg(NRF_WRITE_REG + RF_CH, Chanal);
Ucial 0:4caead137300 176 NRF_Write_Reg(NRF_WRITE_REG + RX_PW_P0, 32);
Ucial 0:4caead137300 177 NRF_Write_Reg(NRF_WRITE_REG + RF_SETUP, 0x0f);
Ucial 0:4caead137300 178
Ucial 0:4caead137300 179 if(Mode==TX)
Ucial 0:4caead137300 180 NRF_Write_Reg(NRF_WRITE_REG + CONFIG,0x0E);
Ucial 0:4caead137300 181 else if(Mode==RX)
Ucial 0:4caead137300 182 NRF_Write_Reg(NRF_WRITE_REG + CONFIG,0x0F);
Ucial 8:62cdaa369cfa 183
Ucial 0:4caead137300 184 ce_=1;
Ucial 0:4caead137300 185 }
Ucial 0:4caead137300 186 void nRF24L01P::NRF24L01_IRQ(void)
Ucial 0:4caead137300 187 {
Ucial 0:4caead137300 188 uint8_t status = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS);
Ucial 0:4caead137300 189
Ucial 8:62cdaa369cfa 190 if(status & (1<<RX_DR))//RX中断
Ucial 0:4caead137300 191 {
Ucial 8:62cdaa369cfa 192 uint8_t rx_len = NRF_Read_Reg(R_RX_PL_WID);
Ucial 0:4caead137300 193 if(rx_len==32)
Ucial 0:4caead137300 194 {
Ucial 8:62cdaa369cfa 195 NRF_Read_Buff(RD_RX_PLOAD,NRF24L01_RXDATA,rx_len);//读取FIFO
Ucial 0:4caead137300 196 Nrf_Erro = 0;
Ucial 0:4caead137300 197 }
Ucial 0:4caead137300 198 else
Ucial 0:4caead137300 199 {
Ucial 8:62cdaa369cfa 200 NRF_Write_Reg(FLUSH_RX,0xff);//清空RX缓存
Ucial 0:4caead137300 201 }
Ucial 0:4caead137300 202 }
Ucial 8:62cdaa369cfa 203 if(status & (1<<MAX_RT))//达到最大重发次数
Ucial 0:4caead137300 204 {
Ucial 8:62cdaa369cfa 205 if(status & (1<<TX_FULL))//TX FIFO 溢出
Ucial 0:4caead137300 206 {
Ucial 8:62cdaa369cfa 207 NRF_Write_Reg(FLUSH_TX,0xff);//清空发送缓存
Ucial 0:4caead137300 208 }
Ucial 0:4caead137300 209 }
Ucial 8:62cdaa369cfa 210 NRF24L01_Set_RX();
Ucial 8:62cdaa369cfa 211 NRF_Write_Reg(NRF_WRITE_REG + NRFRegSTATUS, status);
Ucial 8:62cdaa369cfa 212 }
Ucial 8:62cdaa369cfa 213 void nRF24L01P::NRF24L01_Analyse(int* data)
Ucial 8:62cdaa369cfa 214 {
Ucial 8:62cdaa369cfa 215 uint8_t i;
Ucial 8:62cdaa369cfa 216 for(i=0;i<32;i++)
Ucial 8:62cdaa369cfa 217 data[i]=NRF24L01_RXDATA[i];
Ucial 0:4caead137300 218 }
Ucial 8:62cdaa369cfa 219 void nRF24L01P::Nrf_Connect(int* data)//1KHZ
Ucial 1:c41959327807 220 {
Ucial 8:62cdaa369cfa 221 Nrf_Erro ++;
Ucial 8:62cdaa369cfa 222 if(Nrf_Erro==1)
Ucial 8:62cdaa369cfa 223 {
Ucial 8:62cdaa369cfa 224 NRF24L01_Analyse(data);
Ucial 8:62cdaa369cfa 225 }
Ucial 8:62cdaa369cfa 226 if(Nrf_Erro%100==0)
Ucial 1:c41959327807 227 {
Ucial 1:c41959327807 228 NRF24L01_IRQ();
Ucial 1:c41959327807 229 }
Ucial 8:62cdaa369cfa 230 if(Nrf_Erro>=1000)
Ucial 1:c41959327807 231 {
Ucial 1:c41959327807 232 Nrf_Erro = 1;
Ucial 8:62cdaa369cfa 233
Ucial 1:c41959327807 234 }
Ucial 1:c41959327807 235 }