One of the smallest STM32, the STM32F031 (Cortex M0) can do this (it has an in-built I2S controller).
This should be a good excuse for you to start with Cortex MCUs. STM32 evaluation boards are incredibly cheap.
Bought
http://www.ebay.com/itm/151289777040, will receive it in couple of days
You need to use the USART (universal synchronous asynchronous receiver transmitter) module. This allows you to send a bye at a time without bit banging data or clock lines. You will need to set up the click correctly (rising/falling edge). You will also need to bit bang the LRCLK (WCLK) line, but that is only one transition each 32 bits. It can be done but the tricks are low jitter on the LRCLK and finding enough spare cycles to obtain the next sample data.
It's actually works, but pushing limits of atmega328p for sure, I only have it on arduino nano board (and while playing with it I've blown up a current limiting resistor
), and there is a 16 MHz crystal, but well, 8 MHz is sorta enough.
This is my current source code
https://gist.github.com/jimon/f6e50913e6a8b6bea28dI've found it's really tricky to implement I2S because LSB of word comes
after WS edge
, so my current implementation is "incorrect", it can't set least significant bit. Looks like there is no FIFO at all, just one output register. So it's kinda very limited because instead of bit banging, cpu does "register banging"
Sure software FIFO is possible, but with delays to prepare buffer.
PS. I haven't found a flag to change MSB\LSB order in raw USART. There are only flags in SPI mode.