снифер i2c или типо того
- Войдите на сайт для отправки комментариев
Чт, 17/09/2015 - 19:53
Я новичек, совсем совсем зеленый.. не пинайте больно)
нарыл тут 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
поможите?
Если не работает - то в первую очередь надо смотреть правильность подключения к i2c шине, наличие резисторов подтяжки, землю и т.д. Кстати, там в оригинальном листинге - не стандартные пины SDA и SCL. Возможно, что на аппаратном i2c и не должно работать...
Наверное я не правилно выразился..
Не то чтоьы не работает... работает но ощющение что за время работы бэкапа, происходит слишко быстый общет пинов ..
Т.е. в логе у меня в среднем по 50-60 нулей или едениц, пример
проц mega328p / мониторю CD2312 (аналог tda7312 если ни че не путаю https://yadi.sk/i/vkDbtUrtj8Xbc)
По протоколу - не подскажу, но я бы положил эти столбцы "на бок" и попытался нарисовать график изменения уровня сигналов на SDA и SCL - они там у Вас будут разной длительности (в соответствии с пачками нулей и единиц).
Все это так.. только невлазиет в память ,даже одна команда протокола.. Что толку рисовать график для 3х пачек цифр?..
Как мне поставить небольшую задежку на общет пинов? Вот собственно в чем вопрос..
Или как раширить память, чтоб залазило ))) хотя я полагаю, что с этим будут проблемы..
После изменения >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); слишком "урезает" лог.. еще способы есть? Просто я чегото не догоняю...
Т.е. комананда получилась "обрезанной", как еще поставить задержу раз delay(1); -это много..
Может "нагрузить" ардуинку бесполезным циклом, чтоб не надолго задумывалась?
нашел ! ))
captured_data[x] = tempdata; delayMicroseconds(5);
Спасибо!
Поигрался я с этой программкой, и понял насколько жадна человеческая сущность )) Не хватает мне этого.. По графику лиш видно пачки, расшифровать их это та еще затея.. Нее я конечно заказал логический анализатор типа USBee, но когда он еще с китая приплывет.. А по тому тните носом в эти, как их sketch чтоли.. Там где исползуется программная I2C.. Хочу чтоб мне терминал сразу полностью команду выдавал )))