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

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

Reply to
Mikheychik Peter
Loading thread data ...

Hello, Peter!

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

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

WBR G.G.

Reply to
Gena Gutnicky

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

Reply to
Mikheychik Peter

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о нету слоненка в лесу у меня, слоненка веселого нет...

Reply to
Ilja Vlaskin

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

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

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

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

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

Reply to
Sergei Tuchinski

Доброго здоровья, 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

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

Reply to
Sergei Tuchinski

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

Reply to
Alexey Boyko

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.