| Crates.io | rw007 |
| lib.rs | rw007 |
| version | 0.1.0 |
| created_at | 2026-01-25 03:21:54.263593+00 |
| updated_at | 2026-01-25 03:21:54.263593+00 |
| description | RW007 SPI WiFi module driver for embedded Rust |
| homepage | |
| repository | https://github.com/hpmicro-rs/rw007 |
| max_upload_size | |
| id | 2068017 |
| size | 139,105 |
中文 | English
Rust driver for RW007 SPI WiFi module.
RW007 is a high-speed SPI/UART WiFi module based on Cortex-M4 WiFi SoC, developed by Shanghai Positive Electronic Technology Co., Ltd. This crate provides a no_std Rust driver for the RW007 module using the SPI interface.
no_std compatible - works on bare metal embedded systemsembedded-hal 1.0 traitsembedded-hal-async (with async feature)embassy-net-driver-channelThe RW007 module requires the following connections:
| Pin | Description |
|---|---|
| SPI_CLK | SPI Clock |
| SPI_MOSI | SPI Master Out Slave In |
| SPI_MISO | SPI Master In Slave Out |
| CS | Chip Select (directly directly by driver) |
| RST | Reset (directly controlled by driver) |
| INT | Interrupt / Data Ready indicator |
| VCC | 3.3V Power |
| GND | Ground |
Note: CS pin directly controlled by the driver to support the two-phase SPI protocol.
Add to your Cargo.toml:
[dependencies]
rw007 = "0.1"
# For async support with Embassy
rw007 = { version = "0.1", features = ["async"] }
# For defmt logging
rw007 = { version = "0.1", features = ["defmt"] }
use rw007::{Rw007, Security};
// Create driver with SPI, CS, RST, INT pins
let mut wifi = Rw007::new(spi, cs_pin, rst_pin, int_pin);
// Reset and initialize the module
wifi.reset(&mut delay)?;
wifi.init(&mut delay)?;
// Get firmware version
let version = wifi.get_version(&mut delay)?;
println!("Firmware: {}", version);
// Scan for WiFi networks
let results = wifi.scan(&mut delay)?;
for ap in results.as_slice() {
println!("Found: {} ({} dBm)", ap.ssid.as_str().unwrap_or("?"), ap.rssi);
}
// Connect to WiFi
wifi.join("MyNetwork", "password123", Security::Wpa2Psk, &mut delay)?;
use rw007::{new_async, State, Control, Runner, Security};
use embassy_net::{Stack, StackResources};
use static_cell::StaticCell;
static STATE: StaticCell<State> = StaticCell::new();
static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
#[embassy_executor::main]
async fn main(spawner: Spawner) {
// Create async driver
let state = STATE.init(State::new());
let (net_device, mut control, runner) = new_async(state, spi, cs, rst, int);
// Spawn WiFi runner task
spawner.spawn(wifi_task(runner)).unwrap();
// Initialize and connect
control.init().await?;
control.connect("MyNetwork", "password123", Security::Wpa2Psk).await?;
// Create network stack
let config = embassy_net::Config::dhcpv4(Default::default());
let resources = RESOURCES.init(StackResources::new());
let (stack, net_runner) = embassy_net::new(net_device, config, resources, seed);
spawner.spawn(net_task(net_runner)).unwrap();
// Wait for IP address
stack.wait_config_up().await;
// Now you can use TCP/UDP sockets!
}
#[embassy_executor::task]
async fn wifi_task(runner: Runner<'static, ...>) -> ! {
runner.run().await
}
#[embassy_executor::task]
async fn net_task(runner: embassy_net::Runner<'static, rw007::NetDriver<'static>>) -> ! {
runner.run().await
}
| Feature | Description |
|---|---|
defmt |
Enable defmt logging support |
async |
Enable async driver with Embassy support |
| Operation | Blocking | Async |
|---|---|---|
| Reset | ✅ | ✅ |
| Init | ✅ | ✅ |
| Get Version | ✅ | ✅ |
| Get MAC | ✅ | ✅ |
| Scan | ✅ | ❌ |
| Connect | ✅ | ✅ |
| Disconnect | ✅ | ✅ |
| Get RSSI | ✅ | ✅ |
| TCP/UDP (via embassy-net) | - | ✅ |
Licensed under either of:
at your option.