|
SPI для ATMega32, Нужна помощь |
|
|
|
Jan 29 2011, 16:44
|
Группа: Новичок
Сообщений: 5
Регистрация: 29-01-11
Пользователь №: 62 562

|
Здравствуйте! Очень нужна помощь. Мне нужно реализовать обмен данными по протоколу SPI между мастером и моим устройством на ATMega32 (slave). От мастера идёт пакет данных 12 байт, мне нужно их принять и в ответ выслать свой пакет 12 байт. В связи с этим несколько вопрос: Если в режиме slave флаг прерывания выставляется не по низкому SS, а по окончанию сдвига 1 байта (если я правильно понял) ,то как понять какой это байт по счёту пришёл? И какой соответственно слать мне. Я бы был очень признателен ,если бы кто-нибудь привёл пример кода с пояснениями ,как реализовать данную передачу  Пишу в CodeVisionAVR.
|
|
|
|
|
 |
Ответов
|
Jan 30 2011, 15:39
|
Группа: Новичок
Сообщений: 5
Регистрация: 29-01-11
Пользователь №: 62 562

|
Цитата(zombi @ Jan 30 2011, 17:59)  Так какой протокол? Просто последовательность 12-ти байт? - это отсутствие всякого протокола.
Это как? Оч. интересно. Что вы подразумеваете под протоколом? Я просто не очень, видимо, в это разбираюсь. Под протоколом я подразумевал - какие биты в каком байте отвечают за то или иное состояние. А по поводу номера...Ну если взять полубайт, это 16 комбинаций. Но эт всего лишь одна из моих бредовый идей, но почему нет  Цитата(Stepan_L @ Jan 30 2011, 18:32)  по моему надо замерить как нибудь и установить timeout приема данных от Master-а Ну как варивнт...можно над этим подумать.
|
|
|
|
|
Jan 30 2011, 23:30
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 5-12-08
Из: Санкт-Петербург
Пользователь №: 42 220

|
Вижу два пути.
Первый, потупее и не универсально, но меньше писанины: сигнал Slave Select подать заодно на вход прерывания, и настроить это прерывание как "edge triggered, по спаду". В этом вспомогательном прерывании обнулять счетчик байт. По приему очередного байта счетчик увеличивается, после приема последнего байта - сообщение отдается основной программе на обработку.
Второй путь, которым я пошел в своем последнем проекте: над SPI реализовать простейший двунаправленный пакетный протокол: Ввести коды SPI_START, SPI_STOP, SPI_FILL, SPI_ESCAPE, SPI_ESCAPED_START, SPI_ESCAPED_STOP, SPI_ESCAPED_ESCAPE, SPI_ESCAPED_FILL. Сделать простейшую подготовку пакета к передаче: приписывание в начало байта SPI_START, в конец - байта SPI_STOP, в середине пакета байты SPI_START, SPI_STOP, SPI_FILL, SPI_ESCAPE заменяются на пару байт, первый из которых SPI_ESCAPE, а второй - SPI_ESCAPED_START, SPI_ESCAPED_STOP, SPI_ESCAPED_ESCAPE и SPI_ESCAPED_FILL соответственно. На приеме проводить обратное преобразование.
Мастер формирует такой пакет и отсылает slave-у. Тот на лету декодирует, отдает на обработку, после обработки формирует ответ и ставит на отсылку. После этого мастер периодически присылает блок байтов SPI_FILL (означающих, что пакет не идет), и в ответ ожидает рано или поздно увидеть пакеты от slave-а.
В итоге получается полноценный и довольно эффективный протокол связи между мастером и простым slave-ом. Причем протокол можно написать однажды и больше не трогать - там просто нечего менять.
|
|
|
|
Сообщений в этой теме
Юран SPI для ATMega32 Jan 29 2011, 16:44 GDI Для начала, SPI - это интерфейс, а не протокол, а ... Jan 29 2011, 18:33 Юран Ну да, SPI это интерфейс.
Обмен стандартный через ... Jan 30 2011, 03:53 GDI Цитата(Юран @ Jan 30 2011, 06:53) Была у ... Jan 30 2011, 18:07 zombi ЦитатаНапример, slave включиться на середине перед... Jan 30 2011, 11:22 Юран Боюсь ,что мастер ничего об этом не думает) Проток... Jan 30 2011, 11:51 zombi Цитата(Юран @ Jan 30 2011, 15:51) Боюсь ,... Jan 30 2011, 11:59 Stepan_L Привет всем,Юран,по моему надо замерить как нибуд... Jan 30 2011, 12:32 zombi Цитата(Юран @ Jan 30 2011, 18:39) А по по... Jan 30 2011, 19:59  defunct ЦитатаБыла у меня идея поставить счётик, но тогда ... Jan 31 2011, 02:57 alexeyv ЦитатаБоюсь ,что мастер ничего об этом не думает) ... Jan 31 2011, 05:37
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|