1. Зачем нужно реализовывать SPI программным путем? Почему просто не использовать аппаратный? Типа SPDR=c и все? 2. Кому Вы собственно передаете символы по SPI? 3. Почему Вы решили что putchar должна переопределяться в stdio.h? Она может быть определена где угодно и будет использоваться если это указать компилятору с помощью #define _ALTERNATE_PUTCHAR_.