00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <msp430x44x.h>
00020 #include "nrf24l01.h"
00021 #include "lcd.h"
00022
00023 #define CSN_TIME 2
00024 #define CE_HIGH_TIME 10000
00025
00026
00027 unsigned char RX_ADDRESS_P0[5] = {5,6,7,8,9};
00028
00029 unsigned char RX_ADDRESS_P1[5] = {0,1,2,3,4};
00030
00031 unsigned char TX_ADDRESS[5] = {5,6,7,8,9};
00032 unsigned char ADDRESS[5];
00033
00034 unsigned char status;
00035
00036
00037
00038
00039
00040
00041 void Delay (unsigned long a)
00042 {
00043 while (--a != 0);
00044 }
00045
00046
00047
00048
00049 inline void CSN_HIGH (void)
00050 {
00051 P3OUT |= BIT0;
00052 }
00053
00054
00055
00056
00057 void CSN_LOW (void)
00058 {
00059 Delay (CSN_TIME);
00060 P3OUT &= ~BIT0;
00061 }
00062
00063
00064
00065
00066 void CE_HIGH(void)
00067 {
00068 P1OUT |= BIT6;
00069 Delay (CE_HIGH_TIME);
00070 }
00071
00072
00073
00074
00075 inline void CE_LOW(void)
00076 {
00077 P1OUT &= ~BIT6;
00078 }
00079
00080
00081
00082
00083
00084
00085
00086 unsigned char SPI_SendByte(unsigned char data)
00087 {
00088 while ((IFG1 & UTXIFG0) == 0);
00089 U0TXBUF = data;
00090 while ((IFG1 & URXIFG0) == 0);
00091 return (U0RXBUF);
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 unsigned char SPI_Send_command_with_ADDR (unsigned char cmd, unsigned char addr, unsigned char data_byte)
00103 {
00104 unsigned char temp,command = 0;
00105 int j, k;
00106 command = (cmd << 5) | addr;
00107 CSN_LOW();
00108 if (cmd == R_REGISTER)
00109 {
00110 if (addr == RX_ADDR_P0 || addr == RX_ADDR_P1 || addr == TX_ADDR)
00111 {
00112
00113 status = SPI_SendByte(command);
00114 for (k = 0; k < 5; k++)
00115 {
00116 ADDRESS[k] = SPI_SendByte(NRF_NOP);
00117 }
00118 CSN_HIGH();
00119 return status;
00120 }
00121 else
00122 {
00123 status = SPI_SendByte(command);
00124 temp = SPI_SendByte(NRF_NOP);
00125 CSN_HIGH();
00126 return temp;
00127 }
00128 }
00129 if (cmd == W_REGISTER)
00130 {
00131 if (addr == RX_ADDR_P0)
00132 {
00133 status = SPI_SendByte(command);
00134 for (j = 0; j < 5; j++)
00135 {
00136 temp = RX_ADDRESS_P0[j];
00137 SPI_SendByte(temp);
00138 }
00139 CSN_HIGH();
00140 return status;
00141 }
00142
00143 if (addr == RX_ADDR_P1)
00144 {
00145 status = SPI_SendByte(command);
00146 for (j = 0; j < 5;j++)
00147 {
00148 temp = RX_ADDRESS_P1[j];
00149 SPI_SendByte(temp);
00150 }
00151 CSN_HIGH();
00152 return status;
00153 }
00154
00155 if (addr == TX_ADDR)
00156 {
00157 status = SPI_SendByte(command);
00158 for (j = 0; j < 5;j++)
00159 {
00160 temp = TX_ADDRESS[j];
00161 SPI_SendByte(temp);
00162 }
00163 CSN_HIGH();
00164 return status;
00165 }
00166 else
00167 {
00168 temp = SPI_SendByte(command);
00169 SPI_SendByte(data_byte);
00170 CSN_HIGH();
00171 return temp;
00172 }
00173 }
00174
00175 return 1;
00176 }
00177
00178
00179
00180
00181
00182
00183
00184
00185 unsigned char SPI_Send_command_without_ADDR (unsigned char cmd, unsigned char data_byte)
00186 {
00187 unsigned char temp = 0;
00188 CSN_LOW();
00189 if (cmd == R_RX_PAYLOAD)
00190 {
00191 status = SPI_SendByte(cmd);
00192 temp = SPI_SendByte(NRF_NOP);
00193 CSN_HIGH();
00194 return temp;
00195 }
00196 if (cmd == W_TX_PAYLOAD)
00197 {
00198 status = SPI_SendByte(cmd);
00199 SPI_SendByte(data_byte);
00200 CSN_HIGH();
00201 return status;
00202 }
00203 status = SPI_SendByte(cmd);
00204 CSN_HIGH();
00205 return status;
00206
00207 }
00208
00209
00210
00211
00212 void NRF_init (void)
00213 {
00214
00215
00216
00217 ME1 |= USPIE0;
00218 UCTL0 |= CHAR + SYNC + MM;
00219 UTCTL0 |= CKPH + SSEL1 + SSEL0 + STC;
00220 UBR00 = 0x02;
00221 UBR10 = 0x00;
00222 UMCTL0 = 0x00;
00223 UCTL0 &= ~SWRST;
00224
00225 P3SEL |= BIT1 | BIT2 | BIT3;
00226 P3DIR |= BIT0 | BIT1 | BIT3;
00227 P3DIR &= ~BIT2;
00228 P1DIR |= BIT6;
00229 P1DIR &= ~BIT7;
00230
00231
00232 CSN_HIGH();
00233
00234
00235
00236
00237
00238
00239 CE_LOW();
00240
00241
00242
00243 status = SPI_Send_command_with_ADDR(W_REGISTER, CONFIG_REG_ADDR, 0x0B);
00244
00245 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_ADDR_P0, NRF_NOP);
00246
00247 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_ADDR_P1, NRF_NOP);
00248
00249 status = SPI_Send_command_with_ADDR(W_REGISTER, TX_ADDR, NRF_NOP);
00250
00251 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_PW_P0, 1);
00252
00253 status = SPI_Send_command_with_ADDR(W_REGISTER, RX_PW_P1, 1);
00254 NRF_prepareForReceive ();
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264 void NRF_send (uint8_t byte)
00265 {
00266 uint8_t status_temp;
00267
00268
00269 CE_LOW();
00270
00271
00272
00273 status = SPI_Send_command_with_ADDR (W_REGISTER,CONFIG_REG_ADDR, 0x0A);
00274
00275
00276 status = SPI_Send_command_without_ADDR (W_TX_PAYLOAD, byte);
00277
00278
00279 CE_HIGH();
00280 CE_LOW();
00281
00282
00283 status = SPI_Send_command_without_ADDR(NRF_NOP, NRF_NOP);
00284
00285
00286 if ((status & MAX_RT) != 0)
00287 {
00288
00289
00290 status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|MAX_RT));
00291
00292
00293 LCD_printf ("MAX RT ");
00294 delayX (500);
00295
00296
00297 status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);
00298 }
00299
00300
00301 if ((status & TX_DS) != 0)
00302 {
00303
00304 status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|TX_DS));
00305
00306
00307 }
00308
00309
00310 if ((status & TX_FULL) != 0)
00311 {
00312
00313 status_temp = SPI_Send_command_without_ADDR(FLUSH_TX, NRF_NOP);
00314
00315
00316 LCD_printf ("TX FULL");
00317 delayX (500);
00318 }
00319 }
00320
00321
00322
00323
00324 void NRF_prepareForReceive ()
00325 {
00326
00327
00328 status = SPI_Send_command_with_ADDR(W_REGISTER,CONFIG_REG_ADDR, 0x0B);
00329 }
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340 bool_t NRF_receive (uint8_t *const byte)
00341 {
00342 uint8_t payload;
00343 uint8_t status_temp;
00344
00345 CE_HIGH ();
00346 if (IRQ ())
00347 {
00348
00349 status = SPI_Send_command_without_ADDR(NRF_NOP, NRF_NOP);
00350
00351
00352 if ((status & RX_DR) != 0)
00353 {
00354
00355 CE_LOW();
00356
00357
00358 payload = SPI_Send_command_without_ADDR(R_RX_PAYLOAD, NRF_NOP);
00359
00360
00361 status_temp = SPI_Send_command_with_ADDR(W_REGISTER, STATUS_ADDR, (status|RX_DR));
00362
00363 *byte = payload;
00364
00365
00366 status_temp = SPI_Send_command_without_ADDR(FLUSH_RX, NRF_NOP);
00367 return TRUE;
00368 }
00369 }
00370 return FALSE;
00371 }