ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
1 июля
199359
Athlon64 (28.06.2010 15:16, просмотров: 2401) MBedder
Реализую чтение и запись даты и времени, на 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 до истечения суток по часам?
image