sylveos

Toy Operating System
Log | Files | Refs

commit 97dd8b64ed8a8fd080b2d28724cdf10f8165e66d
parent 901c99c6b97dcc5d737a94f18549ab023fa63e62
Author: Sylvia Ivory <git@sivory.net>
Date:   Thu, 12 Mar 2026 19:11:03 -0700

Cross PI nRF

Diffstat:
Mpi/devices/nrf.zig | 6+++---
Aprograms/nrf-client.zig | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aprograms/nrf-server.zig | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
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(); +}