-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathnrf905.c
100 lines (88 loc) · 1.96 KB
/
nrf905.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include<stdio.h>
#include<stdint.h>
#include<sys/time.h>
#include<wiringPi.h>
#include<wiringPiSPI.h>
#include"nrf905.h"
int TX_EN = 0;
int TRX_CE = 1;
int PWR_UP = 2;
int DR = 3;
void nRF905_init(){
if (wiringPiSetup () == -1)
pinMode(TX_EN, OUTPUT);
pinMode(TRX_CE, OUTPUT);
pinMode(PWR_UP, OUTPUT);
pinMode(DR, INPUT);
uint8_t RFConf[11]=
{
0x00,
0x4c,
0x0c,
0x44,
0x08,0x08,
0xcc,0xcc,0xcc,0xcc,
0x58
};
//Init nRF905
pinMode(DR, OUTPUT);
digitalWrite(DR, 0);
pinMode(DR, INPUT);
digitalWrite(PWR_UP, 1);
digitalWrite(TRX_CE, 0);
digitalWrite(TX_EN, 0);
if(wiringPiSPISetup(0, 16000000) == -1){
printf("Could not initialise SPI\n");
}
wiringPiSPIDataRW(0, RFConf, 11);
}
void nRF905_send(uint8_t *data, int length, uint8_t *address){
//Set Tx Mode
digitalWrite(TRX_CE, 0);
digitalWrite(TX_EN, 1);
delay(1);
uint8_t buff[32];
int i;
// Tx Packet
buff[0] = WTP;
for(i = 1; i < 9; i++){
buff[i] = data[i-1];
}
wiringPiSPIDataRW(0, buff, length + 1);
delay(1);
buff[0] = WTA;
for(i = 1; i < 5; i++){
buff[i] = address[i-1];
}
wiringPiSPIDataRW(0, buff, 5);
digitalWrite(TRX_CE, 1);
while(digitalRead(DR) != 1);
digitalWrite(TRX_CE, 0);
}
int nRF905_recive(uint8_t *data, long timeout){
//Set Rx Mode
digitalWrite(TRX_CE, 1);
digitalWrite(TX_EN, 0);
delay(1);
long t1 = getCurrentTime();
while(digitalRead(DR) == 0){
if((getCurrentTime() - t1) > timeout){
return 0;
}
}
digitalWrite(TRX_CE, 0);
uint8_t buff9[9];
buff9[0] = RRP;
wiringPiSPIDataRW(0, buff9, 9);
int i;
for(i = 0; i < 8; i++){
data[i] = buff9[i+1];
}
digitalWrite(TRX_CE, 1);
return 8;
}
long getCurrentTime(){
struct timeval tv;
gettimeofday(&tv,NULL);
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
}