Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Кирпичи... » Раздвоитель шины i2c и недорогой ЦАП с флэш-памятью MCP4725 как пример


Раздвоитель шины i2c и недорогой ЦАП с флэш-памятью MCP4725 как пример

Сообщений 1 страница 6 из 6

1

Большинство устройств с интерфейсом i2c могут переключать свой адрес на шине путем задания сигналов на адресных выводах. Это позволяет подключить к одной шине несколько однотипных устройств, выбрав их адреса так, чтобы они не дублировались.
Однако некоторые устройства либо не позволяют переключить адрес, либо предлагают выбор всего двух вариантов. Если нам нужно подключить большее кол-во устройств, возникает проблема. Например, выпускается замечательный ЦАП MCP4725, имеющий встроенную память записанного значения и 12-разрядную точность, однако чип настолько крохотный, что у него есть всего один вывод для выбора i2c-адреса. Производитель выпускает чипы с 4 вариантами адресов, что позволяет в сумме повесить на одну шину до 8 ЦАП, но что делать, если разные версии чипов недоступны? (Например, на Aliexpress продается недорогая макетная плата с всего лишь одним вариантом адресации).

Свежие версии BASCOM позволяют использовать софт-версию реализации i2c сразу на несколько шин (т.н. multibus), однако эти функции не в полной мере поддержаны существующими библиотеками. Так, например, библиотека для i2c знакосинтезирующих популярных LCD (типа 16 х 2, 20 х 4 и т.п.) работает с multibus-реализацией i2c глючно: к отправляемой в операторе "LCD" строке надо непременно добавлять символ char(0), иначе строка не выводится. Да и аппаратная реализация i2c предпочтительнее, т.к. работает надежнее и требует меньше кода.

Решением проблемы представляется использование шинного i2c-раздвоителя: небольшой схемы, формирующей из пары сигналов шины i2c и одного сигнала "переключения" две поочередно работающие шины.
Схема такого переключателя показана на рисунке.

http://s8.uploads.ru/t/5SHUR.jpg

Для примера рассмотрим код, позволяющий адресовать на такой "расширенной" шине сразу 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.

+5

2

I2C редко применяю, но тоже придётся, датчики подключять.
Это на одну шину чего? Раздваивать шину?

0

3

То-есть использование больше адресов чем может стандартная шина I2C?

0

4

Думаю, этот способ больше подходит для устройств, имеющих "залоченные" I2C-адреса, когда возникает необходимость в их аппаратном разделении.
Представить систему, использующую более 127 адресов - весьма сложно... ;)

0

5

Ev3658 написал(а):

То-есть использование больше адресов чем может стандартная шина I2C?

Можешь одинаковые адреса применить на одной шине

0

6

Nord написал(а):

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

В два раза больше датчиков можете применить.

0


Вы здесь » Программирование ATMEL в BASCOM. » Кирпичи... » Раздвоитель шины i2c и недорогой ЦАП с флэш-памятью MCP4725 как пример