Большинство устройств с интерфейсом i2c могут переключать свой адрес на шине путем задания сигналов на адресных выводах. Это позволяет подключить к одной шине несколько однотипных устройств, выбрав их адреса так, чтобы они не дублировались.
Однако некоторые устройства либо не позволяют переключить адрес, либо предлагают выбор всего двух вариантов. Если нам нужно подключить большее кол-во устройств, возникает проблема. Например, выпускается замечательный ЦАП MCP4725, имеющий встроенную память записанного значения и 12-разрядную точность, однако чип настолько крохотный, что у него есть всего один вывод для выбора i2c-адреса. Производитель выпускает чипы с 4 вариантами адресов, что позволяет в сумме повесить на одну шину до 8 ЦАП, но что делать, если разные версии чипов недоступны? (Например, на Aliexpress продается недорогая макетная плата с всего лишь одним вариантом адресации).
Свежие версии BASCOM позволяют использовать софт-версию реализации i2c сразу на несколько шин (т.н. multibus), однако эти функции не в полной мере поддержаны существующими библиотеками. Так, например, библиотека для i2c знакосинтезирующих популярных LCD (типа 16 х 2, 20 х 4 и т.п.) работает с multibus-реализацией i2c глючно: к отправляемой в операторе "LCD" строке надо непременно добавлять символ char(0), иначе строка не выводится. Да и аппаратная реализация i2c предпочтительнее, т.к. работает надежнее и требует меньше кода.
Решением проблемы представляется использование шинного i2c-раздвоителя: небольшой схемы, формирующей из пары сигналов шины i2c и одного сигнала "переключения" две поочередно работающие шины.
Схема такого переключателя показана на рисунке.
Для примера рассмотрим код, позволяющий адресовать на такой "расширенной" шине сразу 4 ЦАП MCP4725. На одной шине стоит пара MCP4725, имеющих разный адрес, на другой - точно такая же пара MCP4725. Выбор пар осуществляется выходом порта МК, имеющим alias CS (должен быть, как и шина i2c, сконфигурирован где-то в другом месте кода).
sub DAC_SetDAC(byte MCP4725_number , word MCP4725_value)
select case MCP4725_number
case 1
MCP4725_I2C_address = &HC0
reset CS
case 2
MCP4725_I2C_address = &HC2
reset CS
case 3
MCP4725_I2C_address = &HC0
set CS
case 4
MCP4725_I2C_address = &HC2
set CS
case else
exit sub
end select
shift MCP4725_value , left , 4
MCP4725_high = high(MCP4725_value)
MCP4725_low = low(MCP4725_value)
I2cstart
I2cwbyte MCP4725_I2C_address
I2cwbyte &H60 ' set DAC and write to EEPROM
I2cwbyte MCP4725_high
I2cwbyte MCP4725_low
I2cstop
end sub
Приведенный пример позволяет выводить значение MCP4725_value в диапазоне 0...4095 на ЦАП, заданный номером MCP4725_number в диапазоне 1...4.

