Значит так, проблема решена следующим образом:
Код
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 , если будете проездом в Киеве, смело рассчитывайте на пиво