Songw Jiang / nRF24L01P

Dependents:   RC_Green Drown RC_RX

Committer:
Ucial
Date:
Tue Dec 10 02:01:33 2019 +0000
Revision:
5:d0c9b8b5cf75
Parent:
4:756125f83a27
Child:
6:a0e847d59312
add new func to reset address

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