Как изменить адрес I2C AS5048B

i2c

Я видел это видео от Джеймса Брутона: https://www.youtube.com/watch?v=KN4wAZHtbzc

См. ссылки на репозитории GitHub в описании видео.

Я купил несколько плат AS5048B в компании AMS, чтобы измерить положение своих шаговых двигателей. https://www.mouser.ca/ProductDetail/985-AS5048B-TS_EK_AB

В репозитории sosandroid я запустил program_address и смог заставить работать одну из них, но все они имеют один и тот же адрес I2C, и потому что я хочу иметь 6 из них работают одновременно, это, конечно, не сработает.

Я знаю, что мог бы получить мультиплексор I2C...

Я также попытался установить для контактов A1 и A2 на AS5048B высокий и низкий уровни, которые изменяют адрес I2C (всего 4)...

Но я хочу навсегда изменить адрес I2C для каждой платы.

Мне кажется, что program_address должен постоянно программировать адрес I2C, который пользователь может указать в файле .ino:

// Создадим наш объект AS5048B с адресом I2C 0x40
AMS_AS5048B mysensor(0x40);

но независимо от того, что я установил (например, 0x40, 0x41, 0x42, 0x43, 0x44), сканер Arduino I2C: https://playground.arduino.cc/Main/I2cScanner/

всегда находит 0x44, который является адресом по умолчанию, поэтому адрес программы не должен работать?

EDIT: фактически адрес по умолчанию 0x40. Должно быть, я запрограммировал его на 0x44, не зная об этом (я играл с этой платой, пытаясь во всем этом разобраться).

Я знаю, что обычно адреса I2C не могут быть изменены, но похоже, что это можно: https://ams.com/documents/20143/36005/ AS5048_AN000386_1-00.pdf/3fc346bf-2379-6a45-9adb-1fe5407b8889

Вот фрагмент ссылки выше. Там написано, что биты OTP можно запрограммировать/записать (только один раз!). Насколько я понимаю, адрес I2C сохраняется в битах OTP.

Запрограммируйте биты OTP на постоянной основе:
1. Запишите dec.253 в регистр управления OTP (dec.3), чтобы активировать специальное программирование
режим
2. Установите бит записи (дес. 8) в регистре управления OTP (дес. 3), чтобы включить автоматический
процедура программирования
3. Запишите dec.0 в регистр управления OTP (dec.3), чтобы отключить специальное программирование.
режим

Я использую Teensy 4.1 с PlatformIO в VS Code, а также пытался использовать Arduino Uno в Arduino IDE.

Моя проводка выглядит следующим образом:

проводка

Итак, как мне запрограммировать адрес I2C на платах AS5048B?

ИЗМЕНИТЬ:

  • Я заменил изображение текстом и все почистил.

По просьбе @6v6gt я использовал сканер I2C, и он все еще показывает 0x40 (на этой конкретной плате), поэтому он не должен быть запрограммирован (если только его нельзя запрограммировать на 0x40, хотя 0x40 является значением по умолчанию? ). Единственное, что я изменил в репозитории program_address, — это строку в файле .ino:

// Создадим наш объект AS5048B с адресом I2C 0x40
AMS_AS5048B mysensor(0x48);

Я изменил 0x40 на 0x48. Но теперь я получаю это в последовательном мониторе:

Angle degree : I2C error: 2
359.9780273437

Поскольку я, должно быть, успешно запрограммировал другую плату на 0x44, я пытаюсь вспомнить, что я сделал по-другому, но я не помню.

В файле program_address (а также в файлах .h и .cpp) сотни строк кода, поэтому мне, вероятно, не следует публиковать их все здесь. Но вот репозиторий GitHub: https://github.com/sosandroid/AMS_AS5048B/tree/master/examples/program_address

, 👍4

Обсуждение

Или все это программирование битов OTP предназначено только для производителя, поэтому оно уже сожжено, и я не могу его изменить, то есть мне придется прибегнуть к использованию контактов A1 и A2? Если это так, то будет разрешено только 4 адреса, а мне нужно 6, что означает, что мне понадобится вторая шина I2C (что может сделать Teensy 4.1), но я не знаю, как это сделать, или если библиотека его поддерживает. Мне всего 19 лет и у меня нет большого опыта в этом., @John Doe

Кто бы ни проголосовал за мой ОП, объясните, почему, @John Doe

Я не знаю, почему кто-то понизит вас; Вы задали очень тщательно проработанный вопрос., @romkey

вероятно, для размещения изображений текста, а не размещения текста ... затрудняет чтение поста людьми с нарушениями зрения, @jsotola

Не беспокойтесь о минусах. Я модератор и мои ответы заминусованы! Это идет с территорией. Некоторым нравится делать минусы. :), @Nick Gammon

Мне кажется, что адрес по умолчанию — 0x40 (при условии, что 2 аппаратных контакта не установлены), поэтому я не могу понять, почему вы видите 0x44. Покажите команды, которые вы использовали для помещения старших разрядов желаемого адреса в регистр 0x15. Вы инвертировали MSB, как показано в связанном документе о продукте?, @6v6gt

@ 6v6gt Да, мне кажется, что адрес по умолчанию 0x40. Я думаю, что OP запрограммировал новый адрес I2C 0x44, используя пример., @DrG

@jsotola Я понимаю это, но минус из-за этого без объяснения причин никому не поможет. Я бы предпочел жаловаться на изображения текста, а не голосовать из-за них. Тем не менее, я счастлив отрицать действительно дрянные вопросы., @romkey

Спасибо. Я буду внимательнее вставлять текст вместо изображения, @John Doe

читайте здесь https://arduinoprosto.ru/q/69654/mcp4725-i2c-address/69658#69658, @Juraj

Нет обязанности указывать причину отрицательного голосования, однако это вежливо, если причина не очевидна. Ваш вопрос был очень подробным, именно такой вопрос нам нравится получать. Хорошие вопросы обычно вызывают хорошие ответы. :), @Nick Gammon


2 ответа


Лучший ответ:

4

Адрес I2C ведомого устройства состоит из аппаратной настройки на контактах A1, A2 и старших битов, программируемых пользователем. Я считаю, что это настройка старших битов, в дополнение к A1/A2. ОП после.

Информация, предоставленная @Nick Gammon относительно A1 и A2, верна, но не учитывает остальные 5 бит (старшие разряды). Похоже, что вы действительно можете навсегда установить новый подчиненный адрес I2C на устройстве.

Вам необходимо прочитать примечания по применению программирования очень внимательно, но они объясняют, как записать эти биты в регистр... это кажется простым и на самом деле это всего четыре шага, но я полагаю, что это может быть немного сложно, например, «адрес подчиненного устройства состоит из 5 программируемых битов (MSB) и аппаратной настройки контактов A1 и A2 I²C-адреса <4> по умолчанию не запрограммирован и должен к инверсии, определенной как '1'"

В примечаниях по применению приводится пример 4 шагов....

Возможно, вы уже изменили адрес I2C по умолчанию на 0x44, следуя инструкциям. [отредактировано для добавления] Можете ли вы опубликовать полную программу [код Arduino IDE], которую вы использовали, чтобы попытаться изменить адрес I2C?

,

Хорошо, что они уже перепрограммированы. Я загрузил скетч сканера I2C и подключил новый AS5048B, и он сказал 0x40. Поэтому я попытался запрограммировать 0x41, затем загрузил сканер I2C, и он сказал: «Градус угла: ошибка I2C: 2»., @John Doe

Как я уже упоминал, если вы опубликуете код (предпочитая упомянутый вами код Arduino IDE), я уверен, что мы (если не я, то кто-то еще здесь) сможем понять, что происходит. Скорее всего, вы делаете какие-то непреднамеренные записи в этот регистр и блокируете их или что-то в этом роде., @DrG

Хорошо, я сделаю это, когда вернусь домой сегодня вечером (через 9 часов), @John Doe

@JohnDoe «... Итак, я попытался запрограммировать 0x41». Невозможно настроить устройство на адрес 0x41, если вы также хотите избежать использования адресных контактов A1 и A2. 0x41 можно получить, только оставив устройство с конфигурацией по умолчанию «0x40», но затем подняв A1 на высокий уровень. У вас могут быть следующие адреса I2C без использования A1 и A2: 0x40, 0x44, 0x48, 0x4C, 0x50 и 0x54 и т. д. Сказав это, я бы предпочел оставить четыре устройства как 0x40 (по умолчанию) и изменить два на 0x44, затем используйте A1 и A2., @6v6gt

«Невозможно настроить устройство на адрес 0x41, если вы также хотите избежать использования адресных контактов A1 и A2…» Спасибо! Я этого не знал. Каковы ограничения для этих имен адресов? Могу ли я их просто придумать, например, могу ли я сделать 0x51, даже если вы этого не указали., @John Doe

Используя AS5048B с адресом, который все еще был 0x40, я попытался запрограммировать адрес на 0x48, но последовательный монитор говорит: «Угол в градусах: ошибка I2C: 2». Можно ли запрограммировать его на запись битов OTP в 0x40? Интересно, я сделал это случайно? Хотел бы я, чтобы был простой способ узнать, сгорели ли они уже, @John Doe

Сообщение об ошибке указывает на то, что последующая введенная вами команда не смогла адресовать устройство с его правильным (возможно, измененным предыдущей командой) адресом I2C. Проверьте сканером I2C, какой адрес он показывает (вероятно/надеюсь, все еще 0x40). Пожалуйста, покажите, пожалуйста, последовательность команд, которые вы использовали при попытке изменить адрес на 0x48 (а также команды, использованные в вашей предыдущей, очевидно успешной, попытке изменить адрес другого чипа на 0x44). Добавьте эту информацию в конце вашего ОП., @6v6gt

Спасибо. Я отредактировал свой ОП., @John Doe

Должен признаться, я не очень подробно читал техническое описание, когда отвечал. С их стороны разумно разрешить программировать MSB, потому что это даст вам большой диапазон адресов. Это имеет смысл для этого типа приложений., @Nick Gammon

@JohnDoe Это строка в program_address.ino (из репозитория sosandroid, как в OP), которая изменяет адрес I2C для чипа (при условии, что A1 и A2 имеют низкий уровень) со значения по умолчанию 0x40 на 0x44: mysensor.addressRegW( 0x01); изменение его на mysensor.addressRegW(0x02); может привести к установке адреса нового чипа на 0x48. Код, как представляется, следует за листом данных, чтобы внести внутренние изменения в устройство. Я не могу объяснить, почему вы получили сообщение об ошибке теста «Градус угла». Были ли A1 и A2 низкими (таким образом, новый чип имел адрес по умолчанию 0x40)?, @6v6gt

Спасибо! Это имеет больше смысла. Я попробую это, когда я сделал работу сегодня. Это должно решить эту проблему. Теперь я просто хочу знать, каковы ограничения. Могу ли я установить адресRegW (0x99)? Как изменение addressRegW влияет на адрес?, @John Doe

Хороший! Я успешно запрограммировал его на 0x48. Спасибо! Теперь я просто хотел бы знать ответ на вопрос, который я задал выше. Кроме того, должно ли число быть целым положительным числом?, @John Doe


2

но все они имеют один и тот же адрес I2C

Нет, у них есть 4 возможных адреса, в зависимости от того, как вы настроите A1 и A2. Таким образом, у вас может быть сразу 4 разных адреса.

Но я хочу навсегда изменить адрес I2C для каждой платы.

Для каждой платы настройте A1 и A2 по-разному.

Это дает вам только 4 разных адреса, а не 6. Вы можете предположительно подключить 8 устройств к двум разным чипам Atmega328, чтобы они снимали показания и пересылали результаты с помощью разработанного вами протокола на ваш "основной" адрес ; плата. Чипы Atmega328 стоят всего около 5 долларов каждый, так что это не имеет большого значения.

Другим подходом может быть запуск SDA и SCL через микросхему мультиплексора, чтобы вы включали одну партию из 4 микросхем, а затем другую партию. Не попробовав, трудно сказать, будет ли это работать удовлетворительно.

,