Цитата(beer_warrior @ Mar 10 2007, 22:13)

Значит так, проблема решена следующим образом:
Код
bool ReadByteI2C(BYTE addr, BYTE* data)
{
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*data = AT91C_BASE_TWI->TWI_RHR;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//set device & internal adr
AT91C_BASE_TWI->TWI_MMR = (addr << 16)| AT91C_TWI_MREAD; //start
TWI_START();
//write data
while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_RXRDY));
*data = AT91C_BASE_TWI->TWI_RHR;
//stop
TWI_STOP();
while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP));
//*data = AT91C_BASE_TWI->TWI_RHR;
return true;
}
#define TWI_START() AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START;
#define TWI_STOP() AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP;
Весь остальной код, тот же, что и в начале топика.
Закомментированное чтение в конце функции всегда возвращает 0.
Неработающая запись в предыдущем посте - глюк РС-шного софта.
Протестировано записью произвольных значений в PORTD работающий на выход и последующего чтения из PIND. Процесс перемежался с произвольными обращениями к памяти. Пока глюков не замечено.
Следующим номером программы намечен запуск I2C LCD на той же шине. Ежели появятся глюки - сообщу.
Уважаемый
singlskv , если будете проездом в Киеве, смело рассчитывайте на пиво

Пыво это с удовольствием
Но, такое решение:
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*data = AT91C_BASE_TWI->TWI_RHR;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
подходит только для байтового обмена !!!
Если будет последовательное чтение с EEPROM или FRAM то это будет работать криво
Давайте разбираться подробнее, если конечно есть желание...
В двух словах моя проблема:
i2c на меге работает по полингу
i2c на АРМ работает по прерываниям
основная проблема TWI на SAM7 это то, что он работает в "синхронном" режиме
То есть ему глубоко наплевать на то что мега держит линию SCL в 0(пока данные не готовы)
и у него (SAM7) весь трансфер происходит "синхронно"
то есть SAM7 вобще не мониторит состояние линии SCL перед тем как начать передачу!
С этой проблеммой я кое-как разобрался,
НО, раз в секунду (2,3,5 секунд) у меня происходит следующее:
мега получает правильный запрос, готовит ответ и передает его при запросе от мастера
Ответ от меги ТОЧНО готовится правильный
при этом (иногда) SAM7 получает первый байт ответа неправильным
в нем установлен старший бит в 1 хотя должен быть 0
Так как у меня сейчас нет подключенного к i2c "железного" i2c девайса
то поймать где проблемма не получается
По этому просьба, перешлите мне последовательность обращения к eeprom
Возможно это поможет понять все тонкости
P.S. Кстати на счет Меги
Я бы в Вашем коде тоже кое-что поменял.