#register #byte-array #peripheral #traits #abstraction #spi #i2c

regiface

一个用于简化与嵌入式外设寄存器接口开发的crate

5个版本

0.1.4 2024年2月12日
0.1.3 2024年2月12日
0.1.2 2024年2月12日
0.1.1 2024年1月29日
0.1.0 2024年1月29日

#446 in 嵌入式开发

每月45次下载

MIT/Apache

25KB
346

该crate提供了一些实用类型,用于编写与基于寄存器的设备接口的抽象。通常,这将在编写嵌入式环境中的外部外设驱动程序时使用。因此,提供了一些用于在I2C或SPI总线上读取和写入设备寄存器的外部实用函数。

该crate提供了一种名为 Register 的单一特质,用于实现所有表示存储在可寻址寄存器中的值的类型。该特质仅提供了一种方法来检索与给定寄存器关联的ID。

可读寄存器

可以从中检索或读取值的寄存器表示为任何实现了 ReadableRegister 特质的类型。这个特质几乎只是一个标记特质,但它表示了一个既是 Register 又可以通过 FromByteArray 特质从字节数组创建的类型。编写可从寄存器读取的类型的大部分工作将在于实现 FromByteArray 特质。

实现了 ReadableRegister 特质的类型可以与提供的实用方法一起使用,例如 i2cspi 模块提供的那些。

寄存器实现示例

use regiface::{Register, ReadableRegister, FromByteArray};

// A type we will use to represent some fictional register struct 
MyRegister {    
    value: u8
}

// Implement the Register trait, and specify it has an ID of 42u8
impl Register for MyRegister {    
    type IdType = u8;

    fn id() -> Self::IdType {
        42    
    }
}

// Implement the FromByteArray trait, and specify it can be converted from a 1-byte array 
impl FromByteArray for MyRegister {
    type Error = core::convert::Infallible;
    type Array = [u8; 1];

    fn from_bytes(bytes: Self::Array) -> Result<Self, Self::Error> {
        Ok(Self {
            value: bytes[0]        
        })    
    }
}

// Indicate this is a readable register!
impl ReadableRegister for MyRegister {}

可写寄存器

可以写入值的寄存器表示为任何实现了 WritableRegister 特质的类型。这个特质几乎只是一个标记特质,但它表示了一个既是 Register 又可以通过 ToByteArray 特质序列化为字节数组的类型。编写可写入寄存器的类型的大部分工作将在于实现 ToByteArray 特质。

实现了 WritableRegister 特质的类型可以与提供的实用方法一起使用,例如 i2cspi 模块提供的那些。

寄存器实现示例

use regiface::{Register, WritableRegister, ToByteArray};

// A type we will use to represent some fictional register 
struct MyRegister {    
    value: u8
}

// Implement the Register trait, and specify it has an ID of 42u8
impl Register for MyRegister {    
    type IdType = u8;

    fn id() -> Self::IdType {        
        42    
    }
}

// Implement the ToByteArray trait, and specify it can be converted to a 1-byte array 
impl ToByteArray for MyRegister {    
    type Error = core::convert::Infallible;    
    type Array = [u8; 1];

    fn to_bytes(self) -> Result<Self::Array, Self::Error> {        
        Ok([self.value])    
    }
}

// Indicate this is a readable register!
impl WritableRegister for MyRegister {}

依赖关系

~0.4–1MB
~24K SLoC