로직 분석기 시험 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()을 사용하여 같은 클럭으로 하면 같을지도 모른다. 언젠가 해 볼지도.
Reference
이 문제에 관하여(로직 분석기 시험 6: 하드웨어 I2C 및 소프트웨어 I2C), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/infinite1oop/items/61a66500a98406923c66
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <Wire.h>
void setup() [
Wire.begin();
.....
}
#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();
.....
}
void setup() {
Wire.begin(16, 17);
....
}
#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);
}
Reference
이 문제에 관하여(로직 분석기 시험 6: 하드웨어 I2C 및 소프트웨어 I2C), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/infinite1oop/items/61a66500a98406923c66텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)