Как новичок в программировании PIC, я ищу некоторые мысли о том, как реализовать SPI между ведущим и подчиненным MCU наиболее эффективным способом.
Целью этой системы является предоставление чрезвычайно гибкого способа «отображения» до 32 отдельных выходных контактов ведомого MCU на любой из 32 входных контактов ведущего MCU с использованием программно-конфигурируемой «матрицы».
Чтобы было немного понятнее, я добавил рисунок ниже:
Другой MCU (не показан на рисунке) управляет настройкой сопоставления портов и передает эту информацию подчиненному MCU в виде «матрицы портов» через I2C.
В примере рисунка подчиненный выходной порт B, бит 0 (B.0) должен быть сопоставлен с главным входным контактом A, бит 0 (A.0). Кроме того, выход B.3 должен отображаться на вход A.1, а выход C .6 должен отображаться на вход B.6
Таким образом, когда главный контакт A.1 становится высоким, подчиненный контакт B.3 также должен быть высоким. С точки зрения приложения это должно быть прямолинейно.
Но каким будет наиболее эффективный способ прочитать 32 бита из 4 портов на ведущем устройстве и представить их на ведомом устройстве в виде 32-битного целого числа, чтобы приложение обеспечило сопоставление со своими выходными портами?
Тактовая частота SPI должна быть не менее 2 МГц, чтобы быть функционально приемлемой. Является ли DMA решением здесь? Может ли такое транспортное решение быть основано на прерывании/событии, чтобы ЦП не опрашивал материал? Целевыми микроконтроллерами являются PIC32MX795.
Я мог бы определенно использовать некоторые подсказки, чтобы начать это общение.
Заранее спасибо!
Для передачи данных: проще всего это сделать с помощью сдвиговых регистров. Вам не нужно будет беспокоиться ни о медленных микроконтроллерах, ни о программировании оборудования в CPLD.
Возьмем например 74HC164 и 74HC166
Вы можете каскадировать четыре регистра 74HC166, чтобы создать 32-разрядный регистр сдвига с параллельным вводом/выводом, а затем выполнить десериализацию с использованием четырех регистров 74HC164 (32-разрядный регистр последовательного ввода/вывода). Эти чипы могут легко работать на частоте 100 МГц, практически ничего не стоят и требуют минимальной схемы.
Проблема в том, что вы хотели использовать «матрицу назначения контактов». Строить это с воротами было бы болезненно.
Если вы сами хотите изменить протокол связи, самым быстрым способом может быть использование всех 4 линий для отправки состояний выводов (8 выводов данных на линию).
Идея здесь состоит в том, чтобы использовать в основном однопроводной последовательный протокол. Поскольку у вас не будет тактовой линии, вам нужно будет использовать какой-то стартовый бит, чтобы определить начало передачи.
Допустим, линии данных удерживаются на высоком уровне в состоянии простоя, а 0 — это начальный бит. Если вы хотите передать 0x12345678 данных контакта (32 бита), вы должны передать 0x12 в первой строке, 0x34 во второй строке и так далее.
Битовый шаблон в первой строке будет выглядеть так:
0 0 0 0 1 0 0 1 0
^ — начальный бит
Во второй строке вы получите:
0 0 0 1 1 0 1 0 0
^ — начальный бит
Вы можете видеть, куда я иду с этим. Вы можете добавить бит контрольной суммы в конце, чтобы убедиться, что у вас нет ошибок чтения. Чтобы реализовать это, вам нужно будет дождаться, пока линия станет низкой (для этого вы можете использовать прерывание), и с этого момента, по сути, реализовать любой другой последовательный алгоритм - выборка строки несколько раз за битовый период (максимальная продолжительность одного бита ) и убедитесь, что значение стабильно, прежде чем записывать его.
Затем все, что вам нужно сделать, это сжать данные, собранные из всех 4 строк, используя некоторые битовые сдвиги, и записать их прямо в вывод.
Ваши требования довольно строгие (2 МГц, задержка 10 мкс), чтобы это можно было сделать на PIC с несколькими десятками MIPS. При этом, возможно, это возможно. Но это все еще не лучший инструмент для работы.
Знакомы ли вы с ПЛИС? Они слишком большие и дорогие для этого, но некоторые дешевые маленькие CPLD тоже могут это сделать. Вместо того, чтобы писать программное обеспечение, вы должны реализовать переключение битов SPI в VHDL или Verilog на главной стороне, а затем подчиненным может быть ваш контроллер ЧПУ, PIC или другой CPLD.
Гбулмер
Петерстивены
ткросли
браханы
Петерстивены
Петерстивены