реклама на сайте
подробности

 
 
> Связь 2-х контроллеров по SPI, Помогите разобраться
hd44780
сообщение Dec 2 2011, 07:19
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Привет всем.

Вот решил связать 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?

Спасибо.

Сообщение отредактировал hd44780 - Dec 2 2011, 07:20


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexFTF
сообщение Dec 5 2011, 01:01
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 95
Регистрация: 11-11-10
Из: Новосибирск
Пользователь №: 60 808



Цитата(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....
В общем можно смело его использовать.

Сообщение отредактировал NSTU - Dec 5 2011, 01:10
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 09:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016