This is what I ended up with... I think it's kind of ugly, but it works 🙃 ``` mod registers{ pub struct PMSC; impl Into for PMSC{ fn into(self) -> u8{0x00} } impl PMSC { ///PMSC Control Register 0 pub const CTRL0: u8 = 0x00; ///PMSC Control Register 1 pub const CTRL1: u8 = 0x04; //PMSC reserved area 1 //pub const RES1: u8 = 0x08; /// PMSC Snooze Time Register pub const SNOZT: u8 = 0x0C; //PMSC reserved area 2 //pub const RES2: u8 = 0x10; ///PMSC fine grain TX sequencing control pub const TXFSEQ: u8 = 0x26; ///PMSC LED Control Register pub const LEDC: u8 = 0x28; } pub struct OTP; impl Into for OTP{ fn into(self) -> u8{0x2D} } impl OTP{ ///OTP Write Data pub const WDAT : u8 = 0x00; ///OTP Address pub const ADDR : u8 = 0x04; ///OTP Control pub const CTRL : u8 = 0x06; ///OTP Status pub const STAT : u8 = 0x08; ///OTP Read Data pub const RDAT : u8 = 0x0A; ///OTP SR Read Data pub const SRDAT: u8 = 0x0E; ///OTP Special Function pub const SF : u8 = 0x12; } } ``` And how it's used: l ``` et mut buf = [0x03, 0x01]; Transaction::default() .set_write().set_register(registers::PMSC.into()) .send(&mut self.spi, &mut buf).await?; buf = [0x80, 0x00]; Transaction::default() .set_write().set_register(registers::OTP.into()) .set_sub_index(registers::OTP::CTRL) .send(&mut self.spi, &mut buf).await?; ``` Is this a decent way to do it or bad practice?