Hello, All! Есть необходимость связать две Меги по SPI интерфейсу. Одна Мега128 - мастер работает на 16Мгц. Код для ее инициализации выглядит примерно так: volatile char IOReg; // set PB0(/SS), PB2(MOSI), PB1(SCK) as output для ATMega128 DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2); // enable SPI in Master Mode with SCK = CK/32 SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0); SPSR |= (1<<SPI2X);
IOReg = SPSR; // clear SPIF bit in SPSR IOReg = SPDR;
Другая Мега8 работает слейвом на внутренней частоте 8 МГц. и инициализируется следующим кодом: DDRB |= (1<<DD_MISO);
для считывания результата обмена используется оператор вида: while(!(SPSR & (1<<SPIF)));
Но увы, слейв не работает - не хочет выставлять флаг SPIF. Потому что после этого оператора я для проверки зажигаю индикацию, а она никогда не зажигается ;-). Сказать что слейв неработает совсем тоже нельзя, т.к. когда он не подсоединен всегда мастер принимает FF. А если подключен, то возвращает то что послал, хотя слейв должен с принятым байтом в моей проге что-то сделать. Такое впечатление что регистры закольцованы, но слейв совершенно не чувствует того что принял байт! В чем может быть причина такого поведения?
With best regards, Mikheychik Peter. E-mail: snipped-for-privacy@vniro.ru