Цитата(beer_warrior @ Mar 10 2007, 20:35)

Цитата
TWI_RHR; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Не понял смысла.
Читаем мусор который с очень большой вероятностью возникнет в TWI_RHR
после выставления AT91C_TWI_MSEN
А еще после AT91C_TWI_MSEN
1 = As soon as data byte is transferred from TWI_THR to internal shifter or if a NACK error is detected, TXRDY is set at the same time as TXCOMP and NACK.
TXRDY is also set when MSEN is set (enable TWI).Так что искать логику в TWI на SAM7 нет смысла, нужно искать пути как заставить его работать

Особенно повеселило вот это из даташита:
In master
read mode, if a NACK bit is received, the STOP is automatically performed.
для байтового обмена Atmel рекомендует такие последовательности:
чтение
Код
//* Set control register and send start
*AT91C_TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN | AT91C_TWI_STOP;
//* Wait complete by TXCOMP or TXRDY
Status = *AT91C_TWI_SR;
while (!(status & AT91C_TWI_TXCOMP)){
Status = *AT91C_TWI_SR; }
//* Get data
Value = *AT91C_TWI_RHR;
запись
Код
//* Set control register
*AT91C_TWI_CR = AT91C_TWI_START | AT91C_TWI_MSEN | AT91C_TWI_STOP;
//* Set Data register for start transmission
*AT91C_TWI_THR = 0XAA;
//* Wait end transmission
Status = *AT91C_TWI_SR;
while (!(status & AT91C_TWI_TXCOMP)){
Status = *AT91C_TWI_SR; }
то есть START и STOP выставляем одновременно перед приемом передачей 1 байта
только ИМХО, там все равно не все чисто !
например при записи вы можете вобще не выставлять AT91C_TWI_START
передача начнется в любом случае при записи *AT91C_TWI_THR = 0XAA;
Кстати, а чем еще у Вас занята мега ?
Разрешены ли какие-то прерывания еще ?
Если разрешены, то сколько времени они занимают ?
какая частота i2c ?
это все имеет значение