use hcl::platform::PeripheralRef; use hcl::platform::Location; use hcl::platform::spi; use hcl::platform::gpio; pub fn read(spi: &mut PeripheralRef, nss_gpio: &mut PeripheralRef, nss_idx: u32) -> Result where SPIAddr: Location, GPIOAddr: Location { spi.configure(|s| { s.set_enabled(true) .set_master_mode(true) .set_software_slave_select(true) .set_clock_divider(128) .set_data_16bit(true) .set_clock_skip_first(true) // required for master mode, even if ss is done manually .set_slave_select_output_enabled(true) }); nss_gpio.reset_bit(nss_idx); spi.set_data(0x0000); while !spi.rx_buffer_not_empty() {} let raw_result = spi.data(); while spi.busy() {} nss_gpio.set_bit(nss_idx); spi.set_enabled(false); if raw_result & (1 << 2) != 0 { Err("MAX6675: Termocouple measures open") } else { let result = ((raw_result >> 3) as f32) * 0.25; Ok(result) } }