rw007 0.1.0

RW007 SPI WiFi module driver for embedded Rust
Documentation
# rw007

[English]README.md | 中文

[![CI]https://github.com/andelf/rw007/actions/workflows/ci.yml/badge.svg]https://github.com/andelf/rw007/actions/workflows/ci.yml
[![crates.io]https://img.shields.io/crates/v/rw007.svg]https://crates.io/crates/rw007
[![docs.rs]https://docs.rs/rw007/badge.svg]https://docs.rs/rw007

**RW007** SPI WiFi 模块的 Rust 驱动。

## 简介

**RW007** 是上海睿赛德电子科技有限公司开发的基于 Cortex-M4 WiFi SoC 的高速 SPI/UART WiFi 模块。本 crate 提供了 RW007 模块 SPI 接口的 `no_std` Rust 驱动。

### 特性

- 支持 `no_std` - 适用于裸机嵌入式系统
- 阻塞 API - 基于 `embedded-hal` 1.0 traits
- 异步 API - 基于 `embedded-hal-async`(需启用 `async` feature)
- Embassy 集成 - 通过 `embassy-net-driver-channel` 实现
- WiFi 操作:扫描、连接、断开、获取信号强度
- 完整的 SPI 两阶段传输协议实现

## 硬件连接

RW007 模块需要以下引脚连接:

| 引脚 | 说明 |
|------|------|
| SPI_CLK | SPI 时钟 |
| SPI_MOSI | SPI 主出从入 |
| SPI_MISO | SPI 主入从出 |
| CS | 片选(由驱动直接控制) |
| RST | 复位(由驱动直接控制) |
| INT | 中断 / 数据就绪指示 |
| VCC | 3.3V 电源 |
| GND ||

**注意**:CS 引脚由驱动直接控制,以支持两阶段 SPI 协议。

## 使用方法

添加到 `Cargo.toml`:

```toml
[dependencies]
rw007 = "0.1"

# 启用 Embassy 异步支持
rw007 = { version = "0.1", features = ["async"] }

# 启用 defmt 日志
rw007 = { version = "0.1", features = ["defmt"] }
```

### 阻塞示例

```rust
use rw007::{Rw007, Security};

// 使用 SPI、CS、RST、INT 引脚创建驱动
let mut wifi = Rw007::new(spi, cs_pin, rst_pin, int_pin);

// 复位并初始化模块
wifi.reset(&mut delay)?;
wifi.init(&mut delay)?;

// 获取固件版本
let version = wifi.get_version(&mut delay)?;
println!("固件版本: {}", version);

// 扫描 WiFi 网络
let results = wifi.scan(&mut delay)?;
for ap in results.as_slice() {
    println!("发现网络: {} ({} dBm)", ap.ssid.as_str().unwrap_or("?"), ap.rssi);
}

// 连接 WiFi
wifi.join("MyNetwork", "password123", Security::Wpa2Psk, &mut delay)?;
```

### 异步示例(Embassy)

```rust
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) {
    // 创建异步驱动
    let state = STATE.init(State::new());
    let (net_device, mut control, runner) = new_async(state, spi, cs, rst, int);

    // 启动 WiFi 后台任务
    spawner.spawn(wifi_task(runner)).unwrap();

    // 初始化并连接
    control.init().await?;
    control.connect("MyNetwork", "password123", Security::Wpa2Psk).await?;

    // 创建网络协议栈
    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();

    // 等待获取 IP 地址
    stack.wait_config_up().await;

    // 现在可以使用 TCP/UDP socket 了!
}

#[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
}
```

## Features

| Feature | 说明 |
|---------|------|
| `defmt` | 启用 defmt 日志支持 |
| `async` | 启用 Embassy 异步驱动支持 |

## 支持的操作

| 操作 | 阻塞 | 异步 |
|------|------|------|
| 复位 |||
| 初始化 |||
| 获取版本 |||
| 获取 MAC |||
| 扫描 |||
| 连接 |||
| 断开 |||
| 获取 RSSI |||
| TCP/UDP(通过 embassy-net) | - ||

## 许可证

本项目采用以下任一许可证:

- Apache License, Version 2.0 ([LICENSE-APACHE]LICENSE-APACHEhttp://www.apache.org/licenses/LICENSE-2.0)
- MIT license ([LICENSE-MIT]LICENSE-MIThttp://opensource.org/licenses/MIT)

## 参考资料

- [RT-Thread RW007 软件包]https://github.com/RT-Thread-packages/rw007 - RT-Thread 原版 C 驱动
- [RW007 模块使用指南]https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/packages/rw007_module_using/an0034-rw007-module-using