AD2> I2C 로직을 보았다 | 주소 0xA4의 함정
ESP8266 (気圧計で使用したユニバーサル基板. I2Cは4.7kでプルアップ)
Analog Discovery 2 (以下AD2)
WaveForms 2015 on Windows 8.1 pro(64bit)
에필로그
6:30 7of9
"지난 주에 도착한 모 I2C 디바이스를 바삭하게 움직이자. I2C는 몇 가지 왔기 때문에, 더 이상 아침반 앞( a peace of cake )이다"
9:30의 7of9 (아침밥은 물론 먹고 끝났다)
"UART에서의 동작은 확인했다. 배선도 올바른 것 같다. I2C의 주소는 취설에 따라 0xA4로 하고 있다. 무엇이 문제인가..."
그리고 Analog Discovery 2를 사용하기로 했다.
AD2에서 I2C 로직 측정
배선
AD2의 케이스 밑바닥에 다음과 같은 배선의 설명도가 있다.
이번에는 'Digital I/O Signals'의 0(핑크색)과 1(녹색)을 사용하기로 했다.
WaveForms 설정
Run 버튼 또는 Single 버튼으로 I2C의 파형을 볼 수 있다.
파형을 확정하고 싶기 때문에 Signle 버튼을 사용했다.
코드 v0.1
취설을 참조하여, 이하의 ESP8266용 코드로 해 보았다.
esp8266_160730_MSC-MOD20p1.ino
#include <Wire.h>
#define DEVICE_ADDRESS (0xA4)
void setup() {
Serial.begin(115200);
Serial.println("");
Wire.begin();
Wire.setClock(100000L); // 100kHz
}
void loop() {
helloWorld();
delay(3000); // msec
}
void readData() {
Wire.requestFrom(DEVICE_ADDRESS, /* length= */1);
char code = Wire.read();
delayMicroseconds(30);
Serial.println(code);
}
void helloWorld()
{
Wire.beginTransmission(DEVICE_ADDRESS);
Wire.write(0x0A);
Wire.endTransmission();
delayMicroseconds(30);
for(int loop=0; loop<3; loop++) {
readData();
}
}
이하의 동작이 될 것이었지만, 되지 않았다.
파형
AD2로 측정한 파형.
AD2에서 확인한 결과 다음 사항을 깨달았다.
주소 0xA4 문제
I2C 통신을 할 때 7비트 어드레스를 지정한다.
취설에 「어드레스 0xA4」라고 쓰여 있다고 한다.
「7비트의 0xA4 어드레스」라고 하는 것은 있을 수 없다고 깨달았다.
0xA4는
0b 1010 0100
이므로 8 비트가 필요합니다.아마, 「Read/Write 비트를 더해 8 비트로 한 뒤의 0xA4」라고 하는 것이 맞을 것이다, 라고 생각했다.
code v0.2 > 주소 지정 변경
code
#define DEVICE_ADDRESS (0xA4 >> 1)
7 비트의 주소 값으로 설정했습니다.esp8266_160730_MSC-MOD20p1.ino
#include <Wire.h>
#define DEVICE_ADDRESS (0xA4 >> 1)
void setup() {
Serial.begin(115200);
Serial.println("");
Wire.begin();
Wire.setClock(100000L); // 100kHz
}
void loop() {
helloWorld();
delay(3000); // msec
}
void readData() {
Wire.requestFrom(DEVICE_ADDRESS, /* length= */1);
char code = Wire.read();
delayMicroseconds(30);
Serial.println(code);
}
void helloWorld()
{
Wire.beginTransmission(DEVICE_ADDRESS);
Wire.write(0x0A);
Wire.endTransmission();
delayMicroseconds(30);
for(int loop=0; loop<3; loop++) {
readData();
}
}
결과
I2C 통신이 가능하게 되었다.
직렬 출력
G
H
I
E
l
e
c
t
r
o
n
i
c
s
,
L
L
C
-
-
-
-
-
-
-
-
-
-
-
-
AD2가 없으면 위에서 하루를 부수고 있었을지도 모른다.
지금까지 AD2의 정가의 3배 정도는 활약하고 있다고 생각한다.
Reference
이 문제에 관하여(AD2> I2C 로직을 보았다 | 주소 0xA4의 함정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/1c40de42ab2647918140텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)