ESP8266> I2C 통신 실패> SCL이 더 이상 사용되지 않음> 풀업 저항을 풀업하지 않았습니다.

17687 단어 AD2#migratedI2CESP8266
운영 환경
Analog Discovery 2 (以下AD2)

h tp : // 쿠이타. m / 7 / f9 / ms / 09272 fcb56bd479c679
에서 실장한 기압계 기판.

통신이 계속되면 어느 시점부터 통신이 실패합니다.

AD2로 통신을 체크해 보았다.

code



ぃ tp // m / 7 / f9 / ms / 09272 fcfb56bd479c679 # 코데 v02
사용.
#include <Wire.h>

/*
 * v0.2 2016 May 29
 *   - fix bug > coefficients calculation
 * v0.1 2016 May 28
 *   - add PrintPressure()
 *   - add ReadPressureAndTemperature()
 *   - add ReadCoefficient()
 */

#define MPL_ADDR (0x60)

static float s_a0, s_b1, s_b2, s_c12; // 係数データ
unsigned long iPress, iTemp;

void setup() {
  Serial.begin(115200);
  Serial.println("");

  Wire.begin();
  delay(3000); // msec
  ReadCoefficient();
}

bool ReadCoefficient()
{
  int len;
  unsigned int hi, lw;

  Wire.beginTransmission(MPL_ADDR);
  Wire.write(0x04);
  len = Wire.endTransmission();
  if (len == 0) {
    len = Wire.requestFrom(MPL_ADDR, 8);
    if (len == 8) {
      hi = Wire.read();
      lw = Wire.read();
      s_a0 = (hi << 8) + lw;
      s_a0 /= 8.0;
      if (hi & 0x80) s_a0 -= 8192.0;
      hi = Wire.read();
      lw = Wire.read();
      s_b1 = (hi << 8) + lw;
      s_b1 /= 8192.0;
      if (hi & 0x80) s_b1 -= 8.0;
      hi = Wire.read();
      lw = Wire.read();
      s_b2 = (hi << 8) + lw;
      s_b2 /= 16384.0;
      if (hi & 0x80) s_b2 -= 4.0;
      hi = Wire.read();
      lw = Wire.read();
      s_c12 = (hi << 8) + lw;
      s_c12 /= 32768.0;
      if (hi & 0x80) s_c12 -= 2.0;
      s_c12 /= 512.0;

      Serial.println(s_a0);
      Serial.println(s_b1);
      Serial.println(s_b2);
      Serial.println(s_c12);      
      return true;
    }
  }
  return false;
}

bool ReadPressureAndTemperature()
{
  int len;
  unsigned int hi, lw;

  // 1. start conversion
  Wire.beginTransmission(MPL_ADDR);
  Wire.write(0x12);
  Wire.write(0x01);
  len = Wire.endTransmission();
  if (len != 0) return false;
  delay(3); // msec

  // 2. get values
  Wire.beginTransmission(MPL_ADDR);
  Wire.write(0x00);
  len = Wire.endTransmission();
  if (len == 0) {
    len = Wire.requestFrom(MPL_ADDR, 4);
    if (len == 4) {
      hi = Wire.read();
      lw = Wire.read();
      iPress = (hi * 256 + lw) / 64;
      hi = Wire.read();
      lw = Wire.read();
      iTemp = ( hi * 256 + lw) / 64;
      return true;      
    }
  }
  return false;
}

void PrintPressure()
{
  float prs, f0;
  f0 = s_a0 + ( s_b1 + s_c12 * iTemp) * iPress + s_b2 * iTemp;
  prs = f0 * ( (115.0 - 50.0) / 1023.0 ) + 50.0;
  Serial.print("Pressure=");
  Serial.println(prs);
}

void loop() {
  if (ReadPressureAndTemperature()) {
    PrintPressure();
  }
  delay(1000); // msec
}

측정



SCL 라인(정상시)



SCL이 H/L 전환되고 있다.



SCL 라인(실패 시)



SCL이 H로 남아 있습니다.



SCL이 전환되지 않게 되는 원인은 요조사.

브레드보드 실장했을 때에 기압계의 IC를 한번 반대로 꽂아 통전해 버렸는데, 그것과 관계가 있는 것일까.
도중까지 통신할 수 있어 도중부터 통신할 수 없게 된다는 현상은 지금까지 미경험이다.

관련이 있는지 여부 h tp : / / s tac ゔ ぇ rf ぉ w. 코 m / 쿠에 s 치온 s / 17287232 / 아 루즈 이노 2c

브레드보드 구현



브레드 보드에서의 구현을 재개했다.
풀업 저항도 브레드보드측으로 하기 위해 3번째 유니버설 기판을 유용했다.



AD2로 SCL 라인을 측정한 곳, 깨끗한 파형이 되고 있다. 평탄 부분도 제대로 나와 있다.



사용하고 있는 풀업 저항(4.7k for SCL, SDA)과 CAP용 콘덴서(105)는 각각 같은 값을 이번 브레드보드와 유니버설 기판에서도 사용하고 있을 생각이지만, 뭔가 간과하고 있는 사항이 있다 의지도 모른다.

유니버설 기판으로 통신이 실패하고 있을 때는 30회 정도밖에 통신할 수 없었지만, 이번에는 600회의 통신에서도 에러가 나오지 않는다.

다시 한번 통신이 실패하는 범용 기판을 재검토해 깨달은 것은 , 풀업 저항을 Vcc로 풀업하지 않았다.

다시, 범용 기판



풀업하지 않은 저항(시리즈에 들어있었던)을 Vcc 풀업하도록 변경했다.

다음과 같이 깔끔한 파형이 되었다. 통신도 중단되지 않는다.



@forth83
시끄 럽습니다.
고마워요.

좋은 웹페이지 즐겨찾기