В чем разница между serial begin() и wire.setClock() для связи I2C?

i2c

Я новый пользователь Arduino IDE и у меня есть простой вопрос ниже

Для настройки скорости передачи данных I2C существуют функции serial begin() и wire.setClock(). Некоторые примеры кодов просто используют Serial.begin() без Wire.seClock(), некоторые используют и то, и другое, как показано ниже. Каковы реальные различия между ними? Когда использовать только серийный и когда использовать оба из них? Спасибо.

void setup() {
  Serial.begin(9600);          // start serial communication at 9600bps

  Wire.begin();                // join i2c bus (адрес необязательный для master)

  Wire.setClock(400000); //Увеличение тактовой частоты I2C до 400 кГц
}

, 👍2


3 ответа


3

Серийный номер не имеет ничего общего с проводом/I2C-связью. В примерах есть только это, потому что в основном они используют последовательный выход и вход для взаимодействия в примерах кодов (например, отображение данных датчика I2C на последовательном мониторе).

Если вы не хотите использовать последовательную связь Montior/Serial, то вы можете оставить все вызовы Serial out.

,

1

Serial.begin запускает связь на выводах USB или RX/TX. Это не имеет ничего общего с проводной библиотекой и коммуникацией I2C.

Тактовая частота I2C определяет скорость передачи данных по шине I2C. Wire.begin() среди других настроек устанавливает тактовую частоту I2C на некоторое значение по умолчанию.

Wire.setClock() позволяет установить другую тактовую частоту. Это должно поддерживаться всеми устройствами на шине I2C или тактовая частота может быть изменена перед связью с конкретным устройством на шине.

Wire.setClock должен быть вызван после Wire.begin, потому что Wire.begin устанавливает тактовую частоту по умолчанию.

,

1

Спасибо за ответы, однако, я все еще в замешательстве, так как некоторые примеры кодов, включенных в Arduino IDE, не имеют wire.setClock (), как это может работать для связи I2C.

например: I2C SRF10 или SRF08 Devantech Ультразвуковой дальномер

#include <Wire.h>

void setup() {

Wire.begin(); // join i2c bus (адрес необязательный для master)

Serial.begin(9600); // start serial communication at 9600bps }

int reading = 0;

void loop() {

// шаг 1: проинструктируйте датчик считывать эхо

Wire.beginTransmission(112); // transmission to device #112 (0x70)

// адрес, указанный в справочнике, - 224 (0xE0)

// но адресация i2c использует высокие 7 бит, поэтому это 112

Wire.write(байт(0x00)); // устанавливает указатель регистра на регистр команд (0x00)

Wire.write(byte(0x50)); // команда датчика для измерения в "дюймах" (0x50)

// используйте 0x51 для сантиметров // используйте 0x52 для пинга микросекунд

Wire.endTransmission(); // остановить передачу

// шаг 2: дождитесь задержки показаний(70); // спецификация предполагает не менее 65 миллисекунд

// шаг 3: проинструктируйте датчик возвращать определенное эхо-считывание

Wire.beginTransmission(112); // передача на устройство № 112

Wire.write(байт(0x02)); // устанавливает указатель на регистр echo #1 register (0x02)

Wire.endTransmission(); // остановить передачу

// шаг 4: запрос считывания с датчика

Wire.requestFrom(112, 2); // запрос 2 байта от ведомого устройства #112

// шаг 5: получение показаний от датчика

if (2 <= Wire.available()) { // если было получено два байта

reading = Wire.read();  // получить старший байт (перезаписывает предыдущее чтение)

reading = reading << 8;    // shift high byte to be high 8 bits

чтение |= Wire.read(); // receive low byte as lower 8 bits

Serial.println(reading);   // печать чтения

}

delay(250); // подождите немного, так как люди должны прочитать вывод :) }

,