reflow-firmware2.0/src/max6675.rs

43 lines
1.2 KiB
Rust

use hcl::platform::PeripheralRef;
use hcl::platform::Location;
use hcl::platform::spi;
use hcl::platform::gpio;
pub fn read<SPIAddr, GPIOAddr>(spi: &mut PeripheralRef<spi::SPI, SPIAddr>,
nss_gpio: &mut PeripheralRef<gpio::GPIO, GPIOAddr>,
nss_idx: u32)
-> Result<f32, &'static str>
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)
}
}