|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
08.09.2008, 14:20 | #1 |
Регистрация: 08.09.2008
Сообщений: 9
|
Просьба к тем, кто работал с SPI для Atmel
Проблема вот в чем. Не получается организовать SPI-обмен между ATmega8535 (Master) и ATtiny2313 (Slave). В ДШ есть описание работы SPI, и там все понятно. Не понятно, как именно определяется адрес Slave, как Slave "прерывается" - по ~SS от Master? В общем, требуется передавать информацию Master -> Slave. Если кто-то знает, КАК, подскажите, пожалуйста. Про сдвиговые регистры не рассказывайте, у меня проблема в инициализации обмена в первую очередь.
Спасибо. )) |
09.09.2008, 03:14 | #2 |
Пользователь
Регистрация: 23.05.2008
Сообщений: 26
|
Какой адрес?...Это ведь не TWI (I2C)...В шине SPI ведомое устройство определяется по уровню на входе ~SS (или Chip Enable)...Для решения твоей проблемы лучше ознакомся с инициализацией приемо/передатчика микроконтроллера...Если на то уж пошло, что тебе надо передавать информацию только в одну сторону Master -> Slave, то зачем терять четыре пина контроллера на шину SPI, когда можно обойтись максимум двумя (а при очень сильной нужде и одним)...Да и при четкой синхронизации по частоте можно тот же SPI или любой другой протокол передачи между контроллерами реализовать очень просто только используя программные средства (не вникая в аппратные)...так что поподробней излагай задачу, прилагай схему, говори какой язык программирования использовал и с удовольствием по мере возможностей помогу
|
09.09.2008, 15:00 | #3 |
Регистрация: 08.09.2008
Сообщений: 9
|
Спасибо, что откликнулись ))
Значит, так. У меня есть свободные пины (portB4-7) в передающем контроллере ATmega8535, и есть достаточно свободных ног в принимающем ATtiny2313, поэтому и возникла идея использовать SPI. Наверное, можно проще сделать, но я пока не знаю, как. Пишу на ассемблере, и идея программной реализации обмена мне нравится больше. Подробности задачи: Передача только Master -> Slave Передаются однобайтные команды. Одна из команд - принять два байта информации Собственно, это все, что касается обмена. Наверное, Master должен быть как-то оповещен, что Slave его понял, и команды выполнил. Спасибо за готовность помочь ) |
09.09.2008, 15:00 | #4 |
Регистрация: 08.09.2008
Сообщений: 9
|
Спасибо, что откликнулись ))
Значит, так. У меня есть свободные пины (portB4-7) в передающем контроллере ATmega8535, и есть достаточно свободных ног в принимающем ATtiny2313, поэтому и возникла идея использовать SPI. Наверное, можно проще сделать, но я пока не знаю, как. Пишу на ассемблере, и идея программной реализации обмена мне нравится больше. Подробности задачи: Передача только Master -> Slave Передаются однобайтные команды. Одна из команд - принять два байта информации Собственно, это все, что касается обмена. Наверное, Master должен быть как-то оповещен, что Slave его понял, и команды выполнил. Спасибо за готовность помочь ) |
09.09.2008, 19:49 | #5 |
Непрофессионал
Участник клуба
Регистрация: 01.01.2008
Сообщений: 1,405
|
А чего так сильно программно хочется?
На Mege8535 есть аппаратный SPI (как раз portB4-7), на Tiny2313 есть какое-то подобие последовательного интерфейса USI (portB5-7), на нем вроде можно слепить SPI. Может быть всё-таки правильнее будет железяку использовать по полной ?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------ Страничка с моими программками http://ulex-masm.ru |
09.09.2008, 21:39 | #6 |
Пользователь
Регистрация: 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 (чтобы произвести выборку в нужный момент времени)...сдвиговый регистр в данном случае программно тоже не сложно реализовать с помощью команд логического сдвига...в ближайшие сутки постараюсь написать какой-нить шаблон для реализации вышесказанного...Как-то так ... Это конечно не идеал, но один из способов...Будут вопросы - с радостью помогу чем могу
|
10.09.2008, 03:26 | #7 |
Регистрация: 08.09.2008
Сообщений: 9
|
Да, я, собственно, примерно так и пыталась сделать, но, видимо, что-то неверно настроила. В slave у меня нет ничего особенного, просто счет времени, обрабатываю прерывания timer0, так что в main-цикле могу опрашивать ноги, сколько угодно. ~SS заводила на прерывание по INT1, но либо настроила что-то не так, либо оно не хочет работать. То есть, я пробовала разные варианты и пришла к выводу, что чего-то не понимаю в принципе. Сдвиги я, естественно, сделала, там все просто. Кстати, я не упираюсь в SPI, можно и UART, но там опять же с настройками неясно.
Честно говоря, я подозреваю, что и в схеме не все правильно. Надо подтягивать ноги к +5? То есть, программно я это сделала, а схемно надо? Или наоборот - в схеме сделать, а в программе нет? Кажется, это называется Z-состояние. Правда, в ДШ на ATtiny2313 об этом ни слова нет. То есть, собственно передачу я написала, мне надо как-то ее инициировать, именно это не получается. Да, кстати, команды мне надо делать трехбайные, потому что требуется передавать два байта информации. Но с этим я управлюсь, главное заставить их понимать друг друга. Еще раз спасибо, что уделяете мне столько времени ) |
10.09.2008, 03:31 | #8 |
Регистрация: 08.09.2008
Сообщений: 9
|
Может быть, так было бы лучше, только я просто не знаю - КАК это сделать (((
Мне не удается слепить, потому и спрашиваю. Спасибо )) |
10.09.2008, 20:28 | #9 |
Пользователь
Регистрация: 23.05.2008
Сообщений: 26
|
Не стоит благодарности...Внизу прикреплен асм-файл для ATmega8535...там я примерно написал действие передатчика и способ инициации начала обмена...сразу замечание - там есть зарезервированные только для этого фрагмента регистры (R20, R21)...То есть необходимо внимательно следить за тем, чтоб не перезаписать их в процессе работы...Если такое реализовать Вам не удастся, пишите, и я покажу как это реализовать с помощью SRAM...проверял с помощью отладчика AVRstudio - вроде работает (Вы кстати его не используете?? - избавляет от многих проблем)...если что не понятно по алгоритму - спрашивайте...пример приемника напишу немного попозже...Теперь насчет схемы и подтяжек...Выложите, пожалуйста, свою схему...Ноги (как правило) лучше всего подтягивать в состояние, в котором они ничего не могут налажать, внешними и внутренними методами...Например, та же линия ~SS когда нету передачи (а это большая часть времени) должна постоянно находиться в "1"...Соответственно Вы подтягиваете ее внутренне (установкой разряда в регистре PORT) и внешне к +5В через резистор 22..50кОм...это защитит Вашу схему от всяких внештатных ситуаций...Состояние Z - это состояние когда вывод фактически отключен от провода, то есть никаким образом не может повлиять на состояние этого провода...приближенно можно считать, что для AVR это вход внутренне не подтянутый в "1"...а вообще-то Вы бы выложили схему ...так проще будет...Кстати, может удастся как-то освободить ноги ATmega 8535, чтоб появилась возможность использовать UART...и еще - если знаете С/С++, то намного удобнее писать на нем
Последний раз редактировалось Sharaevsky_Vitaly; 10.09.2008 в 21:26. |
11.09.2008, 00:04 | #10 |
Регистрация: 08.09.2008
Сообщений: 9
|
Спасибо, я поняла, где у меня ошибка была ). С регистрами разберусь.
Для UART нужно 3 ноги или сколько? Нельзя использовать 4-7 порта B? Для меня нет принципиальной разницы, каким способом я передам информацию, главное, чтобы она передалась правильно. И к скорости передачи нет жестких требований. Кстати, приемник на время передачи вообще больше ничего не делает, его единственная задача - принять информацию (время) и отсчитывать его (это контрольник для главного процессора), поэтому разрешение прерываний timer0 осуществляется по отдельной специальной команде от передатчика, а запрещение - либо в момент начала очередной передачи, либо по окончании собственного счета, так что тут никто никому и ничему помешать не может. Схему я выложу (только ее разрабатывала не я, так что, возможно, будут сложности с объяснениями, что к чему). Завтра на работе зайду сюда. Отладчиком я пользуюсь - для ATmega, а ATtiny2313 мой не поддерживает, а другого я не нашла. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
срочно! кто работал с 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 |