2018-08-28 21:17:26 +02:00
|
|
|
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| {
|
2018-08-29 00:43:29 +02:00
|
|
|
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)
|
|
|
|
});
|
2018-08-28 21:17:26 +02:00
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|