Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 6 additions & 14 deletions examples/wch/ch32v/src/dma.zig
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
const std = @import("std");
const microzig = @import("microzig");
const hal = microzig.hal;
const gpio = hal.gpio;
const board = microzig.board;
const dma = hal.dma;

const usart = hal.usart.instance.USART2;
const usart_tx_pin = gpio.Pin.init(0, 2); // PA2
const uart = board.uart_setup;

pub const panic = microzig.panic;

Expand Down Expand Up @@ -40,18 +39,11 @@ inline fn read_stk_cnt() u64 {

pub fn main() !void {
// Board brings up clocks and time
microzig.board.init();
board.init();

// Configure USART2 TX pin (PA2) for alternate function (disable GPIO)
usart_tx_pin.configure_alternate_function(.push_pull, .max_50MHz);

// Initialize USART2 at 115200 baud (uses default pins PA2/PA3)
usart.apply(.{
.baud_rate = 115200,
.remap = .default,
});

hal.usart.init_logger(usart);
// Initialize UART for logging
uart.apply(.{ .baud_rate = 115200 });
hal.usart.init_logger(uart.instance);

const chan = dma.Channel.Ch7;

Expand Down
36 changes: 10 additions & 26 deletions examples/wch/ch32v/src/i2c_bus_scan.zig
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
const std = @import("std");
const microzig = @import("microzig");
const hal = microzig.hal;
const gpio = hal.gpio;
const board = microzig.board;
const i2c = hal.i2c;

const usart = hal.usart.instance.USART2;
const usart_tx_pin = gpio.Pin.init(0, 2); // PA2
const uart = board.uart_setup;
const i2c_hw = board.i2c_setup;

pub const panic = microzig.panic;

Expand All @@ -20,36 +20,20 @@ comptime {

pub fn main() !void {
// Board brings up clocks and time
microzig.board.init();
board.init();

// Configure USART2 TX pin (PA2) for alternate function (disable GPIO)
usart_tx_pin.configure_alternate_function(.push_pull, .max_50MHz);
// Initialize UART for logging
uart.apply(.{ .baud_rate = 115200 });
hal.usart.init_logger(uart.instance);

// Initialize USART2 at 115200 baud (uses default pins PA2/PA3)
usart.apply(.{
.baud_rate = 115200,
.remap = .default,
});

hal.usart.init_logger(usart);

// I2C1 is on PB6 (SCL) and PB7 (SDA)
const scl_pin = hal.gpio.Pin.init(1, 6); // GPIOB pin 6
const sda_pin = hal.gpio.Pin.init(1, 7); // GPIOB pin 7

// Configure I2C pins for alternate function (open-drain required for I2C)
scl_pin.configure_alternate_function(.open_drain, .max_50MHz);
sda_pin.configure_alternate_function(.open_drain, .max_50MHz);

// Initialize I2C at 100kHz (uses default pins PB6/PB7)
const instance = i2c.instance.I2C1;
instance.apply(.{});
// Initialize I2C
i2c_hw.apply(.{});

for (0..std.math.maxInt(u7)) |addr| {
const a: i2c.Address = @fromBackingInt(@intCast(addr));

var rx_data: [1]u8 = undefined;
_ = instance.read_blocking(a, &rx_data, null) catch |e| {
_ = i2c_hw.instance.read_blocking(a, &rx_data, null) catch |e| {
// Expected errors for non-present devices
if (e != i2c.Error.NoAcknowledge and e != i2c.Error.Timeout) {
std.log.warn("Unexpected error at 0x{X:0>2}: {}", .{ addr, e });
Expand Down
44 changes: 14 additions & 30 deletions examples/wch/ch32v/src/i2c_eeprom.zig
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
const std = @import("std");
const microzig = @import("microzig");
const hal = microzig.hal;
const gpio = hal.gpio;
const board = microzig.board;
const i2c = hal.i2c;

const usart = hal.usart.instance.USART2;
const usart_tx_pin = gpio.Pin.init(0, 2); // PA2
const uart = board.uart_setup;
const i2c_hw = board.i2c_setup;

pub const panic = microzig.panic;

Expand All @@ -28,30 +28,14 @@ fn hex_dump(data: []const u8) void {

pub fn main() !void {
// Board brings up clocks and time
microzig.board.init();
board.init();

// Configure USART2 TX pin (PA2) for alternate function (disable GPIO)
usart_tx_pin.configure_alternate_function(.push_pull, .max_50MHz);
// Initialize UART for logging
uart.apply(.{ .baud_rate = 115200 });
hal.usart.init_logger(uart.instance);

// Initialize USART2 at 115200 baud (uses default pins PA2/PA3)
usart.apply(.{
.baud_rate = 115200,
.remap = .default,
});

hal.usart.init_logger(usart);

// I2C1 is on PB6 (SCL) and PB7 (SDA)
const scl_pin = hal.gpio.Pin.init(1, 6); // GPIOB pin 6
const sda_pin = hal.gpio.Pin.init(1, 7); // GPIOB pin 7

// Configure I2C pins for alternate function (open-drain required for I2C)
scl_pin.configure_alternate_function(.open_drain, .max_50MHz);
sda_pin.configure_alternate_function(.open_drain, .max_50MHz);

// Initialize I2C at 100kHz (uses default pins PB6/PB7)
const instance = i2c.instance.I2C1;
instance.apply(.{});
// Initialize I2C
i2c_hw.apply(.{});

const eeprom_address: i2c.Address = @fromBackingInt(0x50);

Expand All @@ -60,24 +44,24 @@ pub fn main() !void {
var data: [256]u8 = undefined;

// Set address to 0x0000 (2 bytes: high, low)
try instance.write_blocking(eeprom_address, &.{ 0x00, 0x00 }, .from_ms(100));
try i2c_hw.instance.write_blocking(eeprom_address, &.{ 0x00, 0x00 }, .from_ms(100));
// Sequential read - address auto-increments
try instance.read_blocking(eeprom_address, &data, .from_ms(100));
try i2c_hw.instance.read_blocking(eeprom_address, &data, .from_ms(100));

std.log.info("Read {d} bytes from EEPROM:", .{data.len});
hex_dump(&data);

// Write value 0x42 at address 0x0005
// Format: [addr_high] [addr_low] [data]
std.log.info("Writing 0x42 at address 0x0005", .{});
try instance.write_blocking(eeprom_address, &.{ 0x00, 0x05, 0x42 }, .from_ms(100));
try i2c_hw.instance.write_blocking(eeprom_address, &.{ 0x00, 0x05, 0x42 }, .from_ms(100));

// Wait for write cycle to complete (~5ms for AT24C256)
hal.time.sleep_ms(10);

// Read back to verify
try instance.write_blocking(eeprom_address, &.{ 0x00, 0x00 }, .from_ms(100));
try instance.read_blocking(eeprom_address, &data, .from_ms(100));
try i2c_hw.instance.write_blocking(eeprom_address, &.{ 0x00, 0x00 }, .from_ms(100));
try i2c_hw.instance.read_blocking(eeprom_address, &data, .from_ms(100));

std.log.info("After write:", .{});
hex_dump(&data);
Expand Down
35 changes: 10 additions & 25 deletions examples/wch/ch32v/src/i2c_position_sensor.zig
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
const std = @import("std");
const microzig = @import("microzig");
const hal = microzig.hal;
const board = microzig.board;

const gpio = hal.gpio;
const i2c = hal.i2c;

const AS5600 = microzig.drivers.sensor.AS5600;

const usart = hal.usart.instance.USART2;
const usart_tx_pin = gpio.Pin.init(0, 2); // PA2
const uart = board.uart_setup;
const i2c_hw = board.i2c_setup;

pub const panic = microzig.panic;

Expand All @@ -23,28 +23,13 @@ comptime {

pub fn main() !void {
// Board brings up clocks and time
microzig.board.init();
board.init();

// Configure USART2 TX pin (PA2) for alternate function (disable GPIO)
usart_tx_pin.configure_alternate_function(.push_pull, .max_50MHz);
// Initialize UART for logging
uart.apply(.{ .baud_rate = 115200 });
hal.usart.init_logger(uart.instance);

// Initialize USART2 at 115200 baud (uses default pins PA2/PA3)
usart.apply(.{
.baud_rate = 115200,
.remap = .default,
});

hal.usart.init_logger(usart);

// I2C1 is on PB6 (SCL) and PB7 (SDA)
const scl_pin = hal.gpio.Pin.init(1, 6); // GPIOB pin 6
const sda_pin = hal.gpio.Pin.init(1, 7); // GPIOB pin 7

// Configure I2C pins for alternate function (open-drain required for I2C)
scl_pin.configure_alternate_function(.open_drain, .max_50MHz);
sda_pin.configure_alternate_function(.open_drain, .max_50MHz);

const instance = i2c.instance.I2C1;
// Initialize I2C with DMA
const i2c_config = i2c.Config{
.baud_rate = 100_000, // 100 kHz
.dma = .{
Expand All @@ -54,13 +39,13 @@ pub fn main() !void {
.threshold = 4, // Threshold for DMA transfers
},
};
instance.apply(i2c_config);
i2c_hw.apply(i2c_config);

// Get the specialized I2C_Device type for this config
const I2C_DeviceType = hal.drivers.I2C_Device(i2c_config);

// Create i2c device
var i2c_device = I2C_DeviceType.init(instance, null);
var i2c_device = I2C_DeviceType.init(i2c_hw.instance, null);
// Pass device to driver to create sensor instance
std.log.info("Creating AS5600 driver instance", .{});
var dev = AS5600.init(i2c_device.i2c_device());
Expand Down
43 changes: 12 additions & 31 deletions examples/wch/ch32v/src/sharp_niceview.zig
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,12 @@ const std = @import("std");
const microzig = @import("microzig");
const mdf = microzig.drivers;
const hal = microzig.hal;
const board = microzig.board;
const gpio = hal.gpio;
const spi = hal.spi;

const usart = hal.usart.instance.USART2;
const usart_tx_pin = gpio.Pin.init(0, 2); // PA2
const uart = board.uart_setup;
const spi_hw = board.spi_setup;

pub const panic = microzig.panic;

Expand All @@ -49,25 +50,16 @@ comptime {
_ = microzig.export_startup();
}

// Pin definitions
const sck_pin = gpio.Pin.init(0, 5); // PA5
const mosi_pin = gpio.Pin.init(0, 7); // PA7
// CS pin (device-specific, not part of board SPI setup)
const cs_pin = gpio.Pin.init(0, 3); // PA3

pub fn main() !void {
// Board brings up clocks and time
microzig.board.init();
board.init();

// Configure USART2 TX pin (PA2) for logging
usart_tx_pin.configure_alternate_function(.push_pull, .max_50MHz);

// Initialize USART2 at 115200 baud
usart.apply(.{
.baud_rate = 115200,
.remap = .default,
});

hal.usart.init_logger(usart);
// Initialize UART for logging
uart.apply(.{ .baud_rate = 115200 });
hal.usart.init_logger(uart.instance);

std.log.info("Sharp Memory LCD (nice!view) Test", .{});
std.log.info("===================================", .{});
Expand All @@ -76,25 +68,15 @@ pub fn main() !void {
std.log.info("Protocol: 3-wire SPI, LSB-first, CS active-high", .{});
std.log.info("", .{});

// Configure SPI pins
std.log.info("Configuring SPI pins...", .{});
sck_pin.configure_alternate_function(.push_pull, .max_50MHz);
mosi_pin.configure_alternate_function(.push_pull, .max_50MHz);

// Configure control pins
// Configure CS pin (device-specific)
cs_pin.enable_clock();
cs_pin.set_output_mode(.general_purpose_push_pull, .max_50MHz);

// Initialize pins to safe states
cs_pin.put(0); // CS low (idle state for Sharp - inverted logic)

// Initialize SPI1 with DMA support
const spi1 = spi.instance.SPI1;

// SPI configuration for Sharp Memory LCD
// CRITICAL: LSB-first bit order, CS active-high!
// Mode 0 (CPOL=0, CPHA=0), up to 2 MHz
std.log.info("Configuring SPI1...", .{});
std.log.info("Configuring SPI...", .{});
std.log.info(" Baud rate: 1 MHz (matching ZMK device tree)", .{});
std.log.info(" Bit order: LSB-first (CRITICAL for Sharp!)", .{});
std.log.info(" CS polarity: Active-HIGH (CRITICAL for Sharp!)", .{});
Expand All @@ -109,13 +91,12 @@ pub fn main() !void {
},
};

// Note: spi.apply() automatically enables SPI1 clock
spi1.apply(spi_config);
spi_hw.apply(spi_config);

// Create SPI Datagram Device wrapper
const SPI_DD = hal.drivers.SPI_DatagramDevice(spi_config);
var spi_dev = SPI_DD.init(
spi1,
spi_hw.instance,
cs_pin,
true, // Sharp needs CS HIGH during transmission (active-high)
mdf.time.Duration.from_ms(100),
Expand Down
Loading
Loading