0% acharam este documento útil (0 voto)
4 visualizações2 páginas

Sniffer I2C para Arduino: Código e Instruções

Este código Arduino implementa um sniffer I2C que amostra os pinos SDA e SCL de um barramento I2C. Ele captura um conjunto de dados quando a linha SDA fica baixa, armazena-o em um array e, em seguida, despeja os dados amostrados na porta serial de forma formatada para análise. A janela de amostragem pode ser ajustada, mas 300 amostras são suficientes para capturar um byte enviado a 100kbps. O código fornece monitoramento básico de sinal, mas um analisador lógico seria necessário para uma análise de temporização mais precisa.

Traduzido por

ScribdTranslations
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
4 visualizações2 páginas

Sniffer I2C para Arduino: Código e Instruções

Este código Arduino implementa um sniffer I2C que amostra os pinos SDA e SCL de um barramento I2C. Ele captura um conjunto de dados quando a linha SDA fica baixa, armazena-o em um array e, em seguida, despeja os dados amostrados na porta serial de forma formatada para análise. A janela de amostragem pode ser ajustada, mas 300 amostras são suficientes para capturar um byte enviado a 100kbps. O código fornece monitoramento básico de sinal, mas um analisador lógico seria necessário para uma análise de temporização mais precisa.

Traduzido por

ScribdTranslations
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

/******************************************************

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); }
}
}

Você também pode gostar