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

 
 
> SPI по двум ногам в одну сторону между двумя 328, можно ли железно?
iiv
сообщение Jul 10 2012, 11:01
Сообщение #1


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Всем привет,

есть два контроллера atmega328p, соединенные двумя ногами через оптокоплер. Оптокоплер направлен только в одну сторону, пусть с первого на второй контроллер. Мне надо непрерывно передавать с первого на второй пакет фиксированной длины в 16 байт. Чем чаще, тем лучше, не реже 0.5мс.

Процессоры работают на одинаковой, но не синхронизированной частоте.

Приемник занят другой работой.

Попробовал посылать так:

по первой ноге по прерыванию приходит команда начала, дальше с частотой 4мГц сыплю на вторую ногу свой пакет.

Так как есть CRC, есть небольшая избыточность, то все работало. Единственно, при начале прерывания приемник должен был 32мкс только принимать данные. Раньше я мог это себе позволить, а сейчас уже нет.

Хочется чего-то аппаратного. Понятно - SPI. Но у него 3 ноги, а у меня только две закоммутировано. Реально ли как-то организоввать протокол передачи на двух ногах или это для таких процессоров не реально? Очень не хочется ставить 3-4 опторазвязанные ноги...

Спасибо

ИИВ
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 18)
Палыч
сообщение Jul 10 2012, 11:09
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(iiv @ Jul 10 2012, 15:01) *
Хочется чего-то аппаратного.

Может быть, применить USART ?
Go to the top of the page
 
+Quote Post
iiv
сообщение Jul 10 2012, 11:19
Сообщение #3


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Цитата(Палыч @ Jul 10 2012, 16:09) *
Может быть, применить USART ?

забыл сказать, USARTы обоих процессоров, к сожалению, заняты...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 10 2012, 11:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(iiv @ Jul 10 2012, 15:19) *
забыл сказать, USARTы обоих процессоров, к сожалению, заняты...

Ну, выбор то - не велик: кроме USART, в наличии TWI и SPI...

Цитата(iiv @ Jul 10 2012, 15:01) *
Но у него 3 ноги, а у меня только две закоммутировано...

При необходимости, можно и двумя обойтись: MOSI и SCK.

Go to the top of the page
 
+Quote Post
редактор
сообщение Jul 12 2012, 07:30
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Цитата
При необходимости, можно и двумя обойтись: MOSI и SCK.


Совершенно верно, если передача идет в одну сторону, двух ног достаточно. Одна - тактовая (SCK), вторая - данные (MOSI).


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
SmarTrunk
сообщение Jul 12 2012, 09:35
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 22-05-11
Из: Москва
Пользователь №: 65 195



А (вопрос начинающего) как же без CS (SS)? Ведь этот сигнал начинает и заканчивает передачу? Передатчику-то все равно, а вот приемнику же надо указать начало и конец передачи? Разве для аппаратного SPI это не обязательно?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 12 2012, 09:44
Сообщение #7


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

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



Он может такое делать ,чего-то там указывать. Посмотрите другую тему в интерфейсах в этом форуме. Но в обычно это сигнал выбора устройства с которым контроллер хочет пообщаться и если в системе только одно устройство с SPI , то CS сажают на землю


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

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


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(SmarTrunk @ Jul 12 2012, 13:35) *
А (вопрос начинающего) как же без CS (SS)?

Можно на этот сигнал "повесить" нужный уровень. При таком решении можно "отгрести геморрою" при помехах и плохой согласованности работы master и slave... Рекомендовать такое решение можно, только в крайнем случае - если уж "деваться" некуда...
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jul 12 2012, 18:36
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(Палыч @ Jul 12 2012, 14:02) *
Можно на этот сигнал "повесить" нужный уровень. При таком решении можно "отгрести геморрою" при помехах и плохой согласованности работы master и slave... Рекомендовать такое решение можно, только в крайнем случае - если уж "деваться" некуда...

АЦП AD7799 сбрасывает свой интерфейс SPI если получает 32 единицы по MOSI, это можно применять вместо передёргивания nCS. Можно ли такое же сделать в слейве на AVR без больших извращений?
Go to the top of the page
 
+Quote Post
Plain
сообщение Jul 12 2012, 19:51
Сообщение #10


Гуру
******

Группа: Участник
Сообщений: 6 776
Регистрация: 5-03-09
Из: Москва
Пользователь №: 45 710



Цитата(iiv @ Jul 10 2012, 14:01) *
SPI. Но у него 3 ноги, а у меня только две

Передавать ведомому SS и данные. SCK завести с подходящего таймера.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 12 2012, 20:35
Сообщение #11


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

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



Цитата(Палыч @ Jul 12 2012, 14:02) *
.... плохой согласованности работы master и slave...

Там с согласованностью и так может возникнуть проблема, если slave не успеет обработать принятый байт за 0.5ms. Не говоря уже о втором.И что-то мне подсказывает , что для ее решения потребуются все 4 ноги SPI
Или уж в самом крайнем случае три. Хотя топикстартера мы похоже уже потеряли. laughing.gif


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

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


Гуру
******

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



Цитата(ILYAUL @ Jul 12 2012, 23:35) *
Там с согласованностью и так может возникнуть проблема, если slave не успеет обработать принятый байт за 0.5ms.

ms? или us?
Если ms, то сложно не успеть на 16МГц.
Если us, то можно и не успеть, но в прицыпе можно справиться: за 32 команды можно как-нибудь прочитать данные - прерывание ведь совсем короткое:
Код
unsigned char *ptr;
#pragma vector=SPI_STC_vect
__interrupt void SpiRxCIsr()
{
*ptr++=SPDR;
}


Цитата(ILYAUL @ Jul 12 2012, 23:35) *
Не говоря уже о втором.И что-то мне подсказывает , что для ее решения потребуются все 4 ноги SPI Или уж в самом крайнем случае три.

Чем добавочные ноги улучшат ситуацию?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jul 12 2012, 21:51
Сообщение #13


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

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



Цитата
ms? или us?
У него мс. Про тактовую Atmega молчок. Прерывание , как таковое , это ещё не вся обработка . Что там с ним делают дальше и сколь долго нет инфы. Зато есть инфа
Цитата
...сыплю... пакет.

Слово пакет подразумевает не один байт. Так , что slave надо ещё в эти 0.5мс (стиль автора) принять пакет неизвестной длины. Аппаратный SPI может "за раз" принять два байта.
Цитата
Чем добавочные ноги улучшат ситуацию?

SS - активирует работу аппаратного SPI. (Задача то сделать аппаратный) Ну в крайнем случае можно и отказаться и поискать другой путь. CLK- без комментов
MOSI MISO - это ( по моему мнению , лень ведь было написать ИМХО biggrin.gif ) единственное , что может синхронизировать работу мастера и slave т.к slave может одновременно ,с так некстати попыткой мастера отослать ему данные, вернуть ему код неготов . И мастер уйдёт на второй круг. Тем самым дать slave timeout. А slave даже и не узнает , что там "долбится" мастер , пока не разрешит своё прерывание SPI и не изменит код в буфере обмена на готов. Т.е не отвлёчется на этого .... мастера.


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

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


Гуру
******

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



Цитата(ILYAUL @ Jul 13 2012, 00:51) *
Про тактовую Atmega молчок.

Цитата
дальше с частотой 4мГц сыплю на вторую ногу свой пакет.

Максимальная частота clock-а в slave режиме не более 1/4 частоты ядра, Поэтому 16 МГц, но это предположение.

Цитата(ILYAUL @ Jul 13 2012, 00:51) *
SS - активирует работу аппаратного SPI.

Да, тут я не прав: как минимум SS у slave нужно посадить на землю.

Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 14 2012, 10:19
Сообщение #15


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(ILYAUL @ Jul 13 2012, 00:51) *
Слово пакет подразумевает не один байт. Так , что slave надо ещё в эти 0.5мс (стиль автора) принять пакет неизвестной длины.
Там рядом со словом "пакет" есть слова "фиксированной длины 16 байт".

iiv, я правильно понял, что прибито гвоздями только число линий в интерфейсе, а с платой можно и поиграться?
Тогда можно поставить одновибратор с перезапуском (в простейшем случае состоящий из диода+резистора+конденсатора), который пачку импульсов SCK растянет в длинный SS.
Если правильно выбрать CPOL/CPHA, всё будет хорошо. Для устранения проблемы байтовой сихронизации достаточно будет гарантировать паузу между байтами больше времени выдержки одновибратора. Можно — между пакетами, внутри пакта все байты пойдут одной пачкой, если успевать кормить SPI на передаче, синхронизм врядли успеет куда-то деться, а успеет — на то CRC.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SmarTrunk
сообщение Jul 14 2012, 10:43
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 22-05-11
Из: Москва
Пользователь №: 65 195



С одновибратором - это интересное решение. Если у МК нет свободной ноги для выхода CS и т.д.
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 14 2012, 11:34
Сообщение #17


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



а чем софтовый UART не подходит? во времена аврок 1200 делали и даже работало %)


--------------------
Go to the top of the page
 
+Quote Post
SmarTrunk
сообщение Jul 14 2012, 13:01
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 22-05-11
Из: Москва
Пользователь №: 65 195



Но ведь программно реализованный интерфейс загружает МК, а аппаратный передает данные в фоновом режиме?
Go to the top of the page
 
+Quote Post
iiv
сообщение Jul 30 2012, 21:01
Сообщение #19


вопрошающий
*****

Группа: Свой
Сообщений: 1 726
Регистрация: 24-01-11
Пользователь №: 62 436



Во-первых, всем огромное спасибо, что не оставили в беде и обсуждаете - я как раз отлаживал это все по-старинке, но, пока это ни к чему хорошему не привело.

У меня две атмеги 328, обе на 16МГц тактовой. Оптокоплер - быстрый, должен до 100МБит тянуть, то есть такт можно по нему посылать, но я так не делал.

Данные с посылщика я пока группировал по 16байт. Могу меньше, даже в 8байт с байтовым CRC можно вписаться.

Проблемы в том, что
1. посыльщик изредка перезагружается...
2. иногда глючит оптокоплер, наверное его пробивает sad.gif
3. приемник сильно занят другой работой,
4. время отправки посылки тоже очень важно, то есть важно не договориться о том, что посылаем каждую милисекунду, а, что посылщик шлет обычно два раза в милисекунду, но изредка, может послать когда захочет, и приемник должен принять.

Пока я делал так, получаю на одну ногу прерывание, дальше по другой ноге софтверный SPI c 4МГц тактовой, все можно уложить в 16мкс, но, для приемника даже 16мкс - очень критично, он не может в произвольный момент остановиться и сказать все, я только слушаю.

Цитата(ReAl @ Jul 14 2012, 15:19) *
iiv, я правильно понял, что прибито гвоздями только число линий в интерфейсе, а с платой можно и поиграться?


да, у приемника можно хоть все SPI-ные ноги куда-то пристроить. Сильно больше 4-х ног у меня нет, линий - только 2, прибиты гвоздями сквозь толстенную коробку с трансформаторным маслом sad.gif

Цитата(ReAl @ Jul 14 2012, 15:19) *
Тогда можно поставить одновибратор с перезапуском (в простейшем случае состоящий из диода+резистора+конденсатора), который пачку импульсов SCK растянет в длинный SS.
Если правильно выбрать CPOL/CPHA, всё будет хорошо. Для устранения проблемы байтовой сихронизации достаточно будет гарантировать паузу между байтами больше времени выдержки одновибратора. Можно — между пакетами, внутри пакта все байты пойдут одной пачкой, если успевать кормить SPI на передаче, синхронизм врядли успеет куда-то деться, а успеет — на то CRC.


идейно, спасибо, буду пробовать, может получится.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:42
Рейтинг@Mail.ru


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