#嵌入式设备 #无线 #驱动程序 #嵌入式HAL驱动程序 #nrf24l01 #嵌入式HAL #诺基亚半导体

无需 std nrf24-rs

用于嵌入式设备之间无线通信的 nRF24L01 2.4 GHz 收发器的跨平台 Rust 驱动程序

2 个版本

0.1.1 2021 年 5 月 14 日
0.1.0 2021 年 5 月 14 日

#1604嵌入式开发

MIT/Apache

72KB
1K SLoC

Rust nRF24L01 驱动程序

本软件包提供了一种跨平台的 Rust 驱动程序,用于通过 Nordic Semiconduct 的 nRF24L01 单芯片 2.4 GHz 收发器进行无线数据通信,使用 embedded-hal 特性。

Docs License License: MIT

文档

设备

Nordic Semiconductor 制造的 nRF24L01 收发器模块设计用于在全球 ISM 频率范围内运行,使用 GFSK 调制进行数据传输。数据传输速率可以是 250kbps、1Mbps 或 2Mbps。

数据表

用法

可以将 nrf24-rs 添加到项目 Cargo.toml 中的依赖项来使用此软件包。

[dependencies]
nrf24-rs = "0.1"

示例

发送数据

此简单示例将发送一个简单的 "Hello world" 消息。

use panic_halt as _;
                                                                                 
use atmega168_hal as hal;
use hal::prelude::*;
use hal::spi;
use nrf24_rs::config::{NrfConfig, PALevel};
use nrf24_rs::{Nrf24l01, SPI_MODE};
                                                                                 
#[atmega168_hal::entry]
fn main() -> ! {
    // Take peripherals
    let dp = hal::pac::Peripherals::take().unwrap();
                                                                                 
    // Initialize the different pins
    let mut portb = dp.PORTB.split();
    let ncs = portb.pb2.into_output(&mut portb.ddr);
    let mosi = portb.pb3.into_output(&mut portb.ddr);
    let miso = portb.pb4.into_pull_up_input(&mut portb.ddr);
    let sclk = portb.pb5.into_output(&mut portb.ddr);
                                                                                 
    // Initialize SPI
    let settings = spi::Settings {
        data_order: spi::DataOrder::MostSignificantFirst,
        clock: spi::SerialClockRate::OscfOver4,
        mode: SPI_MODE, // SPI Mode defined in this crate
    };
    let (spi, ncs) = spi::Spi::new(dp.SPI, sclk, mosi, miso, ncs, settings);
                                                                                 
    let mut delay = hal::delay::Delay::<hal::clock::MHz16>::new();
                                                                                 
    let message = b"Hello world!"; // The message we will be sending
                                                                                 
    // Setup some configuration values
    let config = NrfConfig::default()
        .channel(8)
        .pa_level(PALevel::Min)
        // We will use a payload size the size of our message
        .payload_size(message.len());
                                                                                 
    // Initialize the chip
    let mut nrf_chip = Nrf24l01::New(spi, ce, ncs, &mut delay, config).unwrap();
    if !nrf_chip.is_connected().unwrap() {
        panic!("Chip is not connected.");
    }
                                                                                 
    // Open a writing pipe on address "Node1".
    // The listener will have to open a reading pipe with the same address
    // in order to recieve this message.
    nrf.open_writing_pipe(b"Node1").unwrap();
                                                                                 
    // Keep trying to send the message
    while let Err(e) = nrf.write(&mut delay, &message) {
        // Something went wrong while writing, try again in 50ms
        delay.delay_ms(50u16);
    }
                                                                                 
    // Message should now successfully have been sent!
    loop {}
}

读取数据

此简单示例将读取一个 "Hello world" 消息。

use panic_halt as _;
                                                                                 
use atmega168_hal as hal;
use hal::prelude::*;
use hal::spi;
use nrf24_rs::config::{NrfConfig, PALevel, DataPipe};
use nrf24_rs::{Nrf24l01, SPI_MODE};
                                                                                 
#[atmega168_hal::entry]
fn main() -> ! {
    // Take peripherals
    let dp = hal::pac::Peripherals::take().unwrap();
                                                                                 
    // Initialize the different pins
    let mut portb = dp.PORTB.split();
    let ncs = portb.pb2.into_output(&mut portb.ddr);
    let mosi = portb.pb3.into_output(&mut portb.ddr);
    let miso = portb.pb4.into_pull_up_input(&mut portb.ddr);
    let sclk = portb.pb5.into_output(&mut portb.ddr);
                                                                                 
    // Initialize SPI
    let settings = spi::Settings {
        data_order: spi::DataOrder::MostSignificantFirst,
        clock: spi::SerialClockRate::OscfOver4,
        mode: SPI_MODE, // SPI Mode defined in this crate
    };
    let (spi, ncs) = spi::Spi::new(dp.SPI, sclk, mosi, miso, ncs, settings);
                                                                                 
    let mut delay = hal::delay::Delay::<hal::clock::MHz16>::new();
                                                                                 
    // Setup some configuration values
    let config = NrfConfig::default()
        .channel(8)
        .pa_level(PALevel::Min)
        // We will use a payload size the size of our message
        .payload_size(b"Hello world!".len());
                                                                                 
    // Initialize the chip
    let mut nrf_chip = Nrf24l01::New(spi, ce, ncs, &mut delay, config).unwrap();
    if !nrf_chip.is_connected().unwrap() {
        panic!("Chip is not connected.");
    }
                                                                                 
    // Open reading pipe 0 with address "Node1".
    // The sender will have to open its writing pipe with the same address
    // in order to transmit this message successfully.
    nrf_chip.open_reading_pipe(DataPipe::DP0, b"Node1").unwrap();
    // Set the chip in RX mode
    nrf_chip.start_listening().unwrap();
                                                                                 
    // Keep checking if there is any data available to read
    while !nrf_chip.data_available().unwrap() {
        // No data availble, wait 50ms, then check again
        delay.delay_ms(50u16);
    }
    // Now there is some data availble to read
                                                                                 
    // Initialize empty buffer
    let mut buffer = [0; b"Hello world!".len()];
    nrf_chip.read(&mut buffer).unwrap();
                                                                                 
    assert_eq!(buffer, b"Hello world!");
                                                                                 
    loop {}
}

功能标志

  • micro-fmt: 为所有公共结构和枚举提供来自 ufmt 软件包uDebug 实现。

状态

核心功能

  • 初始化
  • isChipConnected
  • startListening
  • stopListening
  • available
  • read
  • write
  • openWritingPipe
  • openReadingPipe
  • 允许多个读取管道

许可证

本项目受以下其中一项许可证的约束:

任选其一。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交给本工作的任何贡献都应作为上述双重许可证发布,不得添加任何额外的条款或条件。

依赖项

~69–320KB