Цитата(Палыч @ Feb 6 2012, 15:52)

Уж не знаю: как у Вас получается принимать правильно при другом уровне оптимизации...
Насколько я понял: у Вас CPOL=0. При этом DS1305 выставит очередной бит для считывания его МК при установки высокого уровня на CLK. Вы же его считываете при низком уровне на CLK, т.е. "забегаете вперед" на один бит. Вот результат и получается сдвинутым...
У меня 3-Wire подключение.
Цитата
PORTD=PORTD | (1<<CS); // выбор периферийного устройства
for(i=0; i<8; ++i)
{
buffer=address; // копирование данных
buffer=buffer & 0x1; // выделение младшего бита
if (buffer==0x1)
{
PORTD=PORTD | (1<<DATA); // установка DATA
}
else
{
PORTD=PORTD & (~(1<<DATA)); // сброс DATA
}
PORTD=PORTD | (1<<CLK); // установка CLK
if (i<7)
{
PORTD=PORTD & (~(1<<CLK)); // сброс CLK
}
address=address>>1; // сдвиг вправо
}
Вот это выполняется правильно, адрес записывается.
Строки PORTD=PORTD | (1<<CLK); // установка CLK
if (i<7)
{
PORTD=PORTD & (~(1<<CLK)); // сброс CLK
}
указывают, что как только мы передали 8-й бит слова адреса, мы линию CLK не сбрасываем в 0, а сбрасываем ее тут:
Цитата
for(i=0; i<8; ++i)
{
PORTD=PORTD & (~(1<<CLK)); // сброс CLK
buffer=PIND & (1<<DATA); // чтение данных
if (buffer!=0)
{
rtc_data=rtc_data | (1<<i); // установка бита
}
PORTD=PORTD | (1<<CLK); // установка CLK
}
, поскольку при заднем фронте CLK произойдет вывод данных из RTC. Если бы мы это сделали раньше, чем написали бы строки
Цитата
PORTD=PORTD & (~(1<<DATA)); // настройка подтягивающего резистора линии DATA порта D
DDRD=DDRD & (~(1<<DATA)); // настройка линии DATA порта D
RTC выставил бы данные, и МК не переопределя линию на вход, спалил бы и себе линию, и возможно RTC.
Насчет таймингов. У меня частота микроконтроллера остается стандартной и поэтому время выполнения даже самой короткой операции не превышает 1мкс.