снифер i2c или типо того

xhimik
Offline
Зарегистрирован: 17.09.2015

Я новичек, совсем совсем зеленый.. не пинайте больно)

нарыл тут http://www.johngineer.com/blog/?p=455

// assign pin values here
const char sda_pin = 3;
const char scl_pin = 4;
// sampling window
const int data_size = 1700;

// array to contain sampled data
byte captured_data[data_size];

// housekeeping booleans
boolean captured;
boolean dumped;

void setup()
  {
    Serial.begin(115200);
    pinMode(sda_pin, INPUT);
    pinMode(scl_pin, INPUT);
    captured = false;
    dumped = false;
    Serial.println("Good to go, chief!");
  }

// main loop: waits for SDA to go low, then
// samples the data, then formats and dumps it
// to the serial port.
void loop()
  {
    while(digitalRead(sda_pin)==HIGH) {}
    capture();
    if (captured == true && dumped == false)
      {
        serial_dump();
        dumped = true;
      }
  }

// captures the data on PORTD and stores it in a global array
void capture()
  {
    byte tempdata;
    for (int x = 0; x < data_size; x++)
      {
        tempdata = PIND;
        captured_data[x] = tempdata;
      }
    captured = true;
  }

// reads the data out of the global array, formats it
// and outputs it to the serial port.
void serial_dump()
  {
    byte temp;
    Serial.println("sample, sda, sck");
    for(int x = 0; x < data_size; x++)
    {
      if (x<10) { Serial.print("0"); }
      if (x<100) { Serial.print("0"); }
      Serial.print(x);
      Serial.print(",     ");
      temp = bitRead(captured_data[x], sda_pin);
      if (temp == 0) { Serial.print(0); }
      else { Serial.print(1); }
      Serial.print(",   ");
      temp = bitRead(captured_data[x], scl_pin);
      if (temp == 0) { Serial.println(0); }
      else { Serial.println(1); }
    }
  }

но у меня с ним явно чет не то, ответ явно не влазиет в 1000+ строк.. в чем проблема?

мой модуль arduino pro mini 5v 16Mhz

поможите?

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Если не работает - то в первую очередь надо смотреть правильность подключения к i2c шине, наличие резисторов подтяжки, землю и т.д. Кстати, там в оригинальном листинге - не стандартные пины SDA и SCL. Возможно, что на аппаратном i2c и не должно работать...

xhimik
Offline
Зарегистрирован: 17.09.2015

Наверное я не правилно выразился..

Не то чтоьы не работает... работает но ощющение что за время работы бэкапа, происходит слишко быстый общет пинов ..

Т.е. в логе у меня в среднем по 50-60 нулей или едениц,  пример

Good to go, chief!
sample, sda, sck
000,     0,   1
001,     0,   1
002,     0,   1
003,     0,   1
004,     0,   1
005,     0,   1
006,     0,   1
.............
............
048,     0,   1
049,     0,   1
050,     0,   1
051,     0,   1
052,     0,   0
053,     0,   0
054,     0,   0
055,     0,   0
056,     0,   0
-----------
------------

109,     0,   0
110,     0,   0
111,     0,   0
112,     1,   0
113,     1,   0
114,     1,   0
115,     1,   0
ну и т.д.

проц mega328p / мониторю CD2312 (аналог tda7312 если ни че не путаю https://yadi.sk/i/vkDbtUrtj8Xbc)

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

xhimik пишет:
Не то чтоьы не работает... работает но ощющение что за время работы бэкапа, происходит слишко быстый общет пинов ..

По протоколу - не подскажу, но я бы положил эти столбцы "на бок" и попытался нарисовать график изменения уровня сигналов на SDA и SCL - они там у Вас будут разной длительности (в соответствии с пачками нулей и единиц).

xhimik
Offline
Зарегистрирован: 17.09.2015

Все это так.. только невлазиет  в память ,даже одна команда протокола.. Что толку рисовать график для 3х пачек цифр?..

Как мне поставить небольшую задежку на общет пинов? Вот собственно в чем вопрос..

Или как раширить память, чтоб залазило ))) хотя я полагаю, что с этим будут проблемы..

const int data_size = 1700;

После изменения >1700 ардуинка просто виснит..

void capture()
  {
    byte tempdata;
    for (int x = 0; x < data_size; x++)
      {
        tempdata = PIND;
        captured_data[x] = tempdata; delay(1);
      }
    captured = true;
  }

А delay(1); слишком "урезает" лог.. еще способы есть? Просто я чегото не догоняю...

Good to go, chief!
sample, sda, sck
000,     0,   1
001,     0,   1
002,     0,   1
003,     0,   0
004,     0,   0
005,     0,   1
006,     1,   1
007,     0,   1
008,     1,   1
009,     1,   1
010,     1,   1
011,     1,   1
012,     1,   1
013,     1,   1
014,     1,   1
015,     1,   1
016,     1,   1
017,     1,   1
И т.д.

Т.е. комананда получилась "обрезанной", как еще поставить задержу раз delay(1); -это много..

Может "нагрузить" ардуинку бесполезным циклом, чтоб не надолго задумывалась?

xhimik
Offline
Зарегистрирован: 17.09.2015

нашел ! ))

 captured_data[x] = tempdata; delayMicroseconds(5);

Спасибо!
 

xhimik
Offline
Зарегистрирован: 17.09.2015

Поигрался я с этой программкой, и понял насколько жадна человеческая сущность )) Не хватает мне этого.. По графику лиш видно пачки, расшифровать их это та еще затея.. Нее я конечно заказал логический анализатор типа USBee, но когда он еще с китая приплывет.. А по тому тните носом в эти, как их sketch чтоли.. Там где исползуется программная I2C.. Хочу чтоб мне терминал сразу полностью команду выдавал )))