로직 분석기 시험 6: 하드웨어 I2C 및 소프트웨어 I2C

하드웨어 I2C와 소프트웨어 I2C 비교



그 4에서는 하드웨어 SPI와 소프트웨어 SPI의 차이를 보았으므로 I2C에서는 어떻게 될지 시도한다.

사용한 것



평소 같은 로직 애널라이저 , Arduino, ESP32 탑재 M5Stack 및 광 센서 (TLS2561 탑재). Arduino IDE 개발 환경 이용.

소스 코드



하드웨어 I2C


#include <Wire.h>

void setup() [
  Wire.begin();
  .....
}

하드웨어 I2C는 Arduino 및 M5Stack에서 공통.

소프트웨어 I2C(Arduino)


#define SDA_PORT PORTD
#define SDA_PIN 2
#define SCL_PORT PORTD
#define SCL_PIN 3
#include <SoftI2CMaster.h>
#include <SoftWire.h>

SoftWire Wire = SoftWire();

void setup() [
  Wire.begin();
  .....
}

Arduino의 소프트웨어 I2C는 Arduino와 ESP32의 Wire.begin() 차이을 참조하십시오.

소프트웨어 SPI(M5Stack)


void setup() {
  Wire.begin(16, 17);
  ....
}

M5Stack (ESP32)의 소프트웨어 I2C는 Arduino와 ESP32의 Wire.begin() 차이을 참조하십시오.

하드웨어 SPI 및 소프트웨어 SPI의 공통 부분


#include "TLS2561.h"

void writeRegisterValue(int deviceAddress, int address, uint8_t val) {
  Wire.beginTransmission(deviceAddress);  // start transmission to device
  Wire.write(address);                    // send register address
  Wire.write(val);                        // send value to write
  Wire.endTransmission();                 // end transmission
}
uint8_t readRegisterValue(int deviceAddress, int address) {
  uint8_t value;
  Wire.beginTransmission(deviceAddress);
  Wire.write(address);                // register to read
  Wire.endTransmission();
  Wire.requestFrom(deviceAddress, 1); // read a byte
  while (!Wire.available());
  value = Wire.read();
  return value;
}

void setup() {
  // 上述のハードウェアSPIおよびソフトウェアSPIの部分がここに入る。 Wire.begin()など。

  Serial.begin(9600);
  writeRegisterValue(TSL2561_Address, TSL2561_Control, 0x03); // POWER UP
  writeRegisterValue(TSL2561_Address, TSL2561_Timing, 0x00); //No High Gain (1x), integration time of 13ms
  writeRegisterValue(TSL2561_Address, TSL2561_Interrupt, 0x00);
  writeRegisterValue(TSL2561_Address, TSL2561_Control, 0x00); // POWER Down
}

void loop() {
  writeRegisterValue(TSL2561_Address, TSL2561_Control, 0x03); // POWER UP
  delay(14);
  Serial.print("Channel 0 Low value: ");
  Serial.println(readRegisterValue(TSL2561_Address, TSL2561_Channal0L));
  writeRegisterValue(TSL2561_Address, TSL2561_Control, 0x00); // POWER Down
  delay(2000);
}

TLS2561 처리에 대한 자세한 내용은 이전 기사을 참조하십시오. 여기서, 채널 0의 로우 값을 주기적으로 취득한다.

로직 애널라이저로 측정



Arduino



하드웨어 I2C: 460μs


Software I2C: 480μs


M5Stack(ESP32)



하드웨어 I2C: 460μs


Software I2C: 480μs


고찰



차이가 거의 보이지 않는다. 우선 비교만으로, 그 상세 조사는 하고 있지 않다. Wire.setClock()을 사용하여 같은 클럭으로 하면 같을지도 모른다. 언젠가 해 볼지도.

좋은 웹페이지 즐겨찾기