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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> MEGA И SPI
glebka
сообщение Sep 21 2006, 14:29
Сообщение #1


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

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



Надо к mege прикрутить через SPI два устройства.Причем одно будет только в slave,другое будет и принимать и посылать данные.Если кто делал подобное подскажите как лучше реализовать chip select, и процедуру передвчи и получения данных.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 21 2006, 14:44
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(glebka @ Sep 21 2006, 22:29) *
Надо к mege прикрутить через SPI два устройства.Причем одно будет только в slave,другое будет и принимать и посылать данные.
Если другое будет и посылать и принимать данные, а инициатором обмена будет МЕГА, то оно тоже имеет право быть Slave...

Цитата(glebka @ Sep 21 2006, 22:29) *
Если кто делал подобное подскажите как лучше реализовать chip select, и процедуру передвчи и получения данных.
Возможно, удобнее Chip Select для двух устройств реализовать с помощью двух свободных пинов на МЕГЕ, если она МАСТЕР и свободных пинов хватает. Если в качестве СЛЭЙВОВ используется тоже МЕГИ, можно в них задействовать пины SS (Slave Select). В даташитах довольно подробно расписанно


--------------------
Go to the top of the page
 
+Quote Post
glebka
сообщение Sep 21 2006, 15:52
Сообщение #3


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

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



Всё прочитал, немного не понятно как MASTER MEGA будет принимать данные.Если можно поясните кодом.
Это получется каждый раз для приёма надо переводить из мастера в slave?
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Sep 21 2006, 16:18
Сообщение #4


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(glebka @ Sep 21 2006, 19:52) *
Всё прочитал, немного не понятно как MASTER MEGA будет принимать данные.Если можно поясните кодом.
Это получется каждый раз для приёма надо переводить из мастера в slave?

Переводить не нужно. Во время передачи данных SLAVE-устройствам MASTER принимает данные по линии MISO. Нужно только как-то развязывать выходы SLAVE-устройств, например мультиплексором, который также будет управляться сигналами SS.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
glebka
сообщение Sep 21 2006, 17:02
Сообщение #5


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

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



Это понятно.Для этой цели собираюсь применить NC7SZ125M5.
Проблема немного в другом : отправить я смогу 16 бит, дергая cs когда надо, а как получить обратно 16 бит?
или читать два раза подряд SPDR?
Прошу прощение за непонимание.
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Sep 21 2006, 17:38
Сообщение #6


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(glebka @ Sep 21 2006, 21:02) *
Это понятно.Для этой цели собираюсь применить NC7SZ125M5.
Проблема немного в другом : отправить я смогу 16 бит, дергая cs когда надо, а как получить обратно 16 бит?
или читать два раза подряд SPDR?
Прошу прощение за непонимание.

Регистры SPDR MASTER и SPDR SLAVE образуют общий кольцевой регистр сдвига, поэтому если SLAVE ничего не записывал в свой SPDR, MASTERу вернётся предыдущий отправленный им байт.
Если ваш алгоритм SLAVE-устройства предусматривает какую-либо обработку принятых данных, то лучше, наверное, начать считывать данные MASTER-ом после отсылки данных SLAVE-у путём передачи каких-то дополнительных байтов/команд.
Я делаю это таким образом:
1. Отправляю команду/данные (несколько байтов) SLAVE-устройству.
2. Отправляю в цикле байт запроса 0xFD (можно любой другой), и читаю принятые от SLAVE данные.
Если ответный байт равен 0xFD, то SLAVE ещё не готов.
3. Как только SLAVE подготовил данные для ответа, он записывает в свой SPDR байт готовности к ответу 0x80 (можно и другой, не совпадающий с 0xFD) и по приёму следующего байта от мастера, подтаскивает в SPDR следующие байты ответных данных.
4. MASTER, продолжая посылать запросы, вычитывает нужное число байтов из SLAVE.

Может, написал сложно и запутанно, но этот способ оказался наиболее удобным и устойчивым.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
WHALE
сообщение Sep 21 2006, 20:17
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



А мультиплексор зачем?Если каждый из слэйвов управляется своим SS и MOSI и MISO порты настроены
как входы,то по моему можно и в лоб соединять,если эти пины больше никуда не задействованы.Или
я ошибаюсь?


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
muravei
сообщение Sep 22 2006, 06:48
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(WHALE @ Sep 22 2006, 00:17) *
как входы,то по моему можно и в лоб соединять,если эти пины больше никуда не задействованы.Или
я ошибаюсь?

Скорее всего ошибаетесь, не важно мастер-слейв , все равно один вывод будет входом, др. - выходом.
А неиспользуемые выходы, думаю, должны переводиться в 3 сост. каким- нить Чип Селект
Go to the top of the page
 
+Quote Post
Семён
сообщение Sep 22 2006, 06:50
Сообщение #9


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

Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922



Цитата(WHALE @ Sep 22 2006, 00:17) *
А мультиплексор зачем?Если каждый из слэйвов управляется своим SS и MOSI и MISO порты настроены
как входы,то по моему можно и в лоб соединять,если эти пины больше никуда не задействованы.Или
я ошибаюсь?

Мультиплексор думаю, что нужен или программный или аппаратный, потому что на мастере аппаратный выход «SS» продеться использовать всегда, а выбор конкретного устройства нужно делать отдельно.


--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Sep 22 2006, 06:51
Сообщение #10


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(WHALE @ Sep 22 2006, 00:17) *
А мультиплексор зачем?Если каждый из слэйвов управляется своим SS и MOSI и MISO порты настроены
как входы,то по моему можно и в лоб соединять,если эти пины больше никуда не задействованы.Или
я ошибаюсь?

MISO - Master In Slave Out, поэтому у всех SLAVE они всегда настроены на выход, пока разрешен SPI. Для того, чтобы они не устроили мордобой на линии и нужен мультиплексор. А сигнал SS - это не CS, выводы в третье состояние он не переводит.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
muravei
сообщение Sep 22 2006, 07:41
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(Nanobyte @ Sep 22 2006, 10:51) *
MISO - Master In Slave Out, поэтому у всех SLAVE они всегда настроены на выход, пока разрешен SPI. Для того, чтобы они не устроили мордобой на линии и нужен мультиплексор.

Так почему бы "отдыхающим " SLAVEам самим не перевести свой выход в 3 сост. -программно?
По CS.
Go to the top of the page
 
+Quote Post
Семён
сообщение Sep 22 2006, 07:55
Сообщение #12


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

Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922



Когда писал программу для Mege8 ,она была мастером, пока не сконфигурировал SS как выход передачи информации небыли не в AVR STUDIO не на железе. Одним этим сигналом выбрать два устройства невозможно, поэтому и потребуется дополнительный сигнал выбора слейва.
Цитата(muravei @ Sep 22 2006, 11:41) *
Цитата(Nanobyte @ Sep 22 2006, 10:51) *

MISO - Master In Slave Out, поэтому у всех SLAVE они всегда настроены на выход, пока разрешен SPI. Для того, чтобы они не устроили мордобой на линии и нужен мультиплексор.

Так почему бы "отдыхающим " SLAVEам самим не перевести свой выход в 3 сост. -программно?
По CS.

ИМХО: отдыхающими слейвы быть не могут, потому, как не знают когда мастер им что-то захочет передать.


--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
Go to the top of the page
 
+Quote Post
Terminator
сообщение Sep 22 2006, 07:59
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 209
Регистрация: 7-12-04
Из: Томск
Пользователь №: 1 382



Цитата(Nanobyte @ Sep 22 2006, 13:51) *
...
MISO - Master In Slave Out, поэтому у всех SLAVE они всегда настроены на выход, пока разрешен SPI. Для того, чтобы они не устроили мордобой на линии и нужен мультиплексор. А сигнал SS - это не CS, выводы в третье состояние он не переводит.

SS на slave как раз выполняет функцию CS и может переводить ноги в третье состояние.
Читайте доки.
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Sep 22 2006, 08:01
Сообщение #14


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



Цитата(muravei @ Sep 22 2006, 11:41) *
Так почему бы "отдыхающим " SLAVEам самим не перевести свой выход в 3 сост. -программно?
По CS.

Если устройство имеет этот самый CS, то ничего, конечно, не мешает (АЦП, ПЗУ и др. пассивные устройства). Если-же связывать между собой два или более МК, то программно перевести направление линии на ввод SLAVE просто не успеет. MASTER никого не ждёт: установил SS и вперёд.

P.S. Да-а-а, мне стыдно blush.gif . Курить доки нужно чаще. Terminator прав, SS конечно-же будет CS-ом для SLAVE.


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
Семён
сообщение Sep 22 2006, 08:29
Сообщение #15


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

Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922



На мастере для выбора нужного слейва придется использовать 2 порта и программно их переключать. Второй вариант использовать один порт и один внешний инвертор, думаю, что подойдет инвертор даже на транзисторе. Второй вариант хуже потому, что один слейв всегда будет выбран. Если второй вариант усложнить и еще при выборе слейва использовать сигнал «ss» с мастера то такой вариант будет более правильным, но повлечет за собой использования дополнительных элементов. Вывод если на мастере есть свободные порты используйте их, если нет то второй вариант.


--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
Go to the top of the page
 
+Quote Post
muravei
сообщение Sep 22 2006, 11:42
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Цитата(Семён @ Sep 22 2006, 11:55) *
ИМХО: отдыхающими слейвы быть не могут, потому, как не знают когда мастер им что-то захочет передать.

Цитата(Семён @ Sep 22 2006, 11:55) *
Одним этим сигналом выбрать два устройства невозможно, поэтому и потребуется дополнительный сигнал выбора слейва.

Вот этот сигнал и разбудит отдыхающий слейв.
И потом, а если слейвов 4 или 8?
Go to the top of the page
 
+Quote Post
Shum1
сообщение Sep 22 2006, 11:49
Сообщение #17





Группа: Участник
Сообщений: 13
Регистрация: 9-06-06
Пользователь №: 17 933



Из достаточно большого опыта создания контроллеров на мегах с периферией на SPI могу сказать, что все устройства (АЦП; ЦАП; контроллеры CAN, UART; коммутаторы.....), управляемые по SPI имеют CS. Поэтому, если мастер один и не меняется, оптимальным является, по моему, выделить две ноги проца под чипселекты и всё........ РАЗВЯЗЫВАТЬ выходы слэйвов друг от друга ТОЧНО не надо.......... В промышленных устройствах полезно сам проц развязать гальванически от периферии, но это уже немного из другой оперы...........
По поводу приёма-передачи......... вы в теле программы пИшете (после того естественно, как SPI уже настроен и требуемое устройство выбрано через его CS) SPDR=0x12; //например..... после этого, если SPI разрешён, ваш проц(мастер) выставляет синхронизацию на ноге SCK и через ногу MOSI передаёт байт 0х12........если в этот момент устройстве передаёт в проц инфу, то она тоже будет в регистре SPDR........после окончания посылки байта вылазит прерывание SPI и в нём строкой char a=SPDR; можно считать то, что прислал вам SLAVE............вот так вот........
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 22 2006, 12:14
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Вот простой пример : МЕГА16 - МАСТЕР, Две МЕГА8 и ЕЕ 25256 - СЛЭЙВы. Линии выборки PD0 - PD2. По моему просто и наглядно
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Go to the top of the page
 
+Quote Post
glebka
сообщение Sep 22 2006, 14:12
Сообщение #19


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

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



Соединяю megu и max6957.
Получается: высталяю CS ,отправляю 16 бит( два раза по 8), убираю CS, читаю SPDR, это ответ от SLAVE? 8 бит.
Ход мысли правильный?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Sep 22 2006, 14:34
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(glebka @ Sep 22 2006, 22:12) *
Соединяю megu и max6957.
Получается: высталяю CS ,отправляю 16 бит( два раза по 8), убираю CS, читаю SPDR, это ответ от SLAVE? 8 бит.
Ход мысли правильный?
Не совсем так, хотя я не знаю, что за зверь max6957. Многие АЦП с SPI интерфейсом работают примерно так:

1.выставили CS

2.посылаем байт-принимаем байт (старший байт результата)

3.посылаем байт-принимаем байт (младший байт результата)

2.снимаем CS


--------------------
Go to the top of the page
 
+Quote Post
Foris
сообщение Sep 22 2006, 16:44
Сообщение #21


Участник
*

Группа: Свой
Сообщений: 66
Регистрация: 21-09-06
Из: Москва
Пользователь №: 20 566



посмотрите апноут avr335 - там хороший пример spi

Сообщение отредактировал Foris - Sep 22 2006, 16:46


--------------------
Радиодетали недорого Arduino модули сенсоры в Москве круглосуточно 24/7 самовывоз безплатно от любой станции метро, есть и платная доставка - www.mkPochtoi.ru
Go to the top of the page
 
+Quote Post
stellar
сообщение Sep 24 2006, 18:16
Сообщение #22


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 27-05-06
Пользователь №: 17 498



Товарищи, помогите, не работает spi slave, что может быть не так?
пытаюсь в протеусе соединить 2 atmega8, ведущий работает нормально, с модулем проверки spi обменивается, а ведомый с ним не общается (((

void SPI_Recieve()
{ c = SPDR;
putchar(ch)
while (!(SPSR & temp));
k = 0; }

#include <stdio.h>

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ TCNT0=0xB7;
if( k == 1)
SPI_Recieve(); }

#include <spi.h>

void main(void)
{
PORTB=0x00;
DDRB=0x10;

PORTC=0x02;
DDRC=0x02;

PORTD=0x00;
DDRD=0x00;

TCCR0=0x05;
TCNT0=0xB7;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;

TIMSK=0x01;

UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x07;

ACSR=0x80;
SFIOR=0x00;

SPCR=0x43;
SPSR=0x00;

#asm("sei")

while (1)
{ while( !(SPSR & temp) )
k = 1; };
}

На ведушем на время посылки дёргаю ногой, которая на ведомом к /ss подключена
Подскажите в чём моё незнание?

Сообщение отредактировал stellar - Sep 24 2006, 18:19
Go to the top of the page
 
+Quote Post
glebka
сообщение Oct 2 2006, 15:18
Сообщение #23


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

Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217



Спасибо всем большое за консультацию,действительно ответ от ведомого приходит как написал prottoss.
Собрал всё на "проволочках" основные моменты работают.
Маленький шаг вперёд smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 11:46
Рейтинг@Mail.ru


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