Отключение внутренних подтягивающих резисторов i2c

Как это сделать? Я покопался и вижу, что мне следует сделать это и поставить собственные внешние подтягивающие резисторы, но я не знаю, как их отключить. На страницах, которые я читал, нигде не указано, как это сделать.

Я пытаюсь включить I2C между leonardo и uno, но мне кажется, что шина i2c значительно замедляется из-за внутренних подтягивающих резисторов. Я хочу перейти на два резистора 4,7 кОм, но не могу понять, как отключить внутренние. Я знаю, что библиотека Wire включает внутренние резисторы по умолчанию, но как мне отредактировать библиотеку или отключить подтягивающие резисторы в моем скетче?

Возможно, я просто не читал нужные форумы или статьи, но если кто-то мог бы указать мне правильное направление, я был бы очень признателен.

EDIT: Так что проблема, вероятно, в моей настройке или коде, я запишу это здесь. Все, что у меня есть до настройки, это импорт библиотек и переменных, таких как мой mac, ip, заполнители для вывода, pwm и т. д.

Мастер:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  while(!Serial){
  }

  Wire.begin();

  Ethernet.begin(mac, ip);
  delay(1000);

  server.begin();
  if(server.available()){
    Serial.println("Client Available");
  }
}

void loop() {
  // put your main code here, to run repeatedly:

  ethernetwrite();

}

void ethernetwrite() {      
  EthernetClient client = server.available();
  while(client) {
    if(client.find("P")) {
      output = client.parseInt();
      pwm = client.parseInt();

      Serial.println("Begin Transmitting");
      Wire.beginTransmission(14);
      Wire.write(output);
      Wire.write('\t');
      Wire.write(pwm);
      Wire.endTransmission();
      Serial.println("Done Transmitting");

      Serial.print(output);
      Serial.print('\t');
      Serial.println(pwm);

    }
  }
}

Раб:

void setup() {
  Wire.begin(14);
  Wire.onReceive(wirewrite);

// *   - Base frequencies:
// *      o The base frequency for pins 3, 9, 10, and 11 is 31250 Hz.
// *      o The base frequency for pins 5 and 6 is 62500 Hz.
// *   - Divisors:
// *      o The divisors available on pins 5, 6, 9 and 10 are: 1, 8, 64,
// *        256, and 1024.
// *      o The divisors available p1on pins 3 and 11 are: 1, 8, 32, 64,
// *        128, 256, and 1024.

    // Leg 1
    pinMode(leg[1], OUTPUT); setPwmFrequency(leg[1],8); analogWrite(leg[1], offset);

    // Leg 2 
    pinMode(leg[2], OUTPUT); setPwmFrequency(leg[2],8); analogWrite(leg[2], offset);

    // Leg 3
    pinMode(leg[3], OUTPUT); setPwmFrequency(leg[3],8); analogWrite(leg[3], offset);

    // Leg 4
    pinMode(leg[4], OUTPUT); setPwmFrequency(leg[4],8); analogWrite(leg[4], offset);

    // Mirror
    pinMode(leg[0], OUTPUT); setPwmFrequency(leg[0],clkdivisor); analogWrite(leg[0], 255);
}

void loop() {


    int time = 10;
    time = time*128/clkdivisor;

    // box(time, 255, 1); // box(delay time, radius pwm, pwm step size);
    // autodisplay(); 
    updateL();

}



void updateL(){
  if (output == 0) pwm = 255 - pwm;
  switch (output) {
    case 1: pin =  3; break;
    case 2: pin =  9; break;
    case 3: pin =  10; break;
    case 4: pin =  11; break;
    case 0: pin = 5; break;
  }
  //if (output < 5) {
    analogWrite(pin, pwm);
  //}
}

void wirewrite(int numBytes) {
  String message;
  while(Wire.available()>0) {
    char c = Wire.read();
    message.concat(c);
  }
  output = Wire.parseInt();
  pwm = Wire.parseInt();
}

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

EDIT: Я также отправляю сообщение, которое выглядит так: "П1 103" каждые 0,4 секунды или около того, но обычно я не могу пройти дальше первой передачи между ардуинами

, 👍2


1 ответ


4

Из технического описания:

Обратите внимание, что внутренние подтягивающие резисторы в контактных площадках AVR можно включить, установив биты PORT, соответствующие контактам SCL и SDA, как описано в разделе «Порт ввода-вывода».

Чтобы отключить внутренние подтягивания:

digitalWrite(A4, LOW);
digitalWrite(A5, LOW);

или

digitalWrite(2, LOW);
digitalWrite(3, LOW);
,