00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00019 #include <msp430xG461x.h>
00020 #include "nrf24l01.h"
00021 #include "time.h"
00022 #include "lcd.h"
00023
00024 #define CSN_TIME 2
00025 #define CE_HIGH_TIME 10000
00026
00028 unsigned char RX_ADDRESS_P0[5] = {5,6,7,8,9};
00030 unsigned char RX_ADDRESS_P1[5] = {0,1,2,3,4};
00032 unsigned char TX_ADDRESS[5] = {5,6,7,8,9};
00033 unsigned char ADDRESS[5];
00034
00035 unsigned char status;
00036
00042 void Delay (unsigned long a)
00043 {
00044 while (--a != 0);
00045 }
00046
00050 inline void CSN_HIGH (void)
00051 {
00052 P8OUT |= BIT3;
00053 }
00054
00058 void CSN_LOW (void)
00059 {
00060 Delay (CSN_TIME);
00061 P8OUT &= ~BIT3;
00062 }
00063
00067 void CE_HIGH(void)
00068 {
00069 P8OUT |= BIT4;
00070 Delay (CE_HIGH_TIME);
00071 }
00072
00076 inline void CE_LOW(void)
00077 {
00078 P8OUT &= ~BIT4;
00079 }
00080
00087 unsigned char SPI_SendByte(unsigned char data)
00088 {
00089 while ((IFG2 & UCA0TXIFG) == 0);
00090 UCA0TXBUF = data;
00091 while ((IFG2 & UCA0RXIFG) == 0);
00092 return (UCA0RXBUF);
00093 }
00094
00103 unsigned char SPI_Send_command_with_ADDR (unsigned char cmd, unsigned char addr, unsigned char data_byte)
00104 {
00105 unsigned char temp,command = 0;
00106 int j, k;
00107 command = (cmd << 5) | addr;
00108 CSN_LOW();
00109 if (cmd == R_REGISTER)
00110 {
00111 if (addr == RX_ADDR_P0 || addr == RX_ADDR_P1 || addr == TX_ADDR)
00112 {
00113
00114 status = SPI_SendByte(command);
00115 for (k = 0; k < 5; k++)
00116 {
00117 ADDRESS[k] = SPI_SendByte(NRF_NOP);
00118 }
00119 CSN_HIGH();
00120 return status;
00121 }
00122 else
00123 {
00124 status = SPI_SendByte(command);
00125 temp = SPI_SendByte(NRF_NOP);
00126 CSN_HIGH();
00127 return temp;
00128 }
00129 }
00130 if (cmd == W_REGISTER)
00131 {
00132 if (addr == RX_ADDR_P0)
00133 {
00134 status = SPI_SendByte(command);
00135 for (j = 0; j < 5; j++)
00136 {
00137 temp = RX_ADDRESS_P0[j];
00138 SPI_SendByte(temp);
00139 }
00140 CSN_HIGH();
00141 return status;
00142 }
00143
00144 if (addr == RX_ADDR_P1)
00145 {
00146 status = SPI_SendByte(command);
00147 for (j = 0; j < 5;j++)
00148 {
00149 temp = RX_ADDRESS_P1[j];
00150 SPI_SendByte(temp);
00151 }
00152 CSN_HIGH();
00153 return status;
00154 }
00155
00156 if (addr == TX_ADDR)
00157 {
00158 status = SPI_SendByte(command);
00159 for (j = 0; j < 5;j++)
00160 {
00161 temp = TX_ADDRESS[j];
00162 SPI_SendByte(temp);
00163 }
00164 CSN_HIGH();
00165 return status;
00166 }
00167 else
00168 {
00169 temp = SPI_SendByte(command);
00170 SPI_SendByte(data_byte);
00171 CSN_HIGH();
00172 return temp;
00173 }
00174 }
00175
00176 return 1;
00177 }
00178
00179 unsigned char SPI_Send_command_without_ADDR (unsigned char cmd, unsigned char data_byte)
00180 {
00181 unsigned char temp = 0;
00182 CSN_LOW();
00183 if (cmd == R_RX_PAYLOAD)
00184 {
00185 status = SPI_SendByte(cmd);
00186 temp = SPI_SendByte(NRF_NOP);
00187 CSN_HIGH();
00188 return temp;
00189 }
00190 if (cmd == W_TX_PAYLOAD)
00191 {
00192 status = SPI_SendByte(cmd);
00193 SPI_SendByte(data_byte);
00194 CSN_HIGH();
00195 return status;
00196 }
00197 status = SPI_SendByte(cmd);
00198 CSN_HIGH();
00199 return status;
00200
00201 }
00202
00203
00204 void NRF_init (void)
00205 {
00207
00209
00210 UCA0CTL0 = UCCKPH + UCMST + UCMSB + UCSYNC;
00211
00212
00213 UCA0CTL1 = UCSSEL1;
00214
00215
00216 UCA0BR0 = 0x02;
00217 UCA0BR1 = 0x00;
00218
00219
00220
00221 P7SEL |= BIT1 | BIT2 | BIT3;
00222 P7DIR |= BIT1 | BIT3;
00223 P7DIR &= ~BIT2;
00224 P8DIR |= BIT3 | BIT4;
00225 P8DIR &= ~BIT5;
00226
00227
00228 CSN_HIGH();
00229
00231
00233
00234
00235 CE_LOW();
00236
00237
00238
00239 status = SPI_Send_command_with_ADDR(W_REGISTER, CONFIG_REG_ADDR, 0x0B);
00240
00241 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_ADDR_P0, NRF_NOP);
00242
00243 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_ADDR_P1, NRF_NOP);
00244
00245 status = SPI_Send_command_with_ADDR(W_REGISTER, TX_ADDR, NRF_NOP);
00246
00247 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_PW_P0, 1);
00248
00249 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_PW_P1, 1);
00250 NRF_prepareForReceive ();
00251 }
00252
00260 void NRF_send (uint8_t byte)
00261 {
00262 uint8_t status_temp;
00263
00264
00265 CE_LOW();
00266
00267
00268
00269 status = SPI_Send_command_with_ADDR (W_REGISTER,CONFIG_REG_ADDR, 0x0A);
00270
00271
00272 status = SPI_Send_command_without_ADDR (W_TX_PAYLOAD, byte);
00273
00274
00275 CE_HIGH();
00276 CE_LOW();
00277
00278
00279 status = SPI_Send_command_without_ADDR(NRF_NOP, NRF_NOP);
00280
00281
00282 if ((status & MAX_RT) != 0)
00283 {
00284
00285
00286 status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|MAX_RT));
00287
00288
00289 LCD_printf ("MAX_RT\n");
00290
00291
00292 status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);
00293 }
00294
00295
00296 if ((status & TX_DS) != 0)
00297 {
00298
00299 status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|TX_DS));
00300
00301
00302
00303 }
00304
00305
00306 if ((status & TX_FULL) != 0)
00307 {
00308
00309 status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);
00310
00311
00312
00313 LCD_printf ("TX_FULL\n");
00314 }
00315
00316 }
00317
00321 void NRF_prepareForReceive ()
00322 {
00323
00324
00325 status = SPI_Send_command_with_ADDR(W_REGISTER,CONFIG_REG_ADDR, 0x0B);
00326 }
00327
00337 bool_t NRF_receive (uint8_t *const byte)
00338 {
00339 uint8_t payload;
00340 uint8_t status_temp;
00341
00342 CE_HIGH ();
00343 if (IRQ ())
00344 {
00345
00346 status = SPI_Send_command_without_ADDR(NRF_NOP, NRF_NOP);
00347
00348
00349 if ((status & RX_DR) != 0)
00350 {
00351
00352 CE_LOW();
00353
00354
00355 payload = SPI_Send_command_without_ADDR(R_RX_PAYLOAD, NRF_NOP);
00356
00357
00358 status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|RX_DR));
00359
00360 *byte = payload;
00361
00362
00363 status_temp = SPI_Send_command_without_ADDR(FLUSH_RX, NRF_NOP);
00364 return TRUE;
00365 }
00366 }
00367 return FALSE;
00368 }