реклама на сайте
подробности

 
 
> SAM7X + DS1340
athlon64
сообщение Jun 28 2010, 06:37
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Реализую чтение и запись даты и времени, на 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
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Руслан
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01366 секунд с 7
ELECTRONIX ©2004-2016