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(녹색)을 사용하기로 했다.


  • AD2 > Digital I/O Signals 0
  • I2C 장치의 SCL에 연결
  • ESP8266의 IO5 (SCL)에 연결

  • AD2 > Digital I/O Signals 1
  • I2C 장치의 SDA에 연결
  • ESP8266의 IO4 (SDA)에 연결


  • WaveForms 설정


  • 왼쪽 메뉴에서 "Logic"을 선택합니다.
  • Logic 1 탭 열기

  • Logic 1 윈도우의 좌측의 「Click to Add channels」를 선택해, I2C를 선택
  • Data: DIO 1
  • Clock: DIO 0
  • 추가 선택

  • SCL 항목의 T (기본값 X)를 클릭하여 "Rising Edge"로 만듭니다.

    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();
      }
    }
    

    이하의 동작이 될 것이었지만, 되지 않았다.
  • 0x0A 보내기
  • 코드 !00 수신

  • 파형



    AD2로 측정한 파형.



    AD2에서 확인한 결과 다음 사항을 깨달았다.
  • 주소가 0xA4인데 0x24입니다

  • 주소 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배 정도는 활약하고 있다고 생각한다.

    좋은 웹페이지 즐겨찾기