Regarding logic levels, it's usually possible to connect a +3.3V output to a +5V input directly, however a +5V output should be level shifted for a +3.3V input.
It's good for serial, I2C and SPI up to around 2MHz.
If I need to interface to a +5V device, I usually level shift all the signals. This way I know that the logic levels are safe for the microcontroller, even if I get the accidently get my wires crossed. Something that happens more often than I care to admit.