I2C Wire вопрос о задании адреса устройства (7 или 8 бит слово)

Добрый день.
Видимо, во мне умер капитан Очевидность. Чем больше читаю обсуждение и скетчи и нифига не понимаю. Суть проблемы в следующем: есть даташит микросхемы - в данном случае - тюнер SN761642.


Как видно на этой вырезке, адрес 0xC0 - W, 0xC1 - R. Однако во всех опубликованный скетчах происходит обращение к микросхеме по адресу 0x61. Понимаю, что при передаче 7 бит в библиотеке реальный адрес сдвигается вправо и из 0xC0 мы получаем 0x60. В случае 7битного адреса теряется последний бит, который не дает нам возможность переключать режимы читать/писать. Подскажите болезному, как так?

Кто не дает? Код работает или нет? Где код? Где библиотека? Где схема? Ты реально болезный, блин.

Повторяю для раздраженных. Название библиотеки в заголовке запроса. Меня интересует абсолютно локальный вопрос, связанный с передачей адреса в тюнер. Схема тут причем? И скетчи тоже. Однако я уже нашел ответ за сегодня. Отличаются библиотеки. В Wire действительно передаются 7 бит. В другой библиотеке 8.
Так выглядит передача адреса в тюнер через Wire:
void SNTVtuner(uint16_t RF,uint8_t OSCI)
{
uint16_t fpd =0;
Wire.beginTransmission(0x60);

А так в другой библиотеке:
I2CStart();
I2COutByte(0b11000000); // Tuner Address
Такие дела, болезный.

в разных библиотеках разных микроконтроллеров по разному, к приме для ESP32

           void beginTransmission(uint16_t address);
    void beginTransmission(uint8_t address);
    void beginTransmission(int address);

Какая разница, что передается в библиотеке?
Физически передаются адрес в старших 7 разрядах, а в младшем разряде признак R/W. И это от библиотеки не зависит.

B1100.0001 = 0xC1 - адрес для чтения - 8 бит отправка - как в даташите, см. в запросе.
B0110.0000 = 0x60 - адрес для записи - 7 бит отправка
Как нет разницы?
Регистр адреса 8 битный, мы заполняем его 7 битным значением, начиная со старшего бита. Как изменить значение младшего бита адреса?

Зачем его менять?

Могу предположить, что к одной шине можно подключить до 4 разных устройств, у каждого из которых будет свой адрес. Этот адрес выбирается подключением соответствующих ног микросхемы к низкому или высокому уровню.

Схему опубликуйте.

Адрес в даташите указан с учётом R/W-бита. В скетчах пишется адрес без этого бита, функция библиотеки сама подставляет RW-бит в адрес.

Штука вот в чем: сканер устройств i2c (есть такой), возвращает адрес 0x61. Действительно, при указании этого адреса при записи, микросхема возвращает некое число, не ошибку, если же попытаться записать в 0x60 - ошибка. Получается, что ваше предложение не работает, ибо - запись - это 0. а чтение - 1. Короче. пока не разобрался.

а если же попытаться записать в 0x61?

Запись проходит. Возвращается число, которое никак не соответствует даташиту. Чешу репу. В понедельник буду писать цикл, чтобы физически прослушать эфир. Не забываем, что этот чип - тюнер.

Ты же не напрямую в i2c пихаешь адрес, а через библиотеку. Через неё читать и писать надо один и тот же адрес. Прочитай status byte. Там заранее известно состояние.

Кусок кода в студию.
И что с пином AS ?

AS - это прошлый век, в частности, тюнер Филипс, который требует 33в питания для варикапа. Я называл чип из тюнера. Все отсылки к этому даташиту.

Согласно даташиту на SN761642, пин AS определяет биты 1 и 2 адреса. Так что я бы посмотрел. А алгоритм чтения/записи согласно даташиту? Время на инициализацию тюнера учтено? Может он тупо не успевает включиться, а МК уже требует обмена.

В тюнере 22 нога микросхемы куда-то ведет, но наружу не выходит. В крайнем случае я могу посмотреть состояние пина чуть позже (в предыдущих версиях тюнеров рекомендуют AS float, он нужен для включения дополнительных устройств). Буду сегодня пытаться запустить шарманку.

Привет всем! Пока забороть проблему не удалось. Ищу компетентных людей здесь. Может, у них получится. Отпишусь позже о результатах.

Спойлер

Таблица 3. Вот и глянь чего там на пине. Всего 4 диапазона напряжений.

Да, верно. Ставил туда потенциометр. Возвращаемое число менялось от 56 до 60. Младшие части байта состояния менялись в зависимости от напряжения на этой ноге. Не помогло. Чуть позже выложу скетч.

код вставь нормально

#include <Arduino.h>
#include <Wire.h>

uint32_t  RF = 86000;
uint8_t OSCI =1;
uint8_t lockFlag =0;
void SNTVtuner(uint32_t RF,uint8_t OSCI)
{

  
  
  uint16_t fpd =0;
  fpd = RF / 24 + 1620;
  Wire.beginTransmission(0x61);

  Serial.print ("Частота:");
  Serial.print(RF,DEC);
  //Serial.print();
  Serial.print("; PLL: ");
  Serial.print(fpd, BIN);
  Serial.print("; ");
  Serial.print(fpd >> 8,HEX);
  
  Serial.print(" -DB1 --- ");
  Serial.print(fpd & 0xFF,HEX );
  Serial.print(" -DB2 LockFlag: ");
  
  
  Wire.write(fpd >> 8); //DB1
  Wire.write(fpd & 0xFF); //DB2


  Wire.write(0xC0); //CB
  Wire.write(0x11); //BB
  Wire.endTransmission();
//delay(10);
  Wire.requestFrom(0x61,1); //in-lock flag (FL = 1 when the loop is phase-locked)
  while (Wire.available())
  {
    lockFlag = Wire.read();
    Serial.print(lockFlag,BIN);
    Serial.print("\n");
  }
}



void setup()
{
Wire.begin();
Serial.begin(9600);
//SNTVtuner(RF,1);
delay(2200);
//Volume();
}
void loop() 
{
// put your main code here, to run repeatedly:
SNTVtuner(RF,1);
RF=RF+100;
delay(2200);

}

1 лайк