Код
//--------------------------------------------------------------------------
void InitI2C(void)
{
//device on
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,(1 << AT91C_ID_TWI));
//enable device
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_SWRST;
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_MSEN;
//clock config
AT91C_BASE_TWI->TWI_CWGR = ((0x22 << 0) | //clk_lo
(0x22 << 8) | //clk_hi
(3 << 16));
}
//--------------------------------------------------------------------------
Вроде нашел зацепку. После изменения константы старая была прочитана еще раз, а потом пошла новая. Т.е. похоже нелады с THR/RHR, что-то там в эррате было на эту тему - сейчас сяду читать.