pounder io extender: hack around some bug

master
Robert Jördens 2021-05-26 14:18:46 +00:00
parent 79f8838104
commit 94f60c100c
1 changed files with 15 additions and 19 deletions

View File

@ -17,6 +17,7 @@ use rf_power::PowerMeasurementInterface;
use embedded_hal::{adc::OneShot, blocking::spi::Transfer};
#[allow(dead_code)]
const EXT_CLK_SEL_PIN: u8 = 8 + 7;
#[allow(dead_code)]
const OSC_EN_N_PIN: u8 = 8 + 6;
@ -300,16 +301,16 @@ impl PounderDevices {
adc2_in_p,
};
// Configure power-on-default state for pounder. All LEDs are on, on-board oscillator
// selected, attenuators out of reset. Note that testing indicates the output state needs to
// be set first to properly update the output registers.
// Configure power-on-default state for pounder. All LEDs are off, on-board oscillator
// selected and enabled, attenuators out of reset. Note that testing indicates the
// output state needs to be set first to properly update the output registers.
devices
.mcp23017
.all_pin_mode(mcp23017::PinMode::OUTPUT)
.map_err(|_| Error::I2c)?;
devices
.mcp23017
.write_gpio(mcp23017::Port::GPIOA, 0x3F)
.write_gpio(mcp23017::Port::GPIOA, 0x00)
.map_err(|_| Error::I2c)?;
devices
.mcp23017
@ -324,12 +325,11 @@ impl AttenuatorInterface for PounderDevices {
/// Reset all of the attenuators to a power-on default state.
fn reset_attenuators(&mut self) -> Result<(), Error> {
self.mcp23017
.digital_write(ATT_RST_N_PIN, false)
.write_gpio(mcp23017::Port::GPIOB, 0x0f)
.map_err(|_| Error::I2c)?;
// TODO: Measure the I2C transaction speed to the RST pin to ensure that the delay is
// sufficient. Document the delay here.
// Duration of one I2C transaction is sufficiently long.
self.mcp23017
.digital_write(ATT_RST_N_PIN, true)
.write_gpio(mcp23017::Port::GPIOB, 0x2f)
.map_err(|_| Error::I2c)?;
Ok(())
@ -341,21 +341,17 @@ impl AttenuatorInterface for PounderDevices {
/// * `channel` - The attenuator channel to latch.
fn latch_attenuator(&mut self, channel: Channel) -> Result<(), Error> {
let pin = match channel {
Channel::In0 => ATT_LE0_PIN,
Channel::In1 => ATT_LE2_PIN,
Channel::Out0 => ATT_LE1_PIN,
Channel::Out1 => ATT_LE3_PIN,
Channel::In0 => 0,
Channel::Out0 => 1,
Channel::In1 => 2,
Channel::Out1 => 3,
};
self.mcp23017
.digital_write(pin, false)
.write_gpio(mcp23017::Port::GPIOB, 0x2f & !(1 << pin))
.map_err(|_| Error::I2c)?;
// Duration of one I2C transaction is sufficiently long.
self.mcp23017
.digital_write(pin, false)
.map_err(|_| Error::I2c)?;
// TODO: Measure the I2C transaction speed to the RST pin to ensure that the delay is
// sufficient. Document the delay here.
self.mcp23017
.digital_write(pin, true)
.write_gpio(mcp23017::Port::GPIOB, 0x2f)
.map_err(|_| Error::I2c)?;
Ok(())
}