Context: I have designed a custom data acquisition board centered around the MAX11046 ADC. The schematic of the MAX11046 section pulls almost exactly from the MAX11046EVKIT and can be found here. The ADC is controlled entirely with an STM32 development board.
Problem: When attempting to read data from the ADC via the parallel communication interface, the ADC produces some weird behaviour. Under normal operation, the board consumes ~74mA of current; REFIO has the expected output; I get a response via EOC. Yet, in trying to advance the channel by pulling CS and RD low, the current consumption drops to ~35mA; REFIO no longer has an output; EOC never goes high. It seems that the ADC shuts down, and in order to fix this state, I need to reset power to the ADC.
One thing I have noticed is that when I leave RD disconnected, and let everything else run normally, this weird state is not triggered; thus it seems as the issue is not of pulling CONVST or CS high/low, but doing so in tandem with RD or just RD alone.
I have also attempted to test setting each of CONVST, CS, RD high/low manually by physically wiring them to either 3.3V or GND for all 8 possible combinations of states. However, I was unable to replicate the behaviour this way, which leaves me even more confused. Help would be immensely appreciated!
Here is a very basic block diagram for how everything is wired up:

All the grounds are connected together.
Here is the simplified code, which runs once on button press:
convst.set_high();
cs.set_high();
rd.set_high();
// Wait 1s after initialization
delay.delay_ms(1000u32);
hprintln!("Init Complete");
// Start the conversion
convst.set_low();
delay.delay_us(1u32);
convst.set_high();
// Wait until conversion is complete
while eoc.is_high() {
hprintln!("EOC is High");
}
hprintln!("Completed");
// Start reading tha data
convst.set_low();
cs.set_low();
let mut code: u16 = 0;
for i in 0..8usize {
rd.set_low();
hprintln!("Channel: {}", i);
delay.delay_us(1u32);
code = 0;
for (n, bit) in bus.iter().enumerate() {
if bit.is_high() {
code = code | (1 << n);
}
}
hprintln!("Reading: {:?}", code);
rd.set_high();
delay.delay_us(1u32);
}
rd.set_high();
cs.set_high();
delay.delay_us(1u32);
convst.set_high();
If needed, the full schematic and PCB can be viewed here.