fds
nRF24L01P.cpp@2:6c547cdb94e6, 2019-12-09 (annotated)
- Committer:
- brainliang
- Date:
- Mon Dec 09 09:13:59 2019 +0000
- Revision:
- 2:6c547cdb94e6
- Parent:
- 1:c41959327807
ade
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 | 0:4caead137300 | 6 | static uint8_t TX_ADDRESS[5]= {0x00,0x00,0x00,0x00,0x08}; |
Ucial | 0:4caead137300 | 7 | static 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 | 0:4caead137300 | 10 | |
Ucial | 0:4caead137300 | 11 | uint8_t nRF24L01P::NRF_Read_Reg(uint8_t reg) |
Ucial | 0:4caead137300 | 12 | { |
Ucial | 0:4caead137300 | 13 | uint8_t reg_val; |
Ucial | 0:4caead137300 | 14 | nCS_=0; |
Ucial | 0:4caead137300 | 15 | spi_.write(reg); |
Ucial | 0:4caead137300 | 16 | reg_val = spi_.write(0); |
Ucial | 0:4caead137300 | 17 | nCS_=1; |
Ucial | 0:4caead137300 | 18 | return reg_val; |
Ucial | 0:4caead137300 | 19 | |
Ucial | 0:4caead137300 | 20 | } |
Ucial | 0:4caead137300 | 21 | uint8_t nRF24L01P::NRF_Write_Reg(uint8_t reg, uint8_t value) |
Ucial | 0:4caead137300 | 22 | { |
Ucial | 0:4caead137300 | 23 | uint8_t status; |
Ucial | 0:4caead137300 | 24 | nCS_=0; |
Ucial | 0:4caead137300 | 25 | status = spi_.write(reg); |
Ucial | 0:4caead137300 | 26 | spi_.write(value); |
Ucial | 0:4caead137300 | 27 | nCS_=1; |
Ucial | 0:4caead137300 | 28 | return status; |
Ucial | 0:4caead137300 | 29 | } |
Ucial | 0:4caead137300 | 30 | uint8_t nRF24L01P::NRF_Read_Buff(uint8_t reg, uint8_t *pBuf, uint8_t uchars) |
Ucial | 0:4caead137300 | 31 | { |
Ucial | 0:4caead137300 | 32 | uint8_t i; |
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 | for(i=0; i<uchars; i++) |
Ucial | 0:4caead137300 | 37 | { |
Ucial | 0:4caead137300 | 38 | pBuf[i] = spi_.write(0); |
Ucial | 0:4caead137300 | 39 | } |
Ucial | 0:4caead137300 | 40 | nCS_=1; |
Ucial | 0:4caead137300 | 41 | return status; |
Ucial | 0:4caead137300 | 42 | } |
Ucial | 0:4caead137300 | 43 | uint8_t nRF24L01P::NRF_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t uchars) |
Ucial | 0:4caead137300 | 44 | { |
Ucial | 0:4caead137300 | 45 | uint8_t i; |
Ucial | 0:4caead137300 | 46 | uint8_t status; |
Ucial | 0:4caead137300 | 47 | nCS_=0; |
Ucial | 0:4caead137300 | 48 | status = spi_.write(reg); |
Ucial | 0:4caead137300 | 49 | for(i=0; i<uchars; i++) |
Ucial | 0:4caead137300 | 50 | { |
Ucial | 0:4caead137300 | 51 | spi_.write(pBuf[i]); |
Ucial | 0:4caead137300 | 52 | } |
Ucial | 0:4caead137300 | 53 | nCS_=1; |
Ucial | 0:4caead137300 | 54 | return status; |
Ucial | 0:4caead137300 | 55 | } |
Ucial | 0:4caead137300 | 56 | void nRF24L01P::NRF24L01_Set_TX(void) |
Ucial | 0:4caead137300 | 57 | { |
Ucial | 0:4caead137300 | 58 | ce_=0; |
Ucial | 0:4caead137300 | 59 | nRF24L01P::NRF_Write_Reg(NRF_WRITE_REG + CONFIG,0x0E); |
Ucial | 0:4caead137300 | 60 | ce_=1; |
Ucial | 0:4caead137300 | 61 | } |
Ucial | 0:4caead137300 | 62 | void nRF24L01P::NRF24L01_Set_RX(void) |
Ucial | 0:4caead137300 | 63 | { |
Ucial | 0:4caead137300 | 64 | ce_=0; |
Ucial | 0:4caead137300 | 65 | NRF_Write_Reg(NRF_WRITE_REG + CONFIG,0x0F);//½ÓÊÕ |
Ucial | 0:4caead137300 | 66 | ce_=1; |
Ucial | 0:4caead137300 | 67 | } |
Ucial | 0:4caead137300 | 68 | void nRF24L01P::NRF_Send_TX(uint8_t * tx_buf, uint8_t len) |
Ucial | 0:4caead137300 | 69 | { |
Ucial | 0:4caead137300 | 70 | nRF24L01P::NRF24L01_Set_TX(); |
Ucial | 0:4caead137300 | 71 | ce_=0; |
Ucial | 0:4caead137300 | 72 | nRF24L01P::NRF_Write_Buf(WR_TX_PLOAD, tx_buf, len); |
Ucial | 0:4caead137300 | 73 | ce_=1; |
Ucial | 0:4caead137300 | 74 | wait_us(10); |
Ucial | 0:4caead137300 | 75 | ledtick++; |
Ucial | 0:4caead137300 | 76 | if(ledtick>=50) |
Ucial | 0:4caead137300 | 77 | { |
Ucial | 0:4caead137300 | 78 | check_led=!check_led; |
Ucial | 0:4caead137300 | 79 | ledtick=0; |
Ucial | 0:4caead137300 | 80 | } |
Ucial | 0:4caead137300 | 81 | } |
Ucial | 0:4caead137300 | 82 | nRF24L01P::nRF24L01P(PinName mosi, |
Ucial | 0:4caead137300 | 83 | PinName miso, |
Ucial | 0:4caead137300 | 84 | PinName sck, |
Ucial | 0:4caead137300 | 85 | PinName csn, |
Ucial | 0:4caead137300 | 86 | PinName ce, |
Ucial | 0:4caead137300 | 87 | PinName irq):spi_(mosi,miso,sck),nCS_(csn),ce_(ce),nIRQ_(irq),check_led(PC_13) |
Ucial | 0:4caead137300 | 88 | { |
Ucial | 0:4caead137300 | 89 | nCS_ = 1; |
Ucial | 0:4caead137300 | 90 | |
Ucial | 0:4caead137300 | 91 | spi_.frequency(9000000); |
Ucial | 0:4caead137300 | 92 | spi_.format(8,0); |
Ucial | 0:4caead137300 | 93 | wait_us(4); // Wait for Power-on reset |
Ucial | 1:c41959327807 | 94 | NRF24L01_Init(40,1); |
Ucial | 1:c41959327807 | 95 | NRF24L01_Check(); |
Ucial | 0:4caead137300 | 96 | } |
Ucial | 0:4caead137300 | 97 | |
Ucial | 0:4caead137300 | 98 | |
Ucial | 0:4caead137300 | 99 | void nRF24L01P::NRF24L01_Check(void) |
Ucial | 0:4caead137300 | 100 | { |
Ucial | 0:4caead137300 | 101 | uint8_t buf[5]; |
Ucial | 0:4caead137300 | 102 | uint8_t i; |
Ucial | 0:4caead137300 | 103 | NRF_Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,5); |
Ucial | 0:4caead137300 | 104 | NRF_Read_Buff(TX_ADDR,buf,5); |
Ucial | 0:4caead137300 | 105 | for(i=0;i<5;i++) |
Ucial | 0:4caead137300 | 106 | { |
Ucial | 0:4caead137300 | 107 | if(buf[i]!=TX_ADDRESS[i]) |
Ucial | 0:4caead137300 | 108 | break; |
Ucial | 0:4caead137300 | 109 | } |
Ucial | 0:4caead137300 | 110 | |
Ucial | 0:4caead137300 | 111 | if(i==5) |
Ucial | 0:4caead137300 | 112 | { |
Ucial | 0:4caead137300 | 113 | uint8_t ledt; |
Ucial | 0:4caead137300 | 114 | for(ledt=0;ledt<5;ledt++) |
Ucial | 0:4caead137300 | 115 | { |
Ucial | 0:4caead137300 | 116 | check_led=0; |
Ucial | 0:4caead137300 | 117 | wait_ms(100); |
Ucial | 0:4caead137300 | 118 | check_led=1; |
Ucial | 0:4caead137300 | 119 | wait_ms(100); |
Ucial | 0:4caead137300 | 120 | } |
Ucial | 0:4caead137300 | 121 | } |
Ucial | 0:4caead137300 | 122 | } |
Ucial | 0:4caead137300 | 123 | void nRF24L01P::NRF24L01_Init(uint8_t Chanal,uint8_t Mode) |
Ucial | 0:4caead137300 | 124 | { |
Ucial | 0:4caead137300 | 125 | ce_=0; |
Ucial | 0:4caead137300 | 126 | ledtick=0; |
Ucial | 0:4caead137300 | 127 | NRF_Write_Reg(FLUSH_TX,0xff); |
Ucial | 0:4caead137300 | 128 | NRF_Write_Reg(FLUSH_RX,0xff); |
Ucial | 0:4caead137300 | 129 | NRF_Write_Buf(NRF_WRITE_REG + TX_ADDR, TX_ADDRESS,5); |
Ucial | 0:4caead137300 | 130 | NRF_Write_Buf(NRF_WRITE_REG + RX_ADDR_P0,RX_ADDRESS,5); |
Ucial | 0:4caead137300 | 131 | |
Ucial | 0:4caead137300 | 132 | NRF_Write_Reg(NRF_WRITE_REG + EN_AA, 0x01); |
Ucial | 0:4caead137300 | 133 | NRF_Write_Reg(NRF_WRITE_REG + EN_RXADDR, 0x01); |
Ucial | 0:4caead137300 | 134 | NRF_Write_Reg(NRF_WRITE_REG + SETUP_RETR,0x1a); |
Ucial | 0:4caead137300 | 135 | NRF_Write_Reg(NRF_WRITE_REG + RF_CH, Chanal); |
Ucial | 0:4caead137300 | 136 | NRF_Write_Reg(NRF_WRITE_REG + RX_PW_P0, 32); |
Ucial | 0:4caead137300 | 137 | NRF_Write_Reg(NRF_WRITE_REG + RF_SETUP, 0x0f); |
Ucial | 0:4caead137300 | 138 | |
Ucial | 0:4caead137300 | 139 | if(Mode==TX) |
Ucial | 0:4caead137300 | 140 | NRF_Write_Reg(NRF_WRITE_REG + CONFIG,0x0E); |
Ucial | 0:4caead137300 | 141 | else if(Mode==RX) |
Ucial | 0:4caead137300 | 142 | NRF_Write_Reg(NRF_WRITE_REG + CONFIG,0x0F); |
Ucial | 0:4caead137300 | 143 | |
Ucial | 0:4caead137300 | 144 | ce_=1; |
Ucial | 0:4caead137300 | 145 | } |
Ucial | 0:4caead137300 | 146 | void nRF24L01P::NRF24L01_IRQ(void) |
Ucial | 0:4caead137300 | 147 | { |
Ucial | 0:4caead137300 | 148 | uint8_t status = NRF_Read_Reg(NRF_READ_REG + NRFRegSTATUS); |
Ucial | 0:4caead137300 | 149 | |
Ucial | 0:4caead137300 | 150 | if(status & (1<<RX_DR))//½ÓÊÕÖÐ¶Ï |
Ucial | 0:4caead137300 | 151 | { |
Ucial | 0:4caead137300 | 152 | uint8_t rx_len = NRF_Read_Reg(R_RX_PL_WID);//ÊÕµ½Êý¾Ý³¤¶È |
Ucial | 0:4caead137300 | 153 | if(rx_len==32) |
Ucial | 0:4caead137300 | 154 | { |
Ucial | 0:4caead137300 | 155 | NRF_Read_Buff(RD_RX_PLOAD,NRF24L01_RXDATA,rx_len);//¶ÁÈ¡½ÓÊÕFIFOÊý¾Ý |
Ucial | 0:4caead137300 | 156 | Nrf_Erro = 0; |
Ucial | 0:4caead137300 | 157 | } |
Ucial | 0:4caead137300 | 158 | else |
Ucial | 0:4caead137300 | 159 | { |
Ucial | 0:4caead137300 | 160 | NRF_Write_Reg(FLUSH_RX,0xff);//Çå¿Õ½ÓÊÕ»º³åÇø |
Ucial | 0:4caead137300 | 161 | } |
Ucial | 0:4caead137300 | 162 | } |
Ucial | 0:4caead137300 | 163 | if(status & (1<<MAX_RT))//´ïµ½×î¶à´ÎÖØ·¢ÖÐ¶Ï |
Ucial | 0:4caead137300 | 164 | { |
Ucial | 0:4caead137300 | 165 | if(status & (1<<TX_FULL))//TX FIFO Òç³ö |
Ucial | 0:4caead137300 | 166 | { |
Ucial | 0:4caead137300 | 167 | NRF_Write_Reg(FLUSH_TX,0xff);//Çå¿Õ·¢ËÍ»º³åÇø |
Ucial | 0:4caead137300 | 168 | } |
Ucial | 0:4caead137300 | 169 | } |
Ucial | 0:4caead137300 | 170 | // if(status & (1<<TX_DS))//·¢ËÍÍê³É |
Ucial | 0:4caead137300 | 171 | // { |
Ucial | 0:4caead137300 | 172 | NRF24L01_Set_RX();//ÉèÖÃNrf2401Ϊ½ÓÊÕģʽ |
Ucial | 0:4caead137300 | 173 | // } |
Ucial | 0:4caead137300 | 174 | NRF_Write_Reg(NRF_WRITE_REG + NRFRegSTATUS, status);//Çå³ýÖжϱê־λ |
Ucial | 0:4caead137300 | 175 | } |
Ucial | 1:c41959327807 | 176 | void nRF24L01P::Nrf_Connect(void)//500HZ |
Ucial | 1:c41959327807 | 177 | { |
Ucial | 1:c41959327807 | 178 | Nrf_Erro++; |
Ucial | 1:c41959327807 | 179 | if(Nrf_Erro%50==0) |
Ucial | 1:c41959327807 | 180 | { |
Ucial | 1:c41959327807 | 181 | NRF24L01_IRQ(); |
Ucial | 1:c41959327807 | 182 | } |
Ucial | 1:c41959327807 | 183 | if(Nrf_Erro>=500) |
Ucial | 1:c41959327807 | 184 | { |
Ucial | 1:c41959327807 | 185 | Nrf_Erro = 1; |
Ucial | 1:c41959327807 | 186 | } |
Ucial | 1:c41959327807 | 187 | } |
Ucial | 1:c41959327807 | 188 | |
brainliang | 2:6c547cdb94e6 | 189 | uint8_t nRF24L01P::Get_Checksum(uint8_t mydata[]) |
brainliang | 2:6c547cdb94e6 | 190 | { |
brainliang | 2:6c547cdb94e6 | 191 | uint8_t i; |
brainliang | 2:6c547cdb94e6 | 192 | uint8_t checksum=0; |
brainliang | 2:6c547cdb94e6 | 193 | uint8_t length = mydata[3]; |
brainliang | 2:6c547cdb94e6 | 194 | |
brainliang | 2:6c547cdb94e6 | 195 | for(i=0;i<length+2;i++) |
brainliang | 2:6c547cdb94e6 | 196 | checksum ^= (mydata[3+i]&0xFF); |
brainliang | 2:6c547cdb94e6 | 197 | return checksum; |
brainliang | 2:6c547cdb94e6 | 198 | } |