/******************************************************
Sniffer I2C Arduino
2011 J. M. De Cristofaro
CC-BY-SA 3.0
este código não é suportado -- use por sua conta e risco!
conecte um pino digital a SCL e um pino digital a SDA
use pinos no PORTD (Arduino UNO/Duemilanove pinos #0 - 7)
do not connect to serial pins (0 & 1)!
conecte o GND no Arduino ao GND do barramento I2C
*******************************************************/
/** DESCRIPTION **/
/*******************************************************
este código executa uma captura "de uma vez", significando que
ele captura os dados apenas uma vez e então os descarrega para o
porta serial.
começa a capturar quando detecta que a linha SDA tem
baixou. não verifica a linha SCL (como uma adequada
o detector de condição de início.
você pode ajustar a janela de captura para atender às suas necessidades.
um valor de 300 é longo o suficiente para capturar um byte enviado
sobre i2c na taxa padrão de 100 kbit/s. a amostra
os dados são bons o suficiente para mostrar a sequência de eventos,
mas pouco mais.
se você precisar de dados muito específicos e alinhados ao tempo, você deve
use um analisador lógico ou osciloscópio de amostragem.
*******************************************************/
// atribuir valores dos pinos aqui
constcharsda_pin = 2;
constcharscl_pin = 7;
// janela de amostragem
const int data_size = 250;
// array para conter dados amostrados
bytecaptured_dados[tamanho_dados];
// booleanos de limpeza
capturadoBooleano
booleandumped;
voidsetup()
{
Sé[Link](57600);
pinMode(sda_pin, INPUT);
pinMode(scl_pin, INPUT);
captured =false;
dumped =false;
SériePronto para ir, chefe!
}
// loop principal: aguarda o SDA ficar baixo, então
// amostra os dados, então formata e despeja
// para a porta serial.
voidloop()
{
enquanto(digitalRead(sda_pin)==ALTO) {}
capturar();
se(capturado == verdadeiro && despejado == falso)
{
serial_dump();
dumped =true;
}
}
// captures the data on PORTD and stores it in a global array
voidcapture()
{
bytetempdata;
for(intx = 0; x < tamanho_dados; x++)
{
tempdata = PIND;
captured_data[x] = tempdata;
}
captured =true;
}
// lê os dados do array global, formata isso
// e envia para a porta serial.
voidserial_dump()
{
bytetemp;
Sé[Link]("exemplo, sda, sck");
for(int x = 0; x < tamanho_dados; x++)
{
se(x<10) {[Link]("0"); }
if(x<100) {[Link]("0"); }
Sé[Link](x);
Sé[Link](" ");
temp = bitRead(dados_capturados[x], pino_sda);
se(temp == 0) {[Link](0); }
senão{[Link](1); }
Sé[Link](" ");
temp = bitRead(captured_data[x], scl_pin);
se(temp == 0) {[Link](0); }
senão{[Link](1); }
}
}