#spi #wifi #driver #inventek

无标准库 drogue-es-wifi

Inventek eS-WiFi SPI WiFi卸载板接口

3个版本

0.1.2 2020年10月12日
0.1.1 2020年10月12日
0.1.0 2020年10月12日

#81 in #spi

Apache-2.0

37KB
992 代码行(不包括注释)

crates.io docs.rs Matrix

drogue-es-wifi

用于Inventek eS-WiFi SPI WiFi卸载板的驱动程序。

使用方法

eS-WiFi板通过SPI外设接口,加上一些额外的引脚

  • SPI
    • SCK
    • CIPO
    • COPI
  • 芯片选择
  • 就绪
  • 唤醒
  • 复位

引脚

根据您的特定芯片组适当地收集和配置SPI和非SPI引脚

let sck = gpioc.pc10.into_af6(&mut gpioc.moder, &mut gpioc.afrh);

let cipo = gpioc.pc11.into_af6(&mut gpioc.moder, &mut gpioc.afrh);

let copi = gpioc.pc12.into_af6(&mut gpioc.moder, &mut gpioc.afrh);

let mut cs = gpioe.pe0.into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);

let mut ready = gpioe.pe1.into_pull_up_input(&mut gpioe.moder, &mut gpioe.pupdr);

let mut reset = gpioe.pe8.into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);

let mut wakeup = gpiob.pb13.into_push_pull_output(&mut gpiob.moder, &mut gpiob.otyper);

let mut spi = Spi::spi3(
    device.SPI3,
    (sck, cipo, copi),
    MODE,
    20.mhz(),
    clocks,
    &mut rcc.apb1r1,
);

时钟

需要嵌入式时间 Clock以提供适当的延迟和超时。 drogue-embedded-timer crate提供管理时钟的实用程序和说明。

初始化

初始化SPI外设、额外引脚和时钟后,您可以初始化WiFi适配器

let wifi = drogue_es_wifi::adapter::Adapter::new(
    spi,
    cs,
    ready,
    wakeup,
    reset,
    &CLOCK,
).unwrap();

加入接入点

在使用适配器之前,&CLOCK必须正在运行。

要加入WEP加密的接入点

let response = wifi.join_wep("drogue", "rodneygnome");

TCP连接

适配器直接实现了drogue-network TcpStack

let remote = HostSocketAddr::new(
    HostAddr::new(IpAddr::from_str("192.168.1.245").unwrap(), Option::None),
    80,
);

let mut socket = wifi.open(drogue_network::tcp::Mode::Blocking).unwrap();
let mut socket = wifi.connect(socket, remote).unwrap();

let len = wifi.write(&mut socket, b"GET / HTTP/1.1\r\nhost:192.168.1.245\r\n\r\n").unwrap();

loop {
    let mut buffer: [u8; 1024] = [0; 1024];
    let result = wifi.read(&mut socket, &mut buffer);

    match result {
        Ok(len) => {
            let s = core::str::from_utf8(&buffer[0..len]).unwrap();
            log::info!( "{}", s);
        }
        Err(e) => {
            match e {
                Error::Other(e) => {
                    log::error!("error {:?}", e);
                    break;
                }
                Error::WouldBlock => {
                }
            }
        }
    }
}

wifi.close(socket).unwrap();

依赖项

~3MB
~56K SLoC