Беспорядок с потенциометром I2C

Для проекта я купил несколько двойных 8-битных I2C-потенциалов MCP4651. Просмотрев библиотеки Arduino и ничего не найдя, я подумал: «Ничего страшного»… Я уже написал библиотеки I2C для других частей, которые были гораздо более сложными! (например: 24-битный АЦП ADS1219)! так что просто загрузите таблицу данных и посмотрите карты памяти и команды! ок, на странице 49 есть кое-что, что кажется полезным! о боже, я когда-нибудь ошибался! этот паспорт выглядит как кошмар! худшая документация для любого устройства I2C, которое я когда-либо видел. Команды, которые я написал на основе этого, абсолютно ничего не сделали!

В одном из примеров Arduino я нашел примерно такой код для управления I2C-потенциалом:

#include <Wire.h>

void setup() {
  Wire.begin(); // подключаемся к шине i2c (адрес для ведущего необязателен)
}

byte val = 0;

void loop() {
  Wire.beginTransmission(44); // передаем на устройство №44 (0x2c)
  // адрес устройства указан в даташите
  Wire.write(byte(0x00));            // отправляет байт инструкции
  Wire.write(val);             // отправляет байт значения потенциометра
  Wire.endTransmission();     // прекращаем передачу

  val++;        // увеличиваем значение
  if (val == 64) { // если достигнут 64-я позиция (макс.)
    val = 0;    // начинаем заново с наименьшего значения
  }
  delay(500);
}

Я решил просто попробовать и посмотреть, что произойдет (изменил адрес на правильное значение), и, как ни странно, это действительно сработало! поэтому я взломал этот фрагмент кода, чтобы заставить работать первый горшок!

void setPot0(int n){
  if (n>256) n=256;
  if (n<0) n=0;
  Wire.beginTransmission(address);
  if (n<256){
    Wire.write(0x00);
    Wire.write(n);
  } else{
    Wire.write(0x01);
    Wire.write(0);
  }
  Wire.endTransmission();
}

и каким-то образом это работает! Я до сих пор не могу найти этот шаблон ни на одной из страниц таблицы данных, но эй! это работает, так что я не буду на это жаловаться? Мне до сих пор не удалось заставить работать pot1, только pot0... если вы понимаете, как должны выглядеть команды и байты данных, пожалуйста, помогите мне. В таблицах данных TI это гораздо более понятно; вы просто используете команду для записи в нужный регистр, и они подробно описывают, что делает каждый регистр:

Изменить: вот ссылка на таблицу данных: http://ww1.microchip.com/downloads /en/DeviceDoc/22096b.pdf

, 👍0

Обсуждение

какой у тебя вопрос? ....единственный вопрос в вашем посте - это вопрос о жалобах, @jsotola

мой вопрос в том, как мне следует отправлять команды I2C для использования горшка. как я уже упоминал, код, который я написал, работает, но не соответствует шаблонам адресов и данных I2C, которые они упомянули в своих технических характеристиках. Я не уверен, какими должны быть управляющие байты и что такое общий вызов и обычный вызов? они просто говорят, что общие коллы могут изменить несколько банков (если они есть)?, @OM222O

«Общий вызов» и «обычный вызов» на самом деле являются частью спецификации I2C и связаны с адресацией одного или нескольких устройств I2C., @jsotola

Содержит ли глава 4 таблицы данных *не* всю необходимую информацию? Включая подробности о ТРЕХ регистрах (да, всего ТРЕХ) для управления устройством?, @Majenko

«Я до сих пор не могу найти этот шаблон ни на одной из страниц таблицы данных». Даже в главе 4, таблице 4-1, где перечислены регистры? Регистр 0 — это банк 0, а регистр 1 — это банк 1. Ясно сказано., @Majenko


1 ответ


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

3

Регистры перечислены в таблице 4-1. Это достаточно ясно.

Формат командного байта показан в главе 6. Этот командный байт включает в себя операцию и номер регистра, а также старшие биты для регистров, которые ожидают более 8 бит данных.

Для установки регистра необходимы два байта. Первые 4 бита — это номер регистра (0000 для Wiper 0, 0001 для Wiper 1 и 0100 для регистра TCON). Следующие два бита представляют собой операцию, показанную на рисунке 7-1. 00 для простой записи. Следующие два бита — это два старших бита данных. Далее идут младшие 8 бит данных.

Итак, чтобы записать значение 0x23 для банка 0, вы должны написать:

0x00 0x23

Чтобы записать значение 0x65 для банка 1, вы должны написать:

0x10 0x65

Чтобы записать значение 0x13D для горшка 1, вы должны написать:

0x11 0x3D

Вы можете создать более простую функцию, чтобы обернуть ее:

void writePot(uint8_t address, uint8_t pot, uint16_t val) {
    Wire.beginTransmission(address);
    Wire.write((pot & 3) << 4 | ((val >> 8) & 3));
    Wire.write(val & 0xFF);
    Wire.endTransmission();
}
,