electroget писал(а):Из моего ничего не торчит.
Если не нужно, то и не торчит. Мне же нужно (smbus, pmbus), я себе
высунул.
Добавлено after 2 hours 5 minutes 2 seconds:Итак, всё-таки распишу как выкручиваюсь сейчас и почему. Во-первых, у меня таки есть преобразователь USB-I2C, который видится системой как полноценная шина. Только она не внутри, а "на улуицу", но это системе без разницы.
Проект открытый, деталей мало, собирается легко, работает замечательно. Ну и приспичило мне пригородить к нему вот этот вот TM1637 индикатор. Почему? Да потому что на столе лежит и2ц шина и циферки, с типа и2ц интерфейсом (нет). Довольно хорошо как им управлять написано
вот тут.
Подробно описывать что к чему не буду, это уже сделано за меня. Если вкратце, то всё в итоге сводится к трём шагам:
Во-первых, включение-инициализация. Нужно сформировать последовательность 0b111 1 000 1. Для индикатора это означает
111 - три бита, отвечающие за яркость
1 - включить отображение
000 - так надо
1 - тоже всегда предписано быть единицей.
Хорошо, допустим. Но что это значит с точки зрения и2ц? 0b1111000 1, где
1111000 - адрес ведомого (0х78)
1 - означает, что сейчас мы будем с него читать.
Итак, проблема номер один. Одни и те же последовательности для двух устройств означают немного разное. Например, адрес ведомого 0х78 как бы не может существовать. Запрешён он. Во-вторых, если мы хоть один байт вычитаем с него, то получим последовательность 0хFF. Индикатор-то линию вниз не тянет, ему не надо. Более того, воспринимает эту последовательность как команду, что всё портит. Ну да и ладно, значит нужно считать 0 байт. Хорошо. Видно, что осциллограф из-за адреса не может воспринять это как корректную и2ц последовательность и отказывается её расшифровывать.
Во-вторых, перевод индикатора в конкретное состояние приёма данных. Нам нужна последовательность 0b0 0 0 0 0010, где
0 - так предписано, что всегда 0 без вариантов
0 - сейчас будет запись данных для отображения
0 - данные пойдут пачкой сразу для всех знакомест
0 - нормальный режим (хз что это)
0010 - тоже так надо.
Для и2ц это 0b0000001 0, где
0b0000001 - адрес ведомого 0х01
0 - запись.
Ну отлично, по старой схеме пишем 0 байт в адрес 0х01. И вот теперь-то индикатор ждёт данные для отображения. Всего в контроллере предусмотрено управление шестью сегментами, но часто распаяно лишь 4. Это не принципиально. Можно уже отображать что-нибудь.
В третьих, нужно установить адрес и гнать данные. В качестве команды установки адреса нужно отправить 0b00000011, короче чтение 0 байт из 0х01. Адрес установили, можно писать.
Но! Запись-то начинается с адреса! Вот тут не могу сказать точно как конкретно оно работает, но работает. Я просто пишу 6 байт по адресу 0х01, что сначала формирует команду, аналогичную пункту 2, а потом уже засылает что нужно для отображения.
Вот вроде и работает, но как-то всё на костылях. Конечно, лучше было бы реализовать что-то менее китайское, но работает же! Несмотря на то, что этим я планирую пользоваться почти каждый день, интерес всё же больше академический. Всё-таки и2ц это вовсе не GPIO и приходится вот так вот выкручиваться. Может быть подскажете ещё какие-нибудь хитрые финты.