Selaa lähdekoodia

base-station: Add code to receive packets using the NRF24L01 module.

Mathias Gottschlag 5 vuotta sitten
vanhempi
commit
201bf90392

+ 205
- 0
base-station/software/Cargo.lock Näytä tiedosto

@@ -3,3 +3,208 @@
3 3
 [[package]]
4 4
 name = "base-station"
5 5
 version = "0.1.0"
6
+dependencies = [
7
+ "embedded-hal",
8
+ "embedded-nrf24l01",
9
+ "linux-embedded-hal",
10
+]
11
+
12
+[[package]]
13
+name = "bitfield"
14
+version = "0.13.2"
15
+source = "registry+https://github.com/rust-lang/crates.io-index"
16
+checksum = "46afbd2983a5d5a7bd740ccb198caf5b82f45c40c09c0eed36052d91cb92e719"
17
+
18
+[[package]]
19
+name = "bitflags"
20
+version = "1.2.1"
21
+source = "registry+https://github.com/rust-lang/crates.io-index"
22
+checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
23
+
24
+[[package]]
25
+name = "byteorder"
26
+version = "1.3.4"
27
+source = "registry+https://github.com/rust-lang/crates.io-index"
28
+checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
29
+
30
+[[package]]
31
+name = "cast"
32
+version = "0.2.3"
33
+source = "registry+https://github.com/rust-lang/crates.io-index"
34
+checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0"
35
+dependencies = [
36
+ "rustc_version",
37
+]
38
+
39
+[[package]]
40
+name = "cc"
41
+version = "1.0.50"
42
+source = "registry+https://github.com/rust-lang/crates.io-index"
43
+checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd"
44
+
45
+[[package]]
46
+name = "cfg-if"
47
+version = "0.1.10"
48
+source = "registry+https://github.com/rust-lang/crates.io-index"
49
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
50
+
51
+[[package]]
52
+name = "embedded-hal"
53
+version = "0.2.3"
54
+source = "registry+https://github.com/rust-lang/crates.io-index"
55
+checksum = "ee4908a155094da7723c2d60d617b820061e3b4efcc3d9e293d206a5a76c170b"
56
+dependencies = [
57
+ "nb",
58
+ "void",
59
+]
60
+
61
+[[package]]
62
+name = "embedded-nrf24l01"
63
+version = "0.2.0"
64
+source = "git+https://github.com/astro/embedded-nrf24l01.git#0998f622c99d48a3d90261e0eabeb5e84d6f30a0"
65
+dependencies = [
66
+ "bitfield",
67
+ "embedded-hal",
68
+]
69
+
70
+[[package]]
71
+name = "i2cdev"
72
+version = "0.4.4"
73
+source = "registry+https://github.com/rust-lang/crates.io-index"
74
+checksum = "3c0eb3d9b6b02dc2508ee23439170004e44344bab9d53a490eb1f64c885b5003"
75
+dependencies = [
76
+ "bitflags",
77
+ "byteorder",
78
+ "libc",
79
+ "nix",
80
+]
81
+
82
+[[package]]
83
+name = "ioctl-rs"
84
+version = "0.1.6"
85
+source = "registry+https://github.com/rust-lang/crates.io-index"
86
+checksum = "f7970510895cee30b3e9128319f2cefd4bde883a39f38baa279567ba3a7eb97d"
87
+dependencies = [
88
+ "libc",
89
+]
90
+
91
+[[package]]
92
+name = "libc"
93
+version = "0.2.68"
94
+source = "registry+https://github.com/rust-lang/crates.io-index"
95
+checksum = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0"
96
+
97
+[[package]]
98
+name = "linux-embedded-hal"
99
+version = "0.3.0"
100
+source = "registry+https://github.com/rust-lang/crates.io-index"
101
+checksum = "e04b2d8e29bb2d949bc9f0ed8acee5033833166731c7e479d0c74d7ef2ab042d"
102
+dependencies = [
103
+ "cast",
104
+ "embedded-hal",
105
+ "i2cdev",
106
+ "nb",
107
+ "serial-core",
108
+ "serial-unix",
109
+ "spidev",
110
+ "sysfs_gpio",
111
+]
112
+
113
+[[package]]
114
+name = "nb"
115
+version = "0.1.2"
116
+source = "registry+https://github.com/rust-lang/crates.io-index"
117
+checksum = "b1411551beb3c11dedfb0a90a0fa256b47d28b9ec2cdff34c25a2fa59e45dbdc"
118
+
119
+[[package]]
120
+name = "nix"
121
+version = "0.14.1"
122
+source = "registry+https://github.com/rust-lang/crates.io-index"
123
+checksum = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce"
124
+dependencies = [
125
+ "bitflags",
126
+ "cc",
127
+ "cfg-if",
128
+ "libc",
129
+ "void",
130
+]
131
+
132
+[[package]]
133
+name = "rustc_version"
134
+version = "0.2.3"
135
+source = "registry+https://github.com/rust-lang/crates.io-index"
136
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
137
+dependencies = [
138
+ "semver",
139
+]
140
+
141
+[[package]]
142
+name = "semver"
143
+version = "0.9.0"
144
+source = "registry+https://github.com/rust-lang/crates.io-index"
145
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
146
+dependencies = [
147
+ "semver-parser",
148
+]
149
+
150
+[[package]]
151
+name = "semver-parser"
152
+version = "0.7.0"
153
+source = "registry+https://github.com/rust-lang/crates.io-index"
154
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
155
+
156
+[[package]]
157
+name = "serial-core"
158
+version = "0.4.0"
159
+source = "registry+https://github.com/rust-lang/crates.io-index"
160
+checksum = "3f46209b345401737ae2125fe5b19a77acce90cd53e1658cda928e4fe9a64581"
161
+dependencies = [
162
+ "libc",
163
+]
164
+
165
+[[package]]
166
+name = "serial-unix"
167
+version = "0.4.0"
168
+source = "registry+https://github.com/rust-lang/crates.io-index"
169
+checksum = "f03fbca4c9d866e24a459cbca71283f545a37f8e3e002ad8c70593871453cab7"
170
+dependencies = [
171
+ "ioctl-rs",
172
+ "libc",
173
+ "serial-core",
174
+ "termios",
175
+]
176
+
177
+[[package]]
178
+name = "spidev"
179
+version = "0.4.0"
180
+source = "registry+https://github.com/rust-lang/crates.io-index"
181
+checksum = "aa5aa93a87c20f4efdf494917ef8fb475522601256ba6bb00ad1e6101f779fe9"
182
+dependencies = [
183
+ "bitflags",
184
+ "libc",
185
+ "nix",
186
+]
187
+
188
+[[package]]
189
+name = "sysfs_gpio"
190
+version = "0.5.4"
191
+source = "registry+https://github.com/rust-lang/crates.io-index"
192
+checksum = "24961a55846623d8e4f6cec38718945116fed8d6970336a7110710a07aa9b5d1"
193
+dependencies = [
194
+ "nix",
195
+]
196
+
197
+[[package]]
198
+name = "termios"
199
+version = "0.2.2"
200
+source = "registry+https://github.com/rust-lang/crates.io-index"
201
+checksum = "d5d9cf598a6d7ce700a4e6a9199da127e6819a61e64b68609683cc9a01b5683a"
202
+dependencies = [
203
+ "libc",
204
+]
205
+
206
+[[package]]
207
+name = "void"
208
+version = "1.0.2"
209
+source = "registry+https://github.com/rust-lang/crates.io-index"
210
+checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"

+ 3
- 0
base-station/software/Cargo.toml Näytä tiedosto

@@ -7,3 +7,6 @@ edition = "2018"
7 7
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8 8
 
9 9
 [dependencies]
10
+linux-embedded-hal = "0.3"
11
+embedded-nrf24l01 = { git = "https://github.com/astro/embedded-nrf24l01.git" }
12
+embedded-hal = "0.2.3"

+ 74
- 1
base-station/software/src/main.rs Näytä tiedosto

@@ -1,3 +1,76 @@
1
+use embedded_nrf24l01::{Configuration, CrcMode, DataRate, NRF24L01};
2
+use linux_embedded_hal::spidev::{SpiModeFlags, Spidev, SpidevOptions};
3
+use linux_embedded_hal::sysfs_gpio::Direction;
4
+use linux_embedded_hal::Pin;
5
+
6
+use spi::EmbeddedHalSpidev;
7
+
8
+mod spi;
9
+
1 10
 fn main() {
2
-    println!("Hello, world!");
11
+    // The NRF module is connected as follows:
12
+    // - CE: PA1
13
+    // - CS: PG8
14
+    // - IRQ: PG9
15
+    // - MOSI: PC0
16
+    // - MISO: PC1
17
+    // - SCK: PC2
18
+
19
+    // Configure SPI.
20
+    let mut spi = Spidev::open("/dev/spidev0.0").unwrap();
21
+    let options = SpidevOptions::new()
22
+        .bits_per_word(8)
23
+        .max_speed_hz(500_000)
24
+        .mode(SpiModeFlags::SPI_MODE_0)
25
+        .build();
26
+    spi.configure(&options).unwrap();
27
+    let spi = EmbeddedHalSpidev::from(spi);
28
+
29
+    // Configure the GPIOs.
30
+    let ce_nr = get_pin_number('A', 1);
31
+    let ce = Pin::new(ce_nr);
32
+    ce.export().unwrap();
33
+    ce.set_direction(Direction::Out).unwrap();
34
+    let cs_nr = get_pin_number('G', 8);
35
+    let cs = Pin::new(cs_nr);
36
+    cs.export().unwrap();
37
+    cs.set_direction(Direction::Out).unwrap();
38
+    let irq_nr = get_pin_number('G', 9);
39
+    let irq = Pin::new(irq_nr);
40
+    irq.export().unwrap();
41
+    irq.set_direction(Direction::In).unwrap();
42
+
43
+    // Initialize the radio module.
44
+    let mut nrf24 = NRF24L01::new(ce, cs, spi).unwrap();
45
+    nrf24.set_frequency(0x32).unwrap();
46
+    nrf24.set_rf(DataRate::R2Mbps, 0).unwrap();
47
+    nrf24.set_crc(Some(CrcMode::OneByte)).unwrap();
48
+    nrf24.set_auto_retransmit(250, 3).unwrap();
49
+    nrf24
50
+        .set_pipes_rx_enable(&[true, false, false, false, false, false])
51
+        .unwrap();
52
+    nrf24
53
+        .set_rx_addr(0, &[0x56, 0x34, 0x12, 0x00, 0x00])
54
+        .unwrap();
55
+    nrf24.flush_rx().unwrap();
56
+    nrf24.flush_tx().unwrap();
57
+    //nrf24.set_auto_ack(&[true; 6]).unwrap();
58
+    println!("auto ack: {:?}", nrf24.get_auto_ack().unwrap());
59
+    nrf24.set_pipes_rx_lengths(&[None; 6]).unwrap();
60
+
61
+    println!("width: {}", nrf24.get_address_width().unwrap());
62
+
63
+    // Receive data.
64
+    let mut nrf24 = nrf24.rx().unwrap();
65
+    println!("Starting to receive:");
66
+    loop {
67
+        if let Some(pipe) = nrf24.can_read().unwrap() {
68
+            let payload = nrf24.read().unwrap();
69
+            println!("packet received on pipe {}: {:?}", pipe, payload.as_ref());
70
+        }
71
+    }
72
+}
73
+
74
+fn get_pin_number(c: char, n: u64) -> u64 {
75
+    (c as u64 - 'A' as u64) * 32 + n
3 76
 }

+ 25
- 0
base-station/software/src/spi.rs Näytä tiedosto

@@ -0,0 +1,25 @@
1
+use std::io;
2
+
3
+use embedded_hal::blocking::spi::Transfer;
4
+use linux_embedded_hal::spidev::Spidev;
5
+use linux_embedded_hal::spidev::SpidevTransfer;
6
+
7
+pub struct EmbeddedHalSpidev {
8
+    spi: Spidev,
9
+}
10
+
11
+impl From<Spidev> for EmbeddedHalSpidev {
12
+    fn from(s: Spidev) -> EmbeddedHalSpidev {
13
+        EmbeddedHalSpidev { spi: s }
14
+    }
15
+}
16
+
17
+impl Transfer<u8> for EmbeddedHalSpidev {
18
+    type Error = io::Error;
19
+    fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> {
20
+        let words_copy = words.to_vec();
21
+        let mut transfer = SpidevTransfer::read_write(&words_copy, words);
22
+        self.spi.transfer(&mut transfer)?;
23
+        Ok(words)
24
+    }
25
+}

Loading…
Peruuta
Tallenna