снифер 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.. Хочу чтоб мне терминал сразу полностью команду выдавал )))