Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPI по двум ногам в одну сторону между двумя 328
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
iiv
Всем привет,

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

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

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

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

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

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

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

Спасибо

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

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

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

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

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

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

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


Совершенно верно, если передача идет в одну сторону, двух ног достаточно. Одна - тактовая (SCK), вторая - данные (MOSI).
SmarTrunk
А (вопрос начинающего) как же без CS (SS)? Ведь этот сигнал начинает и заканчивает передачу? Передатчику-то все равно, а вот приемнику же надо указать начало и конец передачи? Разве для аппаратного SPI это не обязательно?
ILYAUL
Он может такое делать ,чего-то там указывать. Посмотрите другую тему в интерфейсах в этом форуме. Но в обычно это сигнал выбора устройства с которым контроллер хочет пообщаться и если в системе только одно устройство с SPI , то CS сажают на землю
Палыч
Цитата(SmarTrunk @ Jul 12 2012, 13:35) *
А (вопрос начинающего) как же без CS (SS)?

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

АЦП AD7799 сбрасывает свой интерфейс SPI если получает 32 единицы по MOSI, это можно применять вместо передёргивания nCS. Можно ли такое же сделать в слейве на AVR без больших извращений?
Plain
Цитата(iiv @ Jul 10 2012, 14:01) *
SPI. Но у него 3 ноги, а у меня только две

Передавать ведомому SS и данные. SCK завести с подходящего таймера.
ILYAUL
Цитата(Палыч @ Jul 12 2012, 14:02) *
.... плохой согласованности работы master и slave...

Там с согласованностью и так может возникнуть проблема, если slave не успеет обработать принятый байт за 0.5ms. Не говоря уже о втором.И что-то мне подсказывает , что для ее решения потребуются все 4 ноги SPI
Или уж в самом крайнем случае три. Хотя топикстартера мы похоже уже потеряли. laughing.gif
_Артём_
Цитата(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 Или уж в самом крайнем случае три.

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

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

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

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

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

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

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

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

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

У меня две атмеги 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.


идейно, спасибо, буду пробовать, может получится.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.