Оставлял часы тикать на ночь, читая с RTC 3 раза в секунду время-дату и передавая в ком-порт. На утро часы верно насчитали прошедшие 15 часов, дата осталась корректной. Т.е. с чтением проблем нет. Снял сегодня осциллограмму записи в RTC пачки 10 регистров начиная с адреса 0x08.
Пробовал писать отдельные регистры и все 10 регистров пачкой.
Посылка (на дату-время 10:58:36 29.06.30):
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
}
0x08(адрес) 0xA9 0x00 0x36 0x58 0x10 0x29 0x29 0x06 0x30 0x00соответствует осциллограмме, единственное межбайтовых интервалов нет, всё засылается сплошняком. Читается мусор типа 00:14:10 45.00.00. Код начала записи: