commit 97dd8b64ed8a8fd080b2d28724cdf10f8165e66d
parent 901c99c6b97dcc5d737a94f18549ab023fa63e62
Author: Sylvia Ivory <git@sivory.net>
Date: Thu, 12 Mar 2026 19:11:03 -0700
Cross PI nRF
Diffstat:
3 files changed, 122 insertions(+), 3 deletions(-)
diff --git a/pi/devices/nrf.zig b/pi/devices/nrf.zig
@@ -182,8 +182,8 @@ pub const Config = struct {
output_power: RFSetup.OutputPower = .@"0dBm",
data_rate: RFSetup.Speed = .@"1Mbps",
crc_length: nRFConfig.Crc = .@"2",
- auto_retransmit_delay: u4 = 1, // 500us
- auto_retransmit_count: u4 = 3,
+ auto_retransmit_delay: u4 = 2, // 500us
+ auto_retransmit_count: u4 = 15,
payload_size: u6 = 32,
};
@@ -435,7 +435,7 @@ pub const Device = struct {
return Error.Timeout;
}
- pub fn receive(self: *Self, buffer: []u8) Error!usize {
+ pub fn receive(self: *const Self, buffer: []u8) Error!usize {
const fifo = self.read_register(FiFoStatus, REG_FIFO_STATUS);
if (fifo.rx_empty) return 0;
diff --git a/programs/nrf-client.zig b/programs/nrf-client.zig
@@ -0,0 +1,66 @@
+const std = @import("std");
+const shared = @import("shared");
+const pi = @import("pi");
+
+const nrf = pi.devices.nrf;
+const clock = pi.devices.clock;
+const uart = pi.devices.mini_uart;
+
+fn wait_for_ans(client_dev: *nrf.Device) !u8 {
+ var buffer: [4]u8 = undefined;
+
+ while (true) {
+ const bytes_collected = client_dev.receive(&buffer) catch |err| {
+ if (err == nrf.Error.NotReady) continue;
+ return err;
+ };
+ if (bytes_collected == 4) break;
+ if (bytes_collected > 0) {
+ uart.print("read: {d}\n", .{bytes_collected});
+ }
+
+ clock.delay_ms(1);
+ }
+
+ return buffer[3];
+}
+
+// Server:
+// CS - 8
+// CE - 6
+//
+// Client:
+// CS - 7
+// CE - 5
+pub fn main() !void {
+ uart.print("creating client\n", .{});
+
+ const client_addr = 0xE5E5E5E5E5;
+
+ var client_dev: nrf.Device = try .init(.{
+ .spi_config = .{
+ .chip_select = .@"1",
+ .pins = .Lower,
+ },
+ .ce_pin = 5,
+ .int_pin = 22,
+ .payload_size = 4,
+ });
+ uart.print("initialized client\n", .{});
+
+ try client_dev.set_rx_addr(0, client_addr);
+ client_dev.connect();
+
+ while (true) {
+ const b = try wait_for_ans(&client_dev);
+
+ uart.print("got byte: {c}\n", .{b});
+
+ clock.delay_ms(10);
+
+ if (b == '\r') break;
+ }
+
+ uart.print("done!\n", .{});
+ uart.flush();
+}
diff --git a/programs/nrf-server.zig b/programs/nrf-server.zig
@@ -0,0 +1,53 @@
+const std = @import("std");
+const shared = @import("shared");
+const pi = @import("pi");
+
+const nrf = pi.devices.nrf;
+const clock = pi.devices.clock;
+const uart = pi.devices.mini_uart;
+
+// Server:
+// CS - 8
+// CE - 6
+//
+// Client:
+// CS - 7
+// CE - 5
+pub fn main() !void {
+ uart.print("creating server\n", .{});
+
+ const client_addr = 0xE5E5E5E5E5;
+
+ var server_dev: nrf.Device = try .init(.{
+ .spi_config = .{
+ .chip_select = .@"0",
+ .pins = .Lower,
+ },
+ .ce_pin = 6,
+ .int_pin = 23,
+ .payload_size = 4,
+ });
+ uart.print("initialized server\n", .{});
+
+ server_dev.set_tx_addr(client_addr);
+ try server_dev.set_rx_addr(0, client_addr);
+
+ const msg = "Hello, World!\r";
+
+ for (msg) |b| {
+ uart.print("Sending {c}: ", .{b});
+
+ var buffer: [4]u8 = .{ 0, 0, 0, b };
+ if (try server_dev.transmit(&buffer, 1000)) {
+ uart.print("transmitted\n", .{});
+ } else {
+ uart.print("server failed to transmit\n", .{});
+ continue;
+ }
+
+ clock.delay_ms(10);
+ }
+
+ uart.print("done!\n", .{});
+ uart.flush();
+}