Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: RC_Green Drown RC_RX
nRF24L01P.cpp@8:62cdaa369cfa, 2019-12-15 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |