Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Связь 2-х контроллеров по SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
hd44780
Привет всем.

Вот решил связать 2 МК по SPI. USART, конечно, в разы удобнее и понятнее (ИМХО), но на ведущем МК он занят обменом с компом. А лепить туда монстра типа AtMega128 с 2-мя USART-ами ой как не хочется - перепаивать плату - бр-р biggrin.gif .

Теперь по делу.
Ведущий МК - ATMega16, ведомый пока AtTiny2313. Slave должен передать master-у где-то 5 байтов по команде с мастера.

1.
Почитал я тут AVR151 (SPI для 2-х и более МК с полноценным SPI интерфейсом, типа AtMega). Есть даже по-русски - http://www.microcontrollerov.net/microcont...-interfejsa-SPI
Вроде всё понятно, но не понял, где слейв читает принятые данные или посылает их. Такое ощущение, что он просто сравнивает то, что принял, с тем, что у него в памяти... Ну Бог с ним, в принципе понятно.
По ходу вопрос - если я хочу в слейве передать n байт, я должен положить в SPDR 1-й байт, потом в прерывании класть туда остальные по очереди? Я правильно понял?

2.
С ATTiny2313 другая песнь... Тут вообще ни хрена мне не понятно sad.gif ...
Нормального SPI у него нету, есть какой-то USI. Надыбал я описалово AVR319, почитал.
В ихнем примере spiX_put передаёт байт. А следующий пихать тоже в прерывании?

Режим опроса пока не интересует.

Кто-то делал обмен между Mega и этим USI? Оно нормально работает?
Или проще плюнуть на этот 2313 вместе с USI и поставить туда 8-ю мегу с нормальным SPI?

Спасибо.
pavel-pervomaysk
mega162 чем не устраивает ?
LexaK
Вот, может поможет. Как-то стала задача снять обмен по RS232 между хостом и устройством. Был сделан за пару часов из подручных материалов аппаратный сниффер. Под рукой оказалась: макетная плата с ATmega128 и отдельно ATTiny2313. На меге линии RX обоих UARTов были подключены к линиям RX-TX исследуемого интерфейса. Весь полученный трафик отправлялся на тини2313 через SPI. Тини2313 конвертировала SPI в RS232 для анализа на ЭВМ. О целесообразности и рациональности такого решения прошу не судить, ибо все было сделано для разовой работы. А для топикстартера там есть все, что нужно.
hd44780
Цитата(Павлик @ Dec 2 2011, 22:19) *
mega162 чем не устраивает ?


На место которого?
В качестве моего главного (Mega16) - нету АЦП.
Вместо 2313 - слишком мощный. Туды или 2313 или Mega8 - самое оно. Там нужен SPI, компаратор и один внешний INT для ещё одного (внешнего) компаратора.

Цитата(LexaK @ Dec 3 2011, 09:58) *
Вот, может поможет.


Спасибо. Изучаю rolleyes.gif
Вот ещё накопал - http://www.recursion.jp/avrcdc/cdc-spi.html
AlexFTF
Цитата(hd44780 @ Dec 2 2011, 14:19) *
1.
Почитал я тут AVR151 (SPI для 2-х и более МК с полноценным SPI интерфейсом, типа AtMega). Есть даже по-русски - http://www.microcontrollerov.net/microcont...-interfejsa-SPI
Вроде всё понятно, но не понял, где слейв читает принятые данные или посылает их. Такое ощущение, что он просто сравнивает то, что принял, с тем, что у него в памяти... Ну Бог с ним, в принципе понятно.
По ходу вопрос - если я хочу в слейве передать n байт, я должен положить в SPDR 1-й байт, потом в прерывании класть туда остальные по очереди? Я правильно понял?


Если просто, то SPI представляет собой не что иное как сдвиговый регистр (тот самый SPDR). В процессе обмена данные по SPI передаются всегда в обоих направлениях, как от MASTER к SLAVE так и наоборот (от MASTER к SLAVE по линии MOSI и от SLAVE к MASTER по линии MISO). Тактирование всегда осуществляет MASTER! Поэтому, отвечая на Ваш вопрос, если Вы хотите передать из SLAVE в MASTER 1 байт, то:

1. В регистр SPDR SLAVE-устройства надо загрузить передаваемый байт;
2. Аналогичную процедуру надо сделать для MASTER;
3. Произвести обмен данными.
4. По окончании обмена данными, в регистре SPDR MASTER-устройства будет байт данных переданный от SLAVE-устройства, а в регистре SPDR SLAVE-устройства будет байт данных от MASTER.

Для передачи n байт, выше описанную процедуру необходимо повторить n раз.

Что касается USI то он совместим с SPI. Вот что пишут в datasheet: The USI Three-wire mode is compliant to the Serial Peripheral Interface (SPI) mode 0 and 1....
В общем можно смело его использовать.
s_black
Описал как это сделать и выложил исходники.
hd44780
Спасибо, изучу. Я пока переехал на UART и делаю рабочий алгоритм, потом вернусь к SPI.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.