#embedded-hal #i2c #gpio #spi #rtos #delay #nutt-x

no-std nuttx-embedded-hal

Rust Embedded HAL for Apache NuttX RTOS

11 stable releases

1.0.10 Mar 21, 2022
1.0.7 Mar 19, 2022
1.0.6 Mar 18, 2022
1.0.3 Mar 17, 2022

#360 in Embedded development

Apache-2.0

30KB
402 lines

Rust Embedded HAL for Apache NuttX RTOS

This crate provides Rust Embedded HAL interfaces (GPIO, I2C, SPI and Delay) for Apache NuttX RTOS.

For sample NuttX Rust apps, see rust-i2c-nuttx and rust_test

If you find this crate useful, please support me on GitHub Sponsors

More about NuttX Embedded HAL...

GPIO Output

//  Import Output Pin Trait
use embedded_hal::digital::v2::OutputPin;

//  Open /dev/gpio1 for GPIO Output
let mut gpio = nuttx_embedded_hal::OutputPin
    ::new("/dev/gpio1")
    .expect("open gpio failed");

//  Set Chip Select to Low
gpio.set_low()
    .expect("set gpio failed");

//  Set Chip Select to High
gpio.set_high()
    .expect("set gpio failed");

(Documentation)

(Implementation)

GPIO Input

//  Import Input Pin Trait
use embedded_hal::digital::v2::InputPin;

//  Open /dev/gpio0 for GPIO Input
let gpio = nuttx_embedded_hal::InputPin
    ::new("/dev/gpio0")
    .expect("open gpio failed");

//  True if GPIO is High
let is_high = gpio.is_high()
    .expect("read gpio failed");

//  True if GPIO is Low
let is_low = gpio.is_low()
    .expect("read gpio failed");

(Documentation)

GPIO Interrupt

Interrupt callbacks are not supported yet.

//  Import Input Pin Trait
use embedded_hal::digital::v2::InputPin;

//  Open /dev/gpio2 for GPIO Interrupt
let gpio = nuttx_hal::InterruptPin
    ::new("/dev/gpio2");
    .expect("open gpio failed");

//  True if GPIO is High
let is_high = gpio.is_high()
    .expect("read gpio failed");

//  True if GPIO is Low
let is_low = gpio.is_low()
    .expect("read gpio failed");

(Documentation)

I2C

//  Import I2C Trait
use embedded_hal::blocking::i2c;

//  Open I2C Port /dev/i2c0
let mut i2c = nuttx_embedded_hal::I2c::new(
    "/dev/i2c0",  //  I2C Port
    400000,       //  I2C Frequency: 400 kHz
).expect("open failed");

//  Buffer for received I2C data
let mut buf = [0 ; 1];

//  Read register 0xD0 from I2C Address 0x77
i2c.write_read(
    0x77,     //  I2C Address
    &[0xD0],  //  Register ID
    &mut buf  //  Buffer to be received
).expect("read register failed");

//  Print the register value
println!("Register value is 0x{:02x}", buf[0]);

//  Write 0xA0 to Register 0xF5
i2c.write(
    0x77,          //  I2C Address
    &[0xF5, 0xA0]  //  Register ID and value
).expect("write register failed");

(Documentation)

(Implementation)

SPI

The SPI interface requires the SPI Test Driver (/dev/spitest0) to be installed:

SPI settings are configured in the SPI Test Driver.

//  Import SPI Trait
use embedded_hal::blocking::spi;

//  Open SPI Bus /dev/spitest0
let mut spi = nuttx_embedded_hal::Spi
    ::new("/dev/spitest0")
    .expect("open spi failed");

//  Open GPIO Output /dev/gpio1 for Chip Select
let mut cs = nuttx_embedded_hal::OutputPin
    ::new("/dev/gpio1")
    .expect("open gpio failed");

//  Set Chip Select to Low
cs.set_low()
    .expect("cs failed");

//  Transmit and receive SPI data
let mut data: [ u8; 5 ] = [ 0x1d, 0x00, 0x08, 0x00, 0x00 ];
spi.transfer(&mut data)
    .expect("spi failed");

//  Show the received SPI data
for i in 0..data.len() {
    println!("{:02x}", data[i as usize]);
}

//  Set Chip Select to High
cs.set_high()
    .expect("cs failed");

(Documentation)

(Implementation)

Delay

//  Import Delay Trait (milliseconds)
use embedded_hal::blocking::delay::DelayMs;

//  Get a Delay Interface
let mut delay = nuttx_embedded_hal::Delay;

//  Wait 500 milliseconds
delay.delay_ms(500_u32);

(Documentation)

Dependencies

~715KB
~13K SLoC