Связать Меги по SPI?

Jan 28, 2005 6 Replies

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



Hello, Peter!

MP> Есть необходимость связать две Меги по SPI MP> SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)| (1<<SPR0); MP> SPSR |= (1<<SPI2X);

SPCR у слейва инициализирован ? Должен быть тем же кодом, что и у мастера, кроме |(1<<MSTR) .

WBR G.G.

Hello, Gena! You wrote to Mikheychik Peter on Fri, 28 Jan 2005 13:03:43 +0000 (UTC):

MP>> Есть необходимость связать две Меги по SPI MP>> SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)| GG> (1<<SPR0); MP>> SPSR |= (1<<SPI2X);

GG> SPCR у слейва инициализирован ? Должен быть тем же GG> кодом, GG> что и у мастера, кроме |(1<<MSTR) . Инициализирую слейв так, чтобы частота его SPI совпадала с частотой SPI мастера. Соотв если тактовая мастера в 2-а раза быстрее чем слейва, то и к-т деления у слейва в 2-а раза меньше - соотв мастер - 1/128, слейв - 1/64. Или делать им к-т деления одинаковым?

With best regards, Mikheychik Peter. E-mail: snipped-for-privacy@vniro.ru

Greetings, Mikheychik!

Посмотрел я мессагу, посланную Mikheychik Peter к All, и решил ответить:

[skip]

MP> для считывания результата обмена используется оператор вида: MP> while(!(SPSR & (1<<SPIF)));

Если увеpен, что понял все написанное в даташите пpавильно, а все pавно не pаботает - посмотpи сгенеpенный компилятоpом код.

C наилучшими пожеланиями Ilja aka ИЛ-2 (ilja_vlaskin$mail.ru)

... Hо нету слоненка в лесу у меня, слоненка веселого нет...

Доброго здоровья, Mikheychik!

28 Jan 05 13:26, Mikheychik Peter написал для All:

MP> для считывания результата обмена используется оператор вида: MP> while(!(SPSR & (1<<SPIF)));

а прерывания не разрешены, случаем?

WBR, Сергей. ICQ: 101347299

Доброго здоровья, Mikheychik!

28 Jan 05 18:05, Mikheychik Peter написал для Gena Gutnicky:

MP>>> Есть необходимость связать две Меги по SPI MP>>> SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)| GG>> (1<<SPR0); MP>>> SPSR |= (1<<SPI2X);

GG>> SPCR у слейва инициализирован ? Должен быть тем же GG>> кодом, GG>> что и у мастера, кроме |(1<<MSTR) . MP> Инициализирую слейв так, чтобы частота его SPI совпадала с частотой SPI MP> мастера. Соотв если тактовая мастера в 2-а раза быстрее чем слейва, то и MP> к-т MP> деления у слейва в 2-а раза меньше - соотв мастер - 1/128, слейв - 1/64. MP> Или MP> делать им к-т деления одинаковым?

коэффициенты для слейва не имеют никакого смысла, т.к. он тактуется от мастера. а вот режим работы (фронты и полярность) надо устанавливать правильно. а также следить за тем, чтобы не превысить максимальную допустимую скорость приема у слейва, а также установить в правильное положение ногу выбора слейва (/SS, емнип)

WBR, Сергей. ICQ: 101347299

... Первую половину жизни нам отравляют родители, вторую- дети!

Hello Mikheychik.

28 Jan 05 18:05, you wrote to Gena Gutnicky:

GG>> SPCR у слейва инициализирован ? Должен быть тем же GG>> кодом, GG>> что и у мастера, кроме |(1<<MSTR) . MP> Инициализирую слейв так, чтобы частота его SPI совпадала с частотой MP> SPI мастера. Соотв если тактовая мастера в 2-а раза быстрее чем MP> слейва, то и к-т деления у слейва в 2-а раза меньше - соотв мастер - MP> 1/128, слейв - 1/64. Или делать им к-т деления одинаковым?

Коефициент деления у слейва не имеет значения. Hикакого.

Ты правильно соединил? miso <-> miso, mosi <-> mosi, sck <-> sck? Сигнал доходит?

Еще можно SS у слейва подергать.

Alexey

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required