Jump to content

    
toweroff

MCP23008 I2C GPIO

Recommended Posts

Добрый день

Есть Allwinner H5 с Armbian. По I2C подключено несколько расширителей MCP23008
Пока был единичный ногодрыг, всё было прекрасно - экспортируем пин, настраиваем, используем
Но встала необходимость одновременного изменения состояния всех 8 GPIO одного из расширителей. И упёрлись в стену ((
Как правильно реализуется такое?
Рулить на верхнем уровне этим всем будет питон

Share this post


Link to post
Share on other sites

Какой интерфейс для управления gpio используете? Если актуальный gpio uapi + libgpiod, то смотрите на gpiod_line_set_value_bulk.  С питоном не работаю, но пакеты, работающих с libgpiod есть.

Share this post


Link to post
Share on other sites

В общем ситуация следующая: расширитель использовался как простенький R-2R DAC. Но оказалось, что побитовое переключение может критично сказаться на результате
В результате решено поставить (нужно быстро) готовый I2C DAC
Но за наводку в любом случае спасибо, на будущее пригодится точно

Share this post


Link to post
Share on other sites
1 hour ago, toweroff said:

Как правильно реализуется такое?

Если расширители нужны только вашему ПО, то можно и через /dev/i2c крутить. Нет ничего зазорного в том, чтобы управлять периферией из userspace.

Share this post


Link to post
Share on other sites
2 часа назад, toweroff сказал:

Но встала необходимость одновременного изменения состояния всех 8 GPIO одного из расширителей.

Что-то не очень понятно. Там разве нет возможности байтовой записи? Пользовались более широким расширителем того же производителя. Там есть...

Share this post


Link to post
Share on other sites
2 часа назад, toweroff сказал:

Но встала необходимость одновременного изменения состояния всех 8 GPIO одного из расширителей. И упёрлись в стену ((

чтобы пины дергались одновременно надо вместо i2c gpio expander-ов поставить либо груду регистров-защелок, сначала их загрузить, потом дать разрешение вывода

либо если пинов мало в линуксе поставить на spi регистры с последовательной загрузкой..

i2c доступ не даст одновременное переключение в нескольких расширителях i2c в силу своей природы

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

Share this post


Link to post
Share on other sites
4 minutes ago, Jury093 said:

i2c доступ не даст одновременное переключение в нескольких расширителях i2c в силу своей природы

Так речь идет об одном.

Share this post


Link to post
Share on other sites

Если использовать запись в регистр устройства I2C, то пины переключатся сразу
Если же экспортировать ПИН как /sys/class/gpio/gpioXXX, то и дёргать можно за раз только его
Или просто не нашли, как экспортировать всю MCP23008, чтобы записать в неё сразу байт

Share this post


Link to post
Share on other sites
17 минут назад, toweroff сказал:


Или просто не нашли, как экспортировать всю MCP23008, чтобы записать в неё сразу байт

Так у Вас проблема с библиотекой? А свою написать?

Share this post


Link to post
Share on other sites

 

1 минуту назад, Tanya сказал:

Так у Вас проблема с библиотекой? А свою написать?

ну это да, но уже нашли DAC по I2C по 60р в sot23 (MCP4725A0T). Устройств-то будет всего пяток - быстрее купить готовое

Share this post


Link to post
Share on other sites
3 часа назад, aaarrr сказал:

Так речь идет об одном.

пардон, невнимательно прочитал и купился на "подключено несколько расширителей"

впрочем, ТС свою проблему уже решил..

Share this post


Link to post
Share on other sites
On 7/23/2020 at 8:22 AM, Jury093 said:

чтобы пины дергались одновременно надо вместо i2c gpio expander-ов поставить либо груду регистров-защелок, сначала их загрузить, потом дать разрешение вывода

либо если пинов мало в линуксе поставить на spi регистры с последовательной загрузкой..

i2c доступ не даст одновременное переключение в нескольких расширителях i2c в силу своей природы

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

Почему груду? Один. Можно по аналоговому каналу поставить. Называется устройство выборки хранения. Я в начале 90х работал с интерфейсной платой Labtender:
https://scientific-solutions.com/products/labtender/labtender_index.html
В ней 16 аналоговых выходов на одном цапе и 16 каналах выборки-хранения сделаны были. Единственное, что надо постоянно освежать выходы.

On 7/23/2020 at 5:43 AM, toweroff said:


Но встала необходимость одновременного изменения состояния всех 8 GPIO одного из расширителей. И упёрлись в стену ((
Как правильно реализуется такое?
 

Есть два способа.

1. Сделать вывод параллельным с контроллера

2. Записать последовательно в регистр сдвига и скопировать параллельно в защелку.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.