Hi Ben,
One step forward and one back... Looking at the code for MifareRead I notice that the buffer needs to be 18 bytes long (16 + 2 crc - MifareWrite creates an extra (18 byte) buffer so needs 16 bytes...)
That leads - to MifareRead returning 3 (Timeout?) and some (4) values stored in the buffer.....
However, it only works if the SPI is set to software - hardware mode doesn't work (I've mentioned this before - but I still couldn;t give a definitive answer as to when software mode only works - and when it changes and hardware mode works. I've noticed in several projects that there is a sudden changeover when hardware mode 'suddenly' starts working) - Scratch that - I've just noticed that hardware mode seems to get 'locked' so resetting the Arduino (by pulling the plug) re-enables hardware mode.... Once it is working it seems 'hard' to lock it again - if I notice an example I'll pass it on (but until then 'Have you tried switching it off and on again' still seems to be sage advice

) (Or not - just tried adding a repeat read of a block until return is 0 - and we are back in software mode only

)
Even in hardware SPI mode - I get error 3 returned from MiFare read (it is a problem with Flowcode that there isn't an easy way to document the return values such as this - so I peeked at the C and made an educated guess...)
Code is:
The hardware does seem to work AOK - tested using the Arduino library too.
Martin