реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Коммуникация между двумя ATmega640, Выбор конфигурации.
Dikoy
сообщение Jul 18 2012, 21:13
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Есть плата с двумя мега640 (схема резервирования).
Думаю как лучше организовать межчиповую связь.
Девайс в металле, схему коннекта между чипами прилагаю.

http://s017.radikal.ru/i414/1207/53/5d906e6272a7.gif (25 кБ)

Между чипами идёт SPI, I2C и две дополнительные дороги, которые можно использовать для контроля.
На и2ц висит ещё барометр, который должен читаться первым чипом.
Лапы MOSI/MISO имеют вывод на джамперы и я могу соединить их как хочу. На схеме показано соединение по умолчанию.

Итак. Надо гонять данные между камнями, причём траффик от второго к первому ощутимо больше, чем наоборот. Раз так в 1000. Фактически, первый запрашивает у второго отчёт, второй отчитывается. Так и живут.

Изначально я думал сделать жёстко. От первого ко второму по I2C (за одно и барометр читать). От второго к первому по SPI. Никаких коллизий, всё чётко.

Сейчас лезут мысли про мультимастерный SPI и прочие изыски.

Что скажет купечество? Принимаю идеи, критику и просто добрые слова sm.gif

Сообщение отредактировал Dikoy - Jul 18 2012, 21:14
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 18 2012, 22:21
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dikoy @ Jul 19 2012, 00:13) *
Изначально я думал сделать жёстко. От первого ко второму по I2C (за одно и барометр читать). От второго к первому по SPI. Никаких коллизий, всё чётко.

Нормальный вариант.

Цитата(Dikoy @ Jul 19 2012, 00:13) *
Сейчас лезут мысли про мультимастерный SPI и прочие изыски.

Зачем такой огород городить? Ещё и мультимастерный.
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Jul 19 2012, 00:27
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



У I2C громоздкое прерывание. Даже не смотря на то, что передавать надо будет посылки 4-6 байт и на низкой скорости (не более 100 кБит), всё равно обработка прерываний займёт время.
Это вот смущает...

Тут с верхней полки подсказывают, что проще всего сделать по SPI жёстко мастер-слейв, а когда слейву (второму чипу) есть что сказать, он просто ставит лапку.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 19 2012, 00:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dikoy @ Jul 19 2012, 03:27) *
У I2C громоздкое прерывание. Даже не смотря на то, что передавать надо будет посылки 4-6 байт и на низкой скорости (не более 100 кБит), всё равно обработка прерываний займёт время.
Это вот смущает...

Мало с i2с работал - не помню может ли slave время тянуть. Если может и поток небольшой - то не важно сколько оно там обрабатывается: __enable_interrupt на входе в прерывание i2c не улучшит ситуацию?

Цитата(Dikoy @ Jul 19 2012, 03:27) *
Тут с верхней полки подсказывают, что проще всего сделать по SPI жёстко мастер-слейв, а когда слейву (второму чипу) есть что сказать, он просто ставит лапку.

Поставит, а когда ему можно передачу начинать в master-режиме? Как к этому первый чип подготовится?
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Jul 19 2012, 01:02
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Вложенное прерывание?
Ну не знаю... Не люблю я их на восьмибитниках....

А зачем ему в мастер режим?
Второй чип получил от первого команду. Первый мастер, второй - слейв.
Эту команду осмыслил и готов ответить. он поднимает лапку.
Первый чип видит, что стоит лапка и начинает читать из второго данные. Первый байт длина, а дальше в прерывании тупо счётчик. А то и вовсе кольцевой буфер.
Кстати, да. Тупо писать в буфер без всякого парсинга. Когда второй чип опустит лапку, значит всё сказал, можно разгребать буфер.
Прерывание тогда вообще из 2 строчек будет...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 19 2012, 01:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dikoy @ Jul 19 2012, 04:02) *
Вложенное прерывание?
Ну не знаю... Не люблю я их на восьмибитниках....

А что так?
AVR поддерживает их без проблем.
Всего то нужно запретить повторное срабатывание от того же источника и разрешить прерывания. Всё.
Если конечно по скорости позволительно.

Цитата(Dikoy @ Jul 19 2012, 04:02) *
Не люблю я их на восьмибитниках....

на 16/32-битниках разве по другому?
Разрядность тут не важна: лишь бы скорости и памяти под стек хватило.

Цитата(Dikoy @ Jul 19 2012, 04:02) *
А зачем ему в мастер режим?

Кстати - да.
Пусть в slave работает - если спрашивают, то отвечает тем что есть.
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Jul 19 2012, 20:38
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Цитата(_Артём_ @ Jul 19 2012, 05:16) *
Всего то нужно запретить повторное срабатывание от того же источника и разрешить прерывания. Всё.
Если конечно по скорости позволительно.
на 16/32-битниках разве по другому?

SPI довольно быстр, можно не успеть выковырнуть байт до следующего интеррапта.
В 32 битниках обычно соплей побольше wink.gif И можно DMA всякие настроить и делать большую часть буферизации аппаратно.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 19 2012, 21:13
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата
На схеме показано соединение по умолчанию
Странное какое-то умолчание. Обычно DS чётко трактует схему подключения двух процессоров по SPI. И джамперы , как бы уже встороены внутри MCU тоже согласно DS.
И обмен данными вроде бы одновременный. Мастер может передавать и получать. И скорость SPI должна быть в 4 раза меньше тактовой как минимум. И местами поменять мастера со слейвом вроде бы трудностей нет. У кого инфы больше тот и мастер. И входной буфер на два байта. laughing.gif sad.gif
Цитата
не помню может ли slave время тянуть
Может.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 19 2012, 21:25
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dikoy @ Jul 19 2012, 23:38) *
SPI довольно быстр, можно не успеть выковырнуть байт до следующего интеррапта.

Какую скорость думаете использовать?
Для slave f_spi_max=f_osc/4 - ~ 32 такта на байт. Если ипользовать nested interrupt, то наверное можно успеть, а может и нет - как-то маловато тактов.

Цитата(Dikoy @ Jul 19 2012, 23:38) *
И можно DMA всякие настроить и делать большую часть буферизации аппаратно.

DMA не помешал бы.
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Jul 22 2012, 20:58
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Цитата(ILYAUL @ Jul 20 2012, 01:13) *
Странное какое-то умолчание.

Такая плата.




Цитата(_Артём_ @ Jul 20 2012, 01:25) *
Какую скорость думаете использовать?
Для slave f_spi_max=f_osc/4 - ~ 32 такта на байт. Если ипользовать nested interrupt, то наверное можно успеть, а может и нет - как-то маловато тактов.

Я решил остановиться на тупом поллинге. То есть полностью отказаться от прерываний, а читать байты из слейва (второго чипа) по мере наличия времени и желания. Тогда можно поставить f_osc/4 легко.
А если использовать прерывания, надо снижать скорость. Получается тож на тож, плюс риск подгадить реально важным прерываниям, которые волею судеб имеют более низкий приоритет, чем у SPI.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 23 2012, 06:28
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



У Вас , как уже писали выше ~ 32 такта.
Код
INT_SPI:
in SaveSREG,SREG
in или  sts  temp,SPDR
sts Buffer_spi,temp
out SREG,SaveSREG
reti

Итого от 10-до 12 тактов в зависимости от 3 строчки. Остается ещё 20 тактов до след. прерывания.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 23 2012, 10:53
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ILYAUL @ Jul 23 2012, 09:28) *
У Вас , как уже писали выше ~ 32 такта.
Код
INT_SPI:
in SaveSREG,SREG
in или  sts  temp,SPDR
sts Buffer_spi,temp
out SREG,SaveSREG
reti

Итого от 10-до 12 тактов в зависимости от 3 строчки. Остается ещё 20 тактов до след. прерывания.


Не так уж много там и остаётся: на вход выход в прерывание 3+3.

Код
sts Buffer_spi,temp

Как-то слишком просто - так годится если один байт принять надо.
Если больше, то набо ещё инкоемент указателя.

Код
*Buffer_spi++=SPDR;

А это уже дольше.
Плюс ещё задержка на вход в не SPI-прерывание и выполнение sei.

Поэтому думаю, что при f_spi=f_osc/4 вписаться трудно будет.
Если делить на 8-16 - то должно хватать.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 23 2012, 13:59
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Я уже посчитал выход , кстати он 4 такта.
Вместо
Код
sts Buffer_spi,temp
Код
st X+,temp
для много байт , тогда уже (-1 такт)
Также можно выбросить 1 и предпоследнюю строку т.к. SREG в прерывании не изменяется . 32 такта для asm - это очень много и в любом раскладе байт будет принят. SEI обычно решено в самом начале программы и без особой на то нужды (например запись чтение 16 байтных регистров) его не дергают.
Учитывая , что мастер может в любой момент остановить обмен ( появилось более важное прерывание) то задача вполне решаема на такой скорости и с прерываниями.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 23 2012, 15:35
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ILYAUL @ Jul 23 2012, 16:59) *
Я уже посчитал выход , кстати он 4 такта.

Да, минимум 4.

Цитата(ILYAUL @ Jul 23 2012, 16:59) *
Вместо
Код
sts Buffer_spi,temp
Код
st X+,temp
для много байт , тогда уже (-1 такт)

Это если на асме, а на Си
Код
st X+,temp
не пройдёт, то есть ещё и загрузку/выгрузку X надо делать и чтение-сохранение Buffer_spi.

Цитата(ILYAUL @ Jul 23 2012, 16:59) *
Также можно выбросить 1 и предпоследнюю строку т.к. SREG в прерывании не изменяется .

SREG можно не сохранять, но мастер не должен читать больше чем можно и буфер тольно прямой, без зацикливания.

Цитата(ILYAUL @ Jul 23 2012, 16:59) *
SEI обычно решено в самом начале программы и без особой на то нужды (например запись чтение 16 байтных регистров) его не дергают.

Вложенные прерывания ещё один случай такой нужды.
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Aug 2 2012, 19:17
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Цитата(_Артём_ @ Jul 23 2012, 18:35) *
Это если на асме, а на Си st X+,temp не пройдёт, то есть ещё и загрузку/выгрузку X надо делать и чтение-сохранение Buffer_spi.

На си получается 65 тактов.
С указателем 47.

IAR не любит асм вставки, а полностью писать проект на асме я не могу по целому набору причин.

Цитата(_Артём_ @ Jul 23 2012, 18:35) *
Вложенные прерывания ещё один случай такой нужды.

Вложеные прерывания есть вероятный источник рассинхронизации, что совсем не есть хорошо.
Пусть луше оно лишних 20 тактов отмолотит, но зато гарантия отсутствия рассинхронизации.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th July 2025 - 09:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.0152 секунд с 7
ELECTRONIX ©2004-2016