|
MEGA И SPI |
|
|
|
Sep 21 2006, 14:44
|

Гуру
     
Группа: Свой
Сообщений: 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). В даташитах довольно подробно расписанно
--------------------
|
|
|
|
|
Sep 21 2006, 16:18
|

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

|
Цитата(glebka @ Sep 21 2006, 19:52)  Всё прочитал, немного не понятно как MASTER MEGA будет принимать данные.Если можно поясните кодом. Это получется каждый раз для приёма надо переводить из мастера в slave? Переводить не нужно. Во время передачи данных SLAVE-устройствам MASTER принимает данные по линии MISO. Нужно только как-то развязывать выходы SLAVE-устройств, например мультиплексором, который также будет управляться сигналами SS.
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Sep 21 2006, 17:38
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 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: производится без предупреждения
|
|
|
|
|
Sep 22 2006, 06:50
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

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

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 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: производится без предупреждения
|
|
|
|
|
Sep 22 2006, 07:55
|
Частый гость
 
Группа: Свой
Сообщений: 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-дюемовых дискетах
|
|
|
|
|
Sep 22 2006, 07:59
|

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

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

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

|
Цитата(muravei @ Sep 22 2006, 11:41)  Так почему бы "отдыхающим " SLAVEам самим не перевести свой выход в 3 сост. -программно? По CS. Если устройство имеет этот самый CS, то ничего, конечно, не мешает (АЦП, ПЗУ и др. пассивные устройства). Если-же связывать между собой два или более МК, то программно перевести направление линии на ввод SLAVE просто не успеет. MASTER никого не ждёт: установил SS и вперёд. P.S. Да-а-а, мне стыдно  . Курить доки нужно чаще. Terminator прав, SS конечно-же будет CS-ом для SLAVE.
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Sep 22 2006, 08:29
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

|
На мастере для выбора нужного слейва придется использовать 2 порта и программно их переключать. Второй вариант использовать один порт и один внешний инвертор, думаю, что подойдет инвертор даже на транзисторе. Второй вариант хуже потому, что один слейв всегда будет выбран. Если второй вариант усложнить и еще при выборе слейва использовать сигнал «ss» с мастера то такой вариант будет более правильным, но повлечет за собой использования дополнительных элементов. Вывод если на мастере есть свободные порты используйте их, если нет то второй вариант.
--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
|
|
|
|
|
Sep 22 2006, 11:49
|
Группа: Участник
Сообщений: 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............вот так вот........
|
|
|
|
|
Sep 22 2006, 14:34
|

Гуру
     
Группа: Свой
Сообщений: 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
--------------------
|
|
|
|
|
Sep 22 2006, 16:44
|

Участник

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

|
посмотрите апноут avr335 - там хороший пример spi
Сообщение отредактировал Foris - Sep 22 2006, 16:46
--------------------
Радиодетали недорого Arduino модули сенсоры в Москве круглосуточно 24/7 самовывоз безплатно от любой станции метро, есть и платная доставка - www.mkPochtoi.ru
|
|
|
|
|
Sep 24 2006, 18:16
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Oct 2 2006, 15:18
|
Частый гость
 
Группа: Свой
Сообщений: 199
Регистрация: 22-06-05
Пользователь №: 6 217

|
Спасибо всем большое за консультацию,действительно ответ от ведомого приходит как написал prottoss. Собрал всё на "проволочках" основные моменты работают. Маленький шаг вперёд
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|