ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
199469 Топик полностью
Athlon64 (29.06.2010 09:37, просмотров: 131) ответил Athlon64 на Да, DS1340. После первого включения время 00:00:00, дата 01.01.00.
Оставлял часы тикать на ночь, читая с RTC 3 раза в секунду время-дату и передавая в ком-порт. На утро часы верно насчитали прошедшие 15 часов, дата осталась корректной. Т.е. с чтением проблем нет. Снял сегодня осциллограмму записи в RTC пачки 10 регистров начиная с адреса 0x08. Пробовал писать отдельные регистры и все 10 регистров пачкой. Посылка (на дату-время 10:58:36 29.06.30):
0x08(адрес) 0xA9 0x00 0x36 0x58 0x10 0x29 0x29 0x06 0x30 0x00
соответствует осциллограмме, единственное межбайтовых интервалов нет, всё засылается сплошняком. Читается мусор типа 00:14:10 45.00.00. Код начала записи: StateTWI = WriteData; // Будем писать в модуль EndDataOutTWI=11; DataOutTWI[0]=0x08; DataOutTWI[1]=0xa9; DataOutTWI[2]=0; DataOutTWI[3]=0x36; DataOutTWI[4]=0x58; DataOutTWI[5]=0x10; DataOutTWI[6]=0x29; DataOutTWI[7]=0x29; DataOutTWI[8]=0x06; DataOutTWI[9]=0x30; DataOutTWI[10]=0; PtrDataOutTWI=1; // Т.к. 0й байт уже передан, продолжаем с 1 AT91C_BASE_TWI->TWI_MMR = (CntAddrTWI >> 1) << 16; // Задаём адрес для записи в модуль AT91C_BASE_TWI->TWI_IADR = 0; // Начальный адрес регистра 0x08 AT91C_BASE_TWI->TWI_THR = DataOutTWI[0]; // Передаём на запись первый байт буфера AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START; // START AT91C_BASE_TWI->TWI_IER = AT91C_TWI_TXRDY | AT91C_TWI_NACK; // Ловить будем успешные отправки байт и неподтверждённые приёмником посылки Код в обработчике прерывания: unsigned int status = AT91C_BASE_TWI->TWI_SR; // Читаем статус TWI if (status & AT91C_TWI_TXRDY) // Прошлый байт был принят приёмником (получен ACK) { if (PtrDataOutTWI >= (EndDataOutTWI)) // Если последний байт { AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP; // STOP AT91C_BASE_TWI->TWI_IDR = 0xFFFFFF; // Выключаем все прерывания от TWI StateTWI=255; // Ставим признак свободного TWI } else AT91C_BASE_TWI->TWI_THR = DataOutTWI[PtrDataOutTWI++]; // Передаём очередной байт данных } if (status & AT91C_TWI_NACK) // Прошлый байт не был успешно принят приёмником (получен NACK) { LedErrorOn(); // Мигнём индикатором "Ошибка" AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP; // STOP AT91C_BASE_TWI->TWI_IDR = 0xFFFFFF; // Выключаем все прерывания от TWI StateTWI=255; // Ставим признак свободного TWI }
image