Перейти к содержанию
    

Всем спасибо за ответы, очень помогли :)

К слову работаю я на довольно низкой частоте 500 кбод/c, но я так понимаю скорость обмена зависит от тактовой частоты мастера, а не слейва?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота обмена ВСЕГДА зависит от частоты мастера.

Ведомый кристалл только выставляет соответствующий уровень на пине MISO в момент(ы) смены тактового сигнала SCK.

Необходимое условие - частота обмена не более четверти тактовой частоты ведомого чипа. Заметьте, тактовой частоты его периферии.

Приведу пример:

Мастер: 8МГц. Ведомый: 8МГц.

SPI мастера тактируется от внутренней частоты с делителем /2. Результатирующая - 4МГц (внутренняя) и 2МГц (максимальная частота на пине SCK (здесь я имею в виду полную смену тактового сигнала 0-1-0)).

SPI ведомого тактируется от внутренней шины с делителем /4. Результатирующая - 2МГц (вроди бы, совпадает с внешней), но максимальная внешняя - 1МГц (тот же полный импульс 0-1-0).

Так что, мастер должен дёргать пином минимум в 2 раза медленнее.

 

500кБод - вполне достаточно 1МГц на шине. На шине ведомого. Ну и мастер должен с этой частотой данные читать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я это осознал, другой вопрос заключается в том, что на мастере необходимо организовывать задержку перед отправкой "мусора", например, чтобы принять данные от слэйва(в котором включается дма в прерывании)?
Используйте стандартные методы.

Если слейв должен возвратить "быстрые" данные (например выборка параметра из RAM) то для этого таймауты не нужны и все можно

"прокрутить" в одном запрос-ответе.

Если же нужна задержка на подготовку данных (например отработка ADC) то это делается "наразвес", несколькими командами

1. Старт АЦП в слейве. 2. опрос регистра статуса слейва готовности данных АЦП. 3. Чтение слейва - данных АЦП.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота обмена ВСЕГДА зависит от частоты мастера.

Ведомый кристалл только выставляет соответствующий уровень на пине MISO в момент(ы) смены тактового сигнала SCK.

Необходимое условие - частота обмена не более четверти тактовой частоты ведомого чипа. Заметьте, тактовой частоты его периферии.

Приведу пример:

Мастер: 8МГц. Ведомый: 8МГц.

SPI мастера тактируется от внутренней частоты с делителем /2. Результатирующая - 4МГц (внутренняя) и 2МГц (максимальная частота на пине SCK (здесь я имею в виду полную смену тактового сигнала 0-1-0)).

SPI ведомого тактируется от внутренней шины с делителем /4. Результатирующая - 2МГц (вроди бы, совпадает с внешней), но максимальная внешняя - 1МГц (тот же полный импульс 0-1-0).

Так что, мастер должен дёргать пином минимум в 2 раза медленнее.

 

500кБод - вполне достаточно 1МГц на шине. На шине ведомого. Ну и мастер должен с этой частотой данные читать.

 

Спасибо, это действительно логично

 

Используйте стандартные методы.

Если слейв должен возвратить "быстрые" данные (например выборка параметра из RAM) то для этого таймауты не нужны и все можно

"прокрутить" в одном запрос-ответе.

Если же нужна задержка на подготовку данных (например отработка ADC) то это делается "наразвес", несколькими командами

1. Старт АЦП в слейве. 2. опрос регистра статуса слейва готовности данных АЦП. 3. Чтение слейва - данных АЦП.

 

В том и проблема, что именно в такой системе как реализовано у меня, АЦП конвертируют данные, DMA записывает их в буфер, который копируется ещё в один (на отправку мастеру), по приходу флага копирование данных в этот буфер прекращается и я отправляю этот буфер мастеру, но как я уже говорил, флаг у меня приходит, срабатывает прерывания, на слэйве запускается DMA по Rx запросу, но чтобы мастер начал читать адекватные данные, когда я начинаю слать слэйву "мусор", нужно выждать что-то около 500мс, что очень плохо, потому что обновлять данные я должен несколько раз в секунду, поэтому решением этой ситуации, как мне подсказали выше, это реализовать просто обмен по DMA без всяких флагов, что я уже сделал и что гораздо проще в итоге

Изменено пользователем Connor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я сделал так.

 

Одну ногу мастера использую как CS. На слейве - передний фронт сигнала CS вызывает прерывание - предупреждение о том, что через 1 мсек (под мои задачи) мастер запустит обмен. За это время слейв готовит данные в буфере передачи и запускает свои DMA на прием и передачу, после чего занимается своими делами. По завершении DMA передачи от мастера он получает прерывание (TC DMA) и считывает полученные от мастера данные.

 

Мастер получает прерывание от таймера (период обмена), ставит CS, готовит данные передачи и занимается своими делами. Через 1 мс после установки CS (опять же по прерыванию таймера) мастер запускает прием/передачу по DMA и занимается своими делами. По ее завершении получает прерывание (TC DMA), считывает данные слейва и снимает CS.

 

Т.е. вся работа идет по прерываниям и DMA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

. . . .начинаю слать слэйву "мусор", нужно выждать что-то около 500мс, что очень плохо, . . .

Если сделаете аппаратную синхронизацию по времени цикла 1с по всей системе (например от мастера),

то проблемы с таймаутами и готовностью-неготовностью можете "разрулить" с использованием таймеров.

(не будет необходимости ожидания или контроля отработки для асинхронных событий между мастером и слейвом).

Например, мастер на такте 0 таймера дает команду слейву на старт АЦП. Время работі АЦП, скажем, 500 мс.

Соответственно, мастер дает команду опроса слейву на 520-ом такте, а слейв заботится о том, чтобы эти данные и все подготовительные операции

к 520-му такту у него были закончены.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если сделаете аппаратную синхронизацию по времени цикла 1с по всей системе (например от мастера),

то проблемы с таймаутами и готовностью-неготовностью можете "разрулить" с использованием таймеров.

Плавали, знаем...

Всё это будет работать до очередной хотелки клиента. После чего придётся переписывать почти весь проект, причём на оба чипа, и почти с нуля. Мне лень убеждать, но посмотреть со стороны всегда приятно.

И всё-же: разделяйте уровень железа и программной части, уровень интерфейса и протокола пакетной связи, а также разумно используйте абстракции данных на уровне приложения (алгоритма). При использовании подобного разделения - ваш проект можно масштабировать практически бесконечно (в разумных пределах), а так-же использовать части и даже целые куски в новых проектах - без подгонки напильником.

 

Реальный пример существующего проекта.

На ПП несколько чипов, в том числе и слабенький st для работы с сенсорным экраном (не я придумывал). Изначально алгоритм этого чипа был очень простым: получить координаты нажатия экрана, и в режиме слейва отдать главному чипу. Потом ему добавили работы в определении нажатия иконок - протокол связи стал намного сложнее и обрёл множество садового инструментария. Количество изменений в проекте между этими двумя точками - просто безумное. Переписывалось даже то, что имеет лишь косвенное влияние. А потом хозяин проекта узнал что существуют готовые железные контролёры сенсорных экранов, в которых эти функции реализованы изначально. Такого количества подстановок я не встречал даже у индусов. Количество изменений равнялось общему объёму проекта. Поле чего автор проекта решил пристрелить больное бешенством животное, и начать с нового листа. И с первых строчек прострелил себе ногу в трёх местах.

 

Я к тому что уровень адруино не лечится, если уже заразились - то постарайтесь не распространять заразу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Плавали, знаем...
Все понятно, кроме одного, зачем процитирован мой пост.

Если процитирован, то замечания по сути.

ps

Используя метод психоанализа я, кажется, понял в чем причина :) В терминах и их применении.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если процитирован, то замечания по сути.

Всё очень просто. Использование предсказания поведения внешней системы с использованием таймера - намного уменьшает гибкость общего алгоритма. То-есть если-бы внешней системой было железо, механика или нечто подобное - то реализация предсказаний оправдывается. Но в связке двух процессоров - это наличие недостатка в алгоритме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но в связке двух процессоров - это наличие недостатка в алгоритме.

Делаю связку из нескольких процессоров с ипользованием half-duplex SPI (1 линия приема-передачи)

Вот тут без жесткого тайминга никак.... Вовремя надо направление переключить - мастер-приемник-то шпарит постоянно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...