Реализую чтение и запись даты и времени, на 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; // Ставим флаг - Есть пакет на обработку
}
Сообщение отредактировал athlon64 - Jun 28 2010, 06:48
Эскизы прикрепленных изображений