pounder io extender: hack around some bug

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