Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2008, 14:20   #1
Sannara
 
Регистрация: 08.09.2008
Сообщений: 9
По умолчанию Просьба к тем, кто работал с SPI для Atmel

Проблема вот в чем. Не получается организовать SPI-обмен между ATmega8535 (Master) и ATtiny2313 (Slave). В ДШ есть описание работы SPI, и там все понятно. Не понятно, как именно определяется адрес Slave, как Slave "прерывается" - по ~SS от Master? В общем, требуется передавать информацию Master -> Slave. Если кто-то знает, КАК, подскажите, пожалуйста. Про сдвиговые регистры не рассказывайте, у меня проблема в инициализации обмена в первую очередь.
Спасибо.
))
Sannara вне форума Ответить с цитированием
Старый 09.09.2008, 03:14   #2
Sharaevsky_Vitaly
Пользователь
 
Регистрация: 23.05.2008
Сообщений: 26
По умолчанию

Какой адрес?...Это ведь не TWI (I2C)...В шине SPI ведомое устройство определяется по уровню на входе ~SS (или Chip Enable)...Для решения твоей проблемы лучше ознакомся с инициализацией приемо/передатчика микроконтроллера...Если на то уж пошло, что тебе надо передавать информацию только в одну сторону Master -> Slave, то зачем терять четыре пина контроллера на шину SPI, когда можно обойтись максимум двумя (а при очень сильной нужде и одним)...Да и при четкой синхронизации по частоте можно тот же SPI или любой другой протокол передачи между контроллерами реализовать очень просто только используя программные средства (не вникая в аппратные)...так что поподробней излагай задачу, прилагай схему, говори какой язык программирования использовал и с удовольствием по мере возможностей помогу
Sharaevsky_Vitaly вне форума Ответить с цитированием
Старый 09.09.2008, 15:00   #3
Sannara
 
Регистрация: 08.09.2008
Сообщений: 9
По умолчанию

Спасибо, что откликнулись ))
Значит, так. У меня есть свободные пины (portB4-7) в передающем контроллере ATmega8535, и есть достаточно свободных ног в принимающем ATtiny2313, поэтому и возникла идея использовать SPI. Наверное, можно проще сделать, но я пока не знаю, как. Пишу на ассемблере, и идея программной реализации обмена мне нравится больше.
Подробности задачи:
Передача только Master -> Slave
Передаются однобайтные команды.
Одна из команд - принять два байта информации
Собственно, это все, что касается обмена. Наверное, Master должен быть как-то оповещен, что Slave его понял, и команды выполнил.
Спасибо за готовность помочь )
Sannara вне форума Ответить с цитированием
Старый 09.09.2008, 15:00   #4
Sannara
 
Регистрация: 08.09.2008
Сообщений: 9
По умолчанию

Спасибо, что откликнулись ))
Значит, так. У меня есть свободные пины (portB4-7) в передающем контроллере ATmega8535, и есть достаточно свободных ног в принимающем ATtiny2313, поэтому и возникла идея использовать SPI. Наверное, можно проще сделать, но я пока не знаю, как. Пишу на ассемблере, и идея программной реализации обмена мне нравится больше.
Подробности задачи:
Передача только Master -> Slave
Передаются однобайтные команды.
Одна из команд - принять два байта информации
Собственно, это все, что касается обмена. Наверное, Master должен быть как-то оповещен, что Slave его понял, и команды выполнил.
Спасибо за готовность помочь )
Sannara вне форума Ответить с цитированием
Старый 09.09.2008, 19:49   #5
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

А чего так сильно программно хочется?
На Mege8535 есть аппаратный SPI (как раз portB4-7), на Tiny2313 есть какое-то подобие последовательного интерфейса USI (portB5-7), на нем вроде можно слепить SPI.
Может быть всё-таки правильнее будет железяку использовать по полной ?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 09.09.2008, 21:39   #6
Sharaevsky_Vitaly
Пользователь
 
Регистрация: 23.05.2008
Сообщений: 26
По умолчанию

В случае с master (ATmega8535) конечно логичнее использовать встроенный приемо-передатчик SPI, так как именно его ноги свободны...Супер в данном случае было бы использать UART, но...Обмен, по-моему, можно реализовать по следующему принципу : определить стандартный размер команды, например, два байта (так как тебе максимум два байта информации принять надо)...Проверять, понял и выполнил ли slave команду master'a можно посылая через некоторое время после посылки основной комманды специально введенную команду опроса (например 0x00, 0xXX)...Главное, чтобы при этом, чтобы ни одна команда, кроме этой не начиналась с 0х00...Естевственно, зарание необходимо определить варианты ответа slave'a в разных ситуациях...Проще всего, по-моему, формат ответа будет реализовываться в формате (0х00, 0хОТВЕТ), так как только после приема первого байта команды slave поймет, что от него ждут...Ответ slave'a на обычные команды - 0х00...А по ответу slave'a уже смотреть как он понял и выполнил команду master'a...В случае ATtiny можно, конечно поиграться с USI, но я сделал бы так - в рабочем цикле (в месте с остальными операциями) постоянно опрашывал бы линию ~SS...не самый лучший вариант, если в рабочем цикле довольно много других команд - можно пропустить начало транзакции...в таком случае можно линию ~SS подать на вход внешнего прерывания(если есть возможность)...после начала транзакции (~SS == 0) принимать байт, опрашивая линию CLK (чтобы произвести выборку в нужный момент времени)...сдвиговый регистр в данном случае программно тоже не сложно реализовать с помощью команд логического сдвига...в ближайшие сутки постараюсь написать какой-нить шаблон для реализации вышесказанного...Как-то так ... Это конечно не идеал, но один из способов...Будут вопросы - с радостью помогу чем могу
Sharaevsky_Vitaly вне форума Ответить с цитированием
Старый 10.09.2008, 03:26   #7
Sannara
 
Регистрация: 08.09.2008
Сообщений: 9
По умолчанию

Да, я, собственно, примерно так и пыталась сделать, но, видимо, что-то неверно настроила. В slave у меня нет ничего особенного, просто счет времени, обрабатываю прерывания timer0, так что в main-цикле могу опрашивать ноги, сколько угодно. ~SS заводила на прерывание по INT1, но либо настроила что-то не так, либо оно не хочет работать. То есть, я пробовала разные варианты и пришла к выводу, что чего-то не понимаю в принципе. Сдвиги я, естественно, сделала, там все просто. Кстати, я не упираюсь в SPI, можно и UART, но там опять же с настройками неясно.
Честно говоря, я подозреваю, что и в схеме не все правильно.
Надо подтягивать ноги к +5? То есть, программно я это сделала, а схемно надо? Или наоборот - в схеме сделать, а в программе нет? Кажется, это называется Z-состояние. Правда, в ДШ на ATtiny2313 об этом ни слова нет. То есть, собственно передачу я написала, мне надо как-то ее инициировать, именно это не получается.
Да, кстати, команды мне надо делать трехбайные, потому что требуется передавать два байта информации. Но с этим я управлюсь, главное заставить их понимать друг друга.
Еще раз спасибо, что уделяете мне столько времени )
Sannara вне форума Ответить с цитированием
Старый 10.09.2008, 03:31   #8
Sannara
 
Регистрация: 08.09.2008
Сообщений: 9
По умолчанию

Может быть, так было бы лучше, только я просто не знаю - КАК это сделать (((
Мне не удается слепить, потому и спрашиваю.
Спасибо ))
Sannara вне форума Ответить с цитированием
Старый 10.09.2008, 20:28   #9
Sharaevsky_Vitaly
Пользователь
 
Регистрация: 23.05.2008
Сообщений: 26
По умолчанию

Не стоит благодарности...Внизу прикреплен асм-файл для ATmega8535...там я примерно написал действие передатчика и способ инициации начала обмена...сразу замечание - там есть зарезервированные только для этого фрагмента регистры (R20, R21)...То есть необходимо внимательно следить за тем, чтоб не перезаписать их в процессе работы...Если такое реализовать Вам не удастся, пишите, и я покажу как это реализовать с помощью SRAM...проверял с помощью отладчика AVRstudio - вроде работает (Вы кстати его не используете?? - избавляет от многих проблем)...если что не понятно по алгоритму - спрашивайте...пример приемника напишу немного попозже...Теперь насчет схемы и подтяжек...Выложите, пожалуйста, свою схему...Ноги (как правило) лучше всего подтягивать в состояние, в котором они ничего не могут налажать, внешними и внутренними методами...Например, та же линия ~SS когда нету передачи (а это большая часть времени) должна постоянно находиться в "1"...Соответственно Вы подтягиваете ее внутренне (установкой разряда в регистре PORT) и внешне к +5В через резистор 22..50кОм...это защитит Вашу схему от всяких внештатных ситуаций...Состояние Z - это состояние когда вывод фактически отключен от провода, то есть никаким образом не может повлиять на состояние этого провода...приближенно можно считать, что для AVR это вход внутренне не подтянутый в "1"...а вообще-то Вы бы выложили схему ...так проще будет...Кстати, может удастся как-то освободить ноги ATmega 8535, чтоб появилась возможность использовать UART...и еще - если знаете С/С++, то намного удобнее писать на нем
Вложения
Тип файла: txt Transmit.txt (4.4 Кб, 178 просмотров)

Последний раз редактировалось Sharaevsky_Vitaly; 10.09.2008 в 21:26.
Sharaevsky_Vitaly вне форума Ответить с цитированием
Старый 11.09.2008, 00:04   #10
Sannara
 
Регистрация: 08.09.2008
Сообщений: 9
По умолчанию

Спасибо, я поняла, где у меня ошибка была ). С регистрами разберусь.
Для UART нужно 3 ноги или сколько? Нельзя использовать 4-7 порта B? Для меня нет принципиальной разницы, каким способом я передам информацию, главное, чтобы она передалась правильно. И к скорости передачи нет жестких требований. Кстати, приемник на время передачи вообще больше ничего не делает, его единственная задача - принять информацию (время) и отсчитывать его (это контрольник для главного процессора), поэтому разрешение прерываний timer0 осуществляется по отдельной специальной команде от передатчика, а запрещение - либо в момент начала очередной передачи, либо по окончании собственного счета, так что тут никто никому и ничему помешать не может. Схему я выложу (только ее разрабатывала не я, так что, возможно, будут сложности с объяснениями, что к чему). Завтра на работе зайду сюда.
Отладчиком я пользуюсь - для ATmega, а ATtiny2313 мой не поддерживает, а другого я не нашла.
Sannara вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
срочно! кто работал с f1book linarka Общие вопросы Delphi 1 11.06.2011 15:31
кто работал на UMI.CMS pro dimaxz WordPress и другие CMS 0 01.09.2008 11:16
Кто нибудь работал с Astron SiteManager? Начинающая Софт 2 15.07.2008 17:11
Кто работал с DelphiX? selenux Общие вопросы Delphi 0 16.11.2006 15:57