Реализую чтение и запись даты и времени, на SAM7X512 в IAR 5.4. Сначала чтение сделал за один проход как чтение из микросхемы с внутренним адресом. Т.е. устанавливал внутренний адрес 0x08 и читал 9 байт.
Считывалась последовательность байт: 0xA9 0x80 0x13 0x19 0x00 0xFF 0xFF 0x00 0x00. Причём секунды и минуты (0x13 и 0x19) тикают и изменяются верно, часы и дату пока проверить не успел. Но с датой какая то ерунда - читается 45.00.0000.
Пробовал сделать чтение регистров как сказано в даташите на ds1340, т.е. сначала запись 1 байта адреса регистра, а затем повторный старт на чтение. Считывается та же последовательность байт. Осциллограммы обоих вариантов в приложении. Смутило на осциллограммах что нет межбайтовых интервалов, при обмене с другими модулями (на меге8, меге32) интервалы присутствуют.
В чём может быть подвох?
В основной программе:
StateTWI=ReadRTC;
EndDataInTWI=9;
PtrDataInTWI=0; // Будет прочитан ответ 9 байт
AT91C_BASE_TWI->TWI_MMR = (1 << 8) | AT91C_TWI_MREAD | ((CntAddrTWI >> 1) << 16); // 1-байтовый внутренний адрес
AT91C_BASE_TWI->TWI_IADR = 0x08; // Начальный адрес регистров RTC
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START; // START
AT91C_BASE_TWI->TWI_IER = AT91C_TWI_RXRDY | AT91C_TWI_TXCOMP; // Ловить будем получение байта и окончание обмена по NACK на адрес
В обработчике прерывания от TWI:
unsigned int status = AT91C_BASE_TWI->TWI_SR; // читаем статус TWI
if (status & AT91C_TWI_RXRDY) // Сначала был получен байт от модуля (до окончания обмена) // Устройство отправило в CPU байт
{
DataInTWI[PtrDataInTWI]=AT91C_BASE_TWI->TWI_RHR; // Прочитали очередной байт
if (++PtrDataInTWI >= (EndDataInTWI-1)) // Если принят предпоследний байт
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP; // STOP. После этого будет принят последний байт по событию TWI_TXCOMP
}
if (status & AT91C_TWI_TXCOMP) // Пришёл последний байт от устройства
{
DataInTWI[PtrDataInTWI] = AT91C_BASE_TWI->TWI_RHR;
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP; // STOP
AT91C_BASE_TWI->TWI_IDR = 0xFFFFFF; // Выключаем все прерывания от TWI
StateTWI=255; // Ставим признак свободного TWI
//////------- Отладочный вывод в COM-порт принятого пакета --------
unsigned char i;
for (i=0;i<(EndDataInTWI+1);i++)
AddToRS(DataInTWI[i]);
AddToRS(0x7E);
//////--------------------------------------------------------------------------
PoiskTWI |= fPoiskTWIData; // Ставим флаг - Есть пакет на обработку
}
Пробую читать разное количество регистров, все значения те же, что и при считывании пачкой, ну кроме секунд и минут которые уже натикали.
Ощущение что глюк не с I2C связан.
Вопрос:
Если случайно записать в регистр (скажем по адресу 0x04H (день месяца) байт 0xFF), при чтении этого регистра будет читаться 0xFF до истечения суток по часам?