Маршрутизация шины I2C и SPI

При маршрутизации шины I2C (SDA, SCL) или шины SPI (SCLK, MOSI, MISO) к нескольким ведомым устройствам предпочтительнее подключать ведомые устройства параллельно или последовательно? Ниже приведены две диаграммы с помеченными расстояниями, чтобы помочь с ответом. На всех схемах я вижу, что люди соединяются последовательно, но почему это так - что, если емкость пути (A + B + C) < емкости (MNP)?

Параллельно:введите описание изображения здесь

Ряд:введите описание изображения здесь

Ответы (2)

Я не согласен с утверждением Мадмангурумана: «Как для «обычного» I2C, так и для «нормального» SPI каждому ведомому устройству требуется прямое соединение с ведущим, поэтому все ведомые устройства работают параллельно, независимо от физического размещения устройств». Сдвиговые регистры очень часто подключаются последовательно, что создает большой цикл, требующий нескольких сдвигов для передачи данных. Это только один пример действительного последовательного соединения, и их гораздо больше. Параллельный, вероятно, более распространен, как я объясню ниже, когда ведомые устройства не являются простыми или буквально сдвиговыми регистрами. То, как вы это сделаете, полностью зависит от требований вашего дизайна, а также от функциональности ваших подчиненных устройств.

Подробнее:

Использование слова «серия» действительно имеет смысл. То, что вы говорите, это вывод MOSI (главный выход / ведомый вход) на ведущем устройстве, подключенном к вводу последовательных данных ведомого устройства 1. Выход последовательных данных ведомого устройства 1 подключен к вводу последовательных данных ведомого устройства 2, а последовательный порт выход данных ведомого устройства 2 подключается к входу последовательных данных ведомого устройства 3. Наконец, чтобы завершить цикл (при условии, что вам нужна двусторонняя связь), вы должны подключить выход последовательных данных ведомого устройства 3 к входу последовательных данных ведущего устройства. Чтобы это работало, часы, генерируемые ведущим, должны быть подключены к каждому подчиненному устройству. Кроме того, каждому ведомому устройству, вероятно, потребуется использовать один и тот же сигнал выбора микросхемы, чтобы убедиться, что аппаратное обеспечение SPI будет реагировать. Чтобы прочитать данные со всех трех ведомых устройств, вам придется отправить три передачи от ведущего устройства.

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

Что касается маршрутизации, это, вероятно, не будет иметь значения, пока вы остаетесь ниже 100 МГц или около того. Более высокие частоты начинают приводить к другим проблемам. В любом случае, есть много причин, чтобы пойти в любом случае. Конечно, это может зависеть от ограничений вашей прошивки. Редактировать: Как указал Мартин Томпсон, если ваш маршрут длинный с сильным (с высокой скоростью) водителем, возможно, что отражения могут вызвать проблемы. Если вы создаете многоабонентский маршрут и ожидаете высоких скоростей фронта, терминация сигнала должна значительно помочь. Это может быть другой разговор, но достаточно сказать, что вы можете добавить терминаторы серии или заземления, чтобы поглотить энергию и предотвратить отражения.

Например, многие микроконтроллеры позволяют вам взаимодействовать с устройствами SPI, используя DMA. Если все ведомые устройства находятся на одном и том же чипе, для связи со всеми из них требуется меньше кода, но задержка выше, так как вам нужно переместить больше данных для завершения транзакции. Подчиненные устройства также могут сигнализировать о том, что они хотят передавать, но, поскольку часы генерируются ведущим устройством, последовательное соединение может вызвать здесь некоторые проблемы. Однако, если вас не волнует этот вариант использования, последовательное подключение упростит конфигурацию прямого доступа к памяти. Можно использовать DMA для связи с несколькими периферийными устройствами путем встраивания выбора микросхемы в данные, что заставляет контроллер DMA квитировать связь с соответствующим ведомым устройством. У вас может даже не быть DMA, но я подумал, что должен объяснить это, чтобы дать вам пример того, почему последовательная конфигурация может быть выгодна в некоторых обстоятельствах. Честно говоря, DMA также упрощает параллельные соединения, и довольно часто параллельные соединения гораздо более желательны в подобных ситуациях.

Параллельное подключение, вероятно, является более традиционным способом сделать это, основываясь на моем опыте, если ведомое устройство работает на более высоком уровне, чем простое переключение. Я постоянно соединяю регистры сдвига последовательно, но я часто подключаю несколько ведомых микроконтроллеров к шине SPI параллельно, чтобы каждый из них получил свой собственный выбор микросхемы и выбор ведомого (выбор ведомого выделяется для связи ведомого -> ведущего, что в основном говорит «Эй, мне нужно отправить данные, дайте мне часы»).

Наконец, вы не можете подключить I2C последовательно, если не хотите использовать разные шины I2C для нижестоящих устройств. I2C требует, чтобы все устройства были подключены параллельно. Единственное, о чем вам нужно позаботиться с точки зрения электрики, так это о том, что вы выбрали правильное значение для внешнего подтягивающего резистора. Поскольку к шине I2C может быть подключено много устройств (7 бит), слабая подтяжка может привести к тому, что сигналы шины будут метастабильными с точки зрения всего, что наблюдает за шиной для входящих данных. Вы хотите убедиться, что линия SDA находится на высоком уровне перед следующим тактовым циклом, и вы делаете это, правильно выбирая подтягивающий резистор.

Я был бы осторожен с частотами SCLK значительно ниже 100 МГц. Если SCLK управляется быстрым драйвером, а трасса достаточно длинная, даже на частоте 1 МГц, то можно получить ужасные эффекты линии передачи и многократное тактирование...
@MartinThompson Ты прав. Спасибо что подметил это. Я добавлю это к своему ответу.

Я не уверен, что вы имеете в виду под последовательным подключением шин. Как для «обычного» I2C, так и для «обычного» SPI каждому ведомому устройству требуется прямое соединение с ведущим, поэтому все ведомые устройства работают параллельно, независимо от физического размещения устройств.

Ваша последовательная диаграмма подразумевает, что ведомое устройство 3 каким-то образом должно пройти «сквозь» ведомое устройство 2 и ведомое устройство 1, чтобы добраться до мастера. Шина N и шина P не подключены к мастеру, так что это не обычный I2C или SPI. I2C и SPI просто не работают таким образом, если только ведомые устройства 2 и 1 не действуют как ведущие и ведомые устройства и не передают сообщения по выделенным шинам — ужасно неэффективная и сложная схема.

Переосмыслите то, что вы видели и о чем спрашиваете.

Вы правы в том, что различие между параллельным и последовательным является ложным - на самом деле оба случая относятся к параллельным шинам. Я предполагаю, что я спрашиваю, как должны быть размещены ведомые устройства - таким образом, чтобы уменьшить общую длину шины?
Это не имеет большого значения, если частота низкая. Длина волны 400 кГц составляет 750 м. Даже если вы используете I2C на частоте 400 кГц, не имеет большого значения, как маршрутизируются дорожки на этой частоте. Длина волны 10 МГц составляет 30 м. Так что для SPI 10 МГц это, вероятно, тоже не будет иметь большого значения. Однако, вероятно, было бы неплохо свести к минимуму длину любых «заглушек», свисающих с трасс (особенно трассы часов), поскольку они могут создавать неприятные отражения, если часы имеют острый край. «Последовательное» соединение значительно помогло бы в этом.