Как стать автором
Обновить

Связь между Arduino по оптоволокну через SFP трансиверы

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров11K

«Чем цивилизованнее и могущественнее перед силами природы человеческое общество, тем сильнее в нем развиты системы передачи и обработки информации.»

А. Л. Дмитриев. Оптические системы передачи информации

Пролог

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

Введение

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

Много раз я натыкался на статьи, в которых связь между устройствами на базе аппаратной платформы Arduino осуществлялась при помощи оптического канала связи. Здесь и лазерный диод с фоторезистором без оптоволокна [1]. И более интересные проекты с использованием специализированных трансиверов и ресиверов [2].

Проект на оптических трансиверах и ресиверах вроде HFBR-1415PMZ от Broadcom показался мне очень интересным [3]. Этот оптический трансивер может поддерживать скорость передачи до 160МБод! А если нужно быстрее? На чём строятся линии связи 1Гбит или 10 или 100?

Трансиверы похожего формфактора для указанных скоростей найти не удалось. Однако поиски привели к SFP модулям, которые как раз поддерживают перечисленные скорости.

Сразу возникли вопросы

  • HFBR-1415PMZ трансивер, согласно документации, содержит в себе лишь светодиод, а что внутри SFP трансиверов?

  • Почему у некоторых SFP трансиверов два гнезда, а у других только одно?

  • Что обеспечивает большую скорость передачи данных?

  • Можно ли использовать эти трансиверы для своих поделок, ведь ценник на них не сильно отличается от низкоскоростных трансиверов Broadcom, а технические характеристики значительно шире?

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

Что внутри SFP

Для экспериментов были взяты SFP модули Modultech 1.25Гбит, 10км, работающие с длинами волн 850нм (MT-SFP-G-DF-31-10-CD) и 1310нм (MT-SFP-F-DF-31-10-CD). Каждый модуль имеет приёмник и передатчик и два разъёма для подключения оптического волокна. Документация нашлась на сайте производителя [4].

Внешний вид SFP модуля
Внешний вид SFP модуля

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

Печатная плата SFP модуля
Печатная плата SFP модуля

TOSA и ROSA

Один из оптических модулей – лазерный излучатель, помещённый в специальный пластиковый корпус – направляющую для оптического волокна. Второй модуль – фотоприёмник (скорее всего PIN) с точно таким же пластиковым корпусом. В крайне полезной статье можно прочитать какие типы лазерных передатчиков и приёмников используются в таких модулях [5].

В не менее полезной серии статей удалось выяснить, что передатчики и приёмники называются TOSA (Transmitter Optical Sub-Assemblies) и ROSA (Receiver Optical Sub-Assemblies) а есть ещё и BOSA (Bidirectional Optical Sub-Assemblies) [6].

BOSA используется как раз в тех SFP модулях, где есть только одно гнездо для оптоволокна. В них данные передаются светом одной длины волны, а принимаются другой.

Установить модели TOSA и ROSA конкретно в данных SFP модулях не удалось ввиду отсутствия видимых следов маркировки, но после долгих поисков были найдены производители и поставщики схожих (по количеству выводов и типу колпачков) сборок. Среди них оказались Lasemate Group, Eoptolink, Optoway, Jezetek [7][8][9][10].

Внешний вид и распиновка ROSA eoptolink LC-ROSA2x91xxx
Внешний вид и распиновка ROSA eoptolink LC-ROSA2x91xxx

Видно, что сборки устроены внутри не просто, они содержат усилитель, некоторые модели снабжены выводом RSSI (received signal strength indicator). Конкретно в MT-SFP-G-DF-31-10-CD стоят ROSA типа E с выводом RSSI, который подключается к соответствующей ножке ASIC.

Микросхемы

На нижней стороне расположена EEPROM с интерфейсом I2C BL24C08F [11]. В ней хранится конфигурация для другой микросхемы, которую можно прочитать и записать по тому же I2C интерфейсу, который, к слову, выведен в краевой разъём SFP модуля. I2C интерфейс даёт доступ к системе цифровой диагностики модуля (DDTC).

На верхней стороне расположена микросхема i7525BN, которая представляет собой лазерный драйвер и усилитель для PIN фотодиода. Производит эту микросхему фирма TMtech и на сайте производителя на неё нашлась крайне скудная документация [12].

В документации на модуль SFP сказано, что модуль поддерживает средства цифровой диагностики (DDM) согласно стандарту SFP MSA. В документе SFF-8472 подробно изложены формат обмена данными и карты регистров, куда можно записывать конфигурацию и считывать диагностическую информацию [13].

Натыкался на множество проектов подключения Arduino к этому интерфейсу (вот один из них) с целью создания измерителей мощности излучения [14].

Это конечно здорово, но нас интересует как передавать данные по оптоволокну через SFP модуль используя Arduino. И таких проектов найти не удалось.

Интерфейс модуля SFP

В спецификации INF-8074i SFP (Small Formfactor Pluggable) Transceiver можно найти исчерпывающую информацию обо всех стандартизированных решениях в SFP трансиверах [15].

На странице 20 имеется описание разъёма, предназначенного для подключения SFP модулей любых типов.

Распиновка разъёма для подключения SFP модуля (Diagram of Host Board Connector Block Pin Numbers and Names)
Распиновка разъёма для подключения SFP модуля (Diagram of Host Board Connector Block Pin Numbers and Names)

Из важного:

  • Модуль питается от напряжения 3.3В. Указано, что максимальный ток потребления может составлять до 300мА. Сказано про необходимость фильтрации питающего напряжения, приведена подробная схема фильтра. Плюс питания VccR (питание приёмника) и VccT (питание передатчика). Минус питания VeeR и VeeT. Конкретно в данной модели SFP модуля все земли уже объединены на плате и все линии питания тоже.

  • Вывод 3 – очень важен. TX Disable подтянут внутри модуля к плюсу питания через сопротивление 4.7-10кОм и для того чтобы передатчик заработал, нужно этот вывод прижать к земле.

  • TD+ и TD- - дифференциальная линия входа передатчика, сюда подаётся то, что нужно передать по оптоволокну. На плате уже установлена гальвано развязка через конденсаторы и терминатор 100 Ом. Данный вход допускает колебания дифференциального напряжения 500 – 2400мВ. Для достижения наилучших характеристик по электромагнитной совместимости рекомендуют оставаться в диапазоне 500 – 1200мВ.

  • RD+ и RD- - дифференциальная линия выхода приёмника, отсюда выходит то, что передали по оптоволокну. Здесь есть только гальвано развязка, терминатор нужно установить на стороне приёмника (100 Ом). Дифференциальное напряжения может колебаться от 370 до 2000мВ.

На странице 23 (рисунок 2B) приведена схема подключения SFP модуля

Схема подключения SFP модуля (Example SFP Host Board Schematic)
Схема подключения SFP модуля (Example SFP Host Board Schematic)

В целом всё понятно. На TD гоним данные, с RD принимаем данные, всё просто! Подключаем!

SFP модуль первое подключение

Первым делом нужно где-то раздобыть дифференциальный сигнал. Arduino не имеет дифференциальных интерфейсов. Нужен преобразователь CMOS/TTL – дифференциальный сигнал. Вспомнился LDVS, но у него не дотягивается дифференциальное напряжение, а вот M-LDVS хоть и медленнее чутка, но зато напряжение уже 480 - 650мВ [16].

Довольно быстро нашлась микросхема MS2111 фирмы Ruimeng. Которая является приёмником и передатчиком линии M-LDVS и может обеспечивает скорость до 200Мбит/с [17].

Поскольку модуль SFP имеет краевой разъём я долго пытался найти ответную часть SFP, которая устанавливается в хосте. Удалось найти только на Aliexpress [18].

Две микросхемы MS2111 обслуживают один SFP модуль, одна работает в режиме передатчика, вторая - в режиме приёмника. В ходе первой серии экспериментов электрический вход подключен к генератору (RIGOL DG4202), выход - к осциллографу (RIGOL MSO5354). Оптический передатчик подключен к оптическому приёмнику. Для подключения был использован патч-корд с разъёмом LC/UPC длинной 1 метр, тип оптического волокна 9/125мкм.

Внешний вид сборки для первой серии экспериментов
Внешний вид сборки для первой серии экспериментов

С генератора подавался меандр с различной частотой, амплитуда 3.3В. На осциллограммах представлены сигналы с генератора (жёлтый график) и с выхода приёмника после микросхемы MS2111 (синий график). В активном режиме модуль потребляет около 170мА при питании от источника напряжения 3.3В.

2МГц
2МГц
100кГц
100кГц
1кГц
1кГц

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

SFP второе включение: пробуем модуляцию

И так, при передаче низкочастотного меандра получается какая-то шляпа. Но при передаче высокочастотного сигнала (более 2МГц) вроде всё в порядке. Где-то я слышал что согласно стандарту IEEE 802.3 при передаче по линии связи данные кодируются манчестерским кодом [19].

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

Но тут проблема: для большинства платформ Arduino формировать манчестерский код с частотой 2МГц – невыполнимая задача. А ведь его ещё нужно как-то потом расшифровывать…

Было принято решение отказаться от манчестера и использовать частотную манипуляцию. Первая частота 2МГц, вторая частота 0Гц. Промодулировать UART таким способ очень просто, нужен только один логический вентиль «2И». Декодируем при помощи пассивного ФНЧ (RC), а дальше компаратор, чтобы до логического уровня дотянуть. Несущую будет генерировать таймер микроконтроллера, но можно было бы взять и кварцевый генератор.

Для экспериментов выбрана Arduino Leonardo на базе микроконтроллера ATmega32U4. Выбор пал именно на эту платформу, так как она имеет аппаратный интерфейс UART, который не используется для коммуникации с ПК.

В предыдущем эксперименте установлено, что SFP трансивер потребляет до 170мА при напряжении питания 3.3В. В сборку включен понижающий импульсный преобразовать на микросхеме MP2307ВN.

TX подключается к одному из входов микросхемы 74HC08N. Эта микросхема содержит в себе 4 логических элемента «2И». На второй вход подаётся меандр с частотой 2МГц с вывода PB5 (OC1A). Выход микросхемы подключается к передатчику MS2111 и дальше по дифферециальной паре отправляется на SFP трансивер.

Дифференциальный выход SFP трансивера подключается к приёмнику MS2111. Выход приёмника подключен к ФНЧ и компаратору LM393. Открытый коллектор компаратора подтянут к 3.3В через 1кОм и подключен к RX. Кольцо замкнулось.

Исходный код в Arduino IDE
String recive;
String transmit;

void TimerSetup () {
  // OC1A - output
  DDRB |= (1<<PB5);
  	// FastPWM 14, TOP = ICR1,  prescaller 1, F_PWM = 2MHz
	TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(0<<WGM10);
	TCCR1B = (1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
	ICR1 = 7;
	OCR1A = 3;

	TIMSK1 = (0<<ICIE1)|(0<<OCIE1B)|(0<<OCIE1A)|(0<<TOIE1);
}

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(200);
  Serial1.begin(9600);
  Serial1.setTimeout(200);
  TimerSetup();
}

void loop() {
  // ловим сообщение от ПК
  if(Serial.available() > 0) {
    // читаем что получили и в точности отправляем в трансивер
    transmit = Serial.readString();
    Serial1.print(transmit);

    // эхо
    Serial.print("T: ");
    Serial.print(transmit);
    Serial.println(" ");
  }
  
  // ловим сообщение от трансивера
  if(Serial1.available() > 0) {
    // читаем что получили и отправляем на ПК
    recive = Serial1.readString();

    Serial.print("R: ");
    Serial.println(recive);
    Serial.println(" ");
  }
}

Микроконтроллер принимает сообщение от ПК и транслирует их напрямую в UART. Посылка принятая по UART отправляется на ПК. В эксперименте скорость обмена данными по UART составляет 9600 бод.

Осциллограмма на TX и RX.

Жёлтый - TX, Розовый - RX
Жёлтый - TX, Розовый - RX

Работает отлично!

Заключение

Цель достигнута. При помощи Arduino Leonardo данные передаются через SFP трансивер MT-SFP-F-DF-31-10-CD.

В результате удалось реализовать ещё один способ связи между двумя платформами Arduino по оптоволокну, отличающийся сомнительной полезностью... А также узнать побольше об устройстве оптоволоконных SFP трансиверах.

Перечень использованных источников

  1. Лазерная связь между двумя Arduino кодом Морзе

  2. Arduino Optical Fiber Communication – Easy Guide

  3. Документация на модуль HFBR-1415PMZ

  4. Документация на SPF модули Modultech

  5. Основные параметры и сертификация оптических SFP модулей

  6. Основные понятия и характеристики оптических модулей

  7. Официальный сайт Lasermate Group

  8. Официальный сайт Eoptolink

  9. Официальный сайт Optoway

  10. Официальный сайт Sichuan Jiuzhou Optical Electronics

  11. Документация на микросхему BL24C08F

  12. Документация на микросхему i7525BN

  13. Документ SFF-8472

  14. Подключение Arduino к DDM SFP модуля

  15. INF-8074i SFP (Small Formfactor Pluggable) Transceiver

  16. Руководство по реализации схем с интерфейсами LVDS и M-LVDS

  17. Документация на микросхему MS2111

  18. Ссылка на продавца сокета SFP модуля

  19. IEEE Standard for Ethernet IEEE Std 802.3™-2015

Теги:
Хабы:
Всего голосов 48: ↑47 и ↓1+68
Комментарии30

Публикации