Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MEGA И SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
glebka
Надо к mege прикрутить через SPI два устройства.Причем одно будет только в slave,другое будет и принимать и посылать данные.Если кто делал подобное подскажите как лучше реализовать chip select, и процедуру передвчи и получения данных.
prottoss
Цитата(glebka @ Sep 21 2006, 22:29) *
Надо к mege прикрутить через SPI два устройства.Причем одно будет только в slave,другое будет и принимать и посылать данные.
Если другое будет и посылать и принимать данные, а инициатором обмена будет МЕГА, то оно тоже имеет право быть Slave...

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

Переводить не нужно. Во время передачи данных SLAVE-устройствам MASTER принимает данные по линии MISO. Нужно только как-то развязывать выходы SLAVE-устройств, например мультиплексором, который также будет управляться сигналами SS.
glebka
Это понятно.Для этой цели собираюсь применить NC7SZ125M5.
Проблема немного в другом : отправить я смогу 16 бит, дергая cs когда надо, а как получить обратно 16 бит?
или читать два раза подряд SPDR?
Прошу прощение за непонимание.
Nanobyte
Цитата(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.

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

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

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

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

Так почему бы "отдыхающим " SLAVEам самим не перевести свой выход в 3 сост. -программно?
По CS.
Семён
Когда писал программу для 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.

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

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

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

P.S. Да-а-а, мне стыдно blush.gif . Курить доки нужно чаще. Terminator прав, SS конечно-же будет CS-ом для SLAVE.
Семён
На мастере для выбора нужного слейва придется использовать 2 порта и программно их переключать. Второй вариант использовать один порт и один внешний инвертор, думаю, что подойдет инвертор даже на транзисторе. Второй вариант хуже потому, что один слейв всегда будет выбран. Если второй вариант усложнить и еще при выборе слейва использовать сигнал «ss» с мастера то такой вариант будет более правильным, но повлечет за собой использования дополнительных элементов. Вывод если на мастере есть свободные порты используйте их, если нет то второй вариант.
muravei
Цитата(Семён @ Sep 22 2006, 11:55) *
ИМХО: отдыхающими слейвы быть не могут, потому, как не знают когда мастер им что-то захочет передать.

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

Вот этот сигнал и разбудит отдыхающий слейв.
И потом, а если слейвов 4 или 8?
Shum1
Из достаточно большого опыта создания контроллеров на мегах с периферией на SPI могу сказать, что все устройства (АЦП; ЦАП; контроллеры CAN, UART; коммутаторы.....), управляемые по SPI имеют CS. Поэтому, если мастер один и не меняется, оптимальным является, по моему, выделить две ноги проца под чипселекты и всё........ РАЗВЯЗЫВАТЬ выходы слэйвов друг от друга ТОЧНО не надо.......... В промышленных устройствах полезно сам проц развязать гальванически от периферии, но это уже немного из другой оперы...........
По поводу приёма-передачи......... вы в теле программы пИшете (после того естественно, как SPI уже настроен и требуемое устройство выбрано через его CS) SPDR=0x12; //например..... после этого, если SPI разрешён, ваш проц(мастер) выставляет синхронизацию на ноге SCK и через ногу MOSI передаёт байт 0х12........если в этот момент устройстве передаёт в проц инфу, то она тоже будет в регистре SPDR........после окончания посылки байта вылазит прерывание SPI и в нём строкой char a=SPDR; можно считать то, что прислал вам SLAVE............вот так вот........
prottoss
Вот простой пример : МЕГА16 - МАСТЕР, Две МЕГА8 и ЕЕ 25256 - СЛЭЙВы. Линии выборки PD0 - PD2. По моему просто и наглядно
glebka
Соединяю megu и max6957.
Получается: высталяю CS ,отправляю 16 бит( два раза по 8), убираю CS, читаю SPDR, это ответ от SLAVE? 8 бит.
Ход мысли правильный?
prottoss
Цитата(glebka @ Sep 22 2006, 22:12) *
Соединяю megu и max6957.
Получается: высталяю CS ,отправляю 16 бит( два раза по 8), убираю CS, читаю SPDR, это ответ от SLAVE? 8 бит.
Ход мысли правильный?
Не совсем так, хотя я не знаю, что за зверь max6957. Многие АЦП с SPI интерфейсом работают примерно так:

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

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

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

2.снимаем CS
Foris
посмотрите апноут avr335 - там хороший пример spi
stellar
Товарищи, помогите, не работает 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 подключена
Подскажите в чём моё незнание?
glebka
Спасибо всем большое за консультацию,действительно ответ от ведомого приходит как написал prottoss.
Собрал всё на "проволочках" основные моменты работают.
Маленький шаг вперёд smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.