I have been struggling with getting a MCP3564R ADC chip for multiple days.
SPI communication works fine. The chip takes in register writes and can read them out nicely. However the ADC result register is always 0x000000. The Data Ready flag toggles up every so often just like it should, but still all zeroes
Later on i found a bit of a minefield of reserved registers that must be set to 1 in order for the chip to work, did forget to set one of those to 1 indeed. Still didn't work.
Then went down a laundry list of things to check:
- Changed the sample rate and observed the 0x00000 results coming out faster or slower
- Tried combinations of external or internal voltage references
- Enabled the internal clock output pin and seen it producing a nice stable square wave
- Checked the soldering multiple times. Including poking pins with tweezers
- Checked all the supply voltages multiple times.
- Swapping to a brand new chip
- Checked SPI signal integrity, looked clean
- Slowed down SPI a lot
etc...
Yet still getting all 0s as the result.

Getting desperate i decide to check the IRQ pin that i am not using (since i plan on polling it at a low speed). So since i don't need it i just leave it floating. But hey lets scope it out in case it sheds some light on it, i am running out things to even try. Next idea was to order a evaluation board for that chip. Then i read up how the IRQ pin works and find this....
-only-reading-zero-(solved-dirty-trap)/?action=dlattach;attach=1783766;image)
Wait what...

Why the hell would you do that?! Screw you Microchip!
Well looks like the edges on IRQ pins are used to help synchronize together multiple chips when being used in the raw MDAT mode where it barfs out the raw 4bit sigma delta modulator values. But even if you don't use that mode the IRQ pin maintains this functionality. So the chip will be running fine yet the modulator would be sitting still and doing nothing because it is permanently waiting to be synchronized with 'other chips'.
So i just reconfigured the IRQ pin to be a push pull instead of open collector and it WORKS!

I am leaving this as a thread here in case someone else runs into the same dumb nonsense problem.