Цитата
Я бы в Вашем коде тоже кое-что поменял.
Согласен, код писан 3 года назад и с тех пор кочует по проектам. Вижу косяки, только руки не доходят преписать.
Цитата
основная проблема TWI на SAM7 это то, что он работает в "синхронном" режиме То есть ему глубоко наплевать на то что мега держит линию SCL в 0(пока данные не готовы)и у него (SAM7) весь трансфер происходит "синхронно"то есть SAM7 вобще не мониторит состояние линии SCL перед тем как начать передачу!
Опс! Спасибо за наколку. Как-то внимания не обращал.
Цитата
По этому просьба, перешлите мне последовательность обращения к eeprom Возможно это поможет понять все тонкости
Да вобщем то я уже дал запись. Дам и чтение -
Код
void AT24ReadMem(DWORD addr, BYTE* src, DWORD len)
{
//DWORD AT24_Read(BYTE* data, BYTE dadr, DWORD address, DWORD size)
unsigned int status;
// Set the TWI Master Mode Register
AT91C_BASE_TWI->TWI_MMR = (0x50 << 16)| AT91C_TWI_IADRSZ_2_BYTE | AT91C_TWI_MREAD;
// Set TWI Internal Address Register
AT91C_BASE_TWI->TWI_IADR = addr;
// Start transfer
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START;
status = AT91C_BASE_TWI->TWI_SR;
while (len-- >1)
{
// Wait RHR Holding register is full
while (!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_RXRDY));
// Read byte
*(src++) = AT91C_BASE_TWI->TWI_RHR;
}
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP;
status = AT91C_BASE_TWI->TWI_SR;
// Wait transfer is finished
while (!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP));
// Read last byte
*src = AT91C_BASE_TWI->TWI_RHR;
}
Честно признаюсь, что этот фрагмент содран где-то на Сахаре.
Благополучно прожил в нескольких проектах. А вот запись повела себя ненадежно поэтому была переделана под байтовый обмен.
А какой формат обмена у вас?
адрес -> внутренний адрес-> данные
или
адрес -> вычитывание большого блока