Sinal I2C e energia a longo alcance (cabo de 10 metros)

9

Após algumas leituras / testes, consegui estabelecer uma comunicação estável entre 2 dispositivos usando I2C com cabo de par trançado de cobre FTP CAT5.

  • Fio verde - SCL
  • Fio branco / verde - GND
  • Fio azul - SDA
  • Fio branco / azul - GND

O GND está conectado apenas em uma extremidade do cabo, o relógio do barramento I2C está em 10Khz e eu usei resistores pullup de 10Kom no VCC

Funciona bem e estável. Quando decidi usar outros 2 pares de cabos para alimentação (+ 12V), ele parou de funcionar. Testei + 12V em um par GND no outro par, também + 12V / GND no mesmo par: mesmo resultado, ele parou de funcionar. Todo o barramento I2C parou de funcionar, outros dispositivos conectados a ele também.

Gostaria de saber se posso usar o mesmo cabo ou escolher a opção mais segura - outro cabo para alimentação.

user3503519
fonte
3
Você verificou se a energia do lado receptor está boa o suficiente? Sem falhas, sem quedas ... Os cabos CAT5 são bastante finos, é por isso que o PoE usa> 40 V para alimentação.
Vladimir Cravero
4
É aqui que você precisa de um osciloscópio. Todo o resto será adivinhação (educada).
pipe
1
Eu não torceria SDA ou SCL com GND porque você não quer nenhuma capacitância entre eles. Eu torceria + 12V com o GND, pois você quer capacitância entre eles. Que corrente (de retorno) os + 12V possuem? (você pode ter salto solo)
Huisman
5
O GND está conectado apenas em uma extremidade do cabo? A menos que eu esteja entendendo mal, isso não parece certo.
Mckith 25/03/19
1
Você quis dizer cabo UTP ? Tenho certeza de que ele pode ser usado para mais do que apenas os protocolos FTP;)
Andrew Morton

Respostas:

15

Talvez exagere se estava funcionando antes, mas uma opção é usar um conversor I2C para diferencial como PCA9615 , LTC4331 etc. Se tornar os resistores menores não funcionarem ou você precisar estender o cabo, considere não usar I2C diretamente.

Não apenas o alcance será estendido, mas você também terá melhor imunidade a ruídos.

insira a descrição da imagem aqui insira a descrição da imagem aqui

Wesley Lee
fonte
1
Ótima resposta, é exatamente isso que deve ser feito, mas é claro que pode ser uma mudança radical para o OP.
Jack Creasey
Quero dizer, eles são super fáceis de implementar (se comparados à mudança para RS-485, CAN, etc), mas sim, comparados à troca de alguns resistores, é uma mudança radical.
Wesley Lee
1
O problema do @JackCreasey OP não é apenas a capacitância do cabo, eles parecem sofrer de ruído na linha de 12V que adicionaram. A redução dos resistores pull-up fornece alguma imunidade a ruído extra, mas eles não podem continuar diminuindo essa resistência indefinidamente.
Dmitry Grigoryev
@DmitryGrigoryev Como o OP não deu detalhes, não tenho certeza de como você poderia sugerir que o ruído estava sendo injetado. Eu concordo que você não pode simplesmente continuar diminuindo a rescisão / suspensão… .mas o OP é muito grande em 10: 1.
22619 Jack Creasey
9

Como observei em um comentário, é difícil depurar sem um traço do osciloscópio, mas a primeira coisa que se destaca na sua pergunta é o resistor de 10 kOhm. Isso é incomumente alto para o I2C, embora possa funcionar facilmente em muitos casos.

Eu tentaria abaixá-los para 1 kOhm primeiro, para ver se isso afetaria alguma coisa. Se ajudar, você pode aumentá-las gradualmente, embora isso tenha um impacto no seu tempo de subida.

tubo
fonte
10 kΩnão é tão grande para um barramento I2C em 10 kHz? (Ou deveria ser 100 kHz OP?)
Huisman
@Huisman Dois bons pontos. 10 kOhm não me preocuparia a 10 kHz em uma placa de circuito impresso normal, mas talvez não seja suficiente pelo cabo. E 10 kHz é incomum, mas não louco, incomum, eu acho.
pipe
7
10k Ohm é enorme para I2C a qualquer distância. Esse é o principal problema do OP.
precisa
1
Eu acho que é melhor dividir os resistores e usar um em cada extremidade. 2 resistores de tração @ 4,7kΩ, um em cada extremidade, devem ser uma escolha melhor do que um único resistor de tração de 2,2kΩ.
12431234123412341234123
Vou tentar abaixar os resistores, isso é tudo o que faz sentido para mim depois de todos esses comentários.
user3503519
5

Você absolutamente precisa soltar seus resistores de pullup a longas distâncias, e 10m é um longo caminho e 10k Ohm é muito alto.

O valor do resistor de pullup está relacionado a três coisas:

  1. Capacitância do cabo
  2. Visando tensão e sentido do nível Rx.
  3. Rapidez

Tente usar qualquer uma das calculadoras disponíveis e comece sua leitura aqui com a nota de aplicação da TI sobre valores de pullup ou aqui com o padrão NXP I2C (7.1).

Em termos do problema que você está tendo, deve ser óbvio que o aterramento de pares adicionais (12V, Gnd) no cabo alterará a capacitância dos fios de sinal I2C.

Jack Creasey
fonte
2
Eu concordo que o cabo CAT5 possa assumir cerca de 50pF por metro, de modo que 10 metros excedam o limite de capacitância de 400pF da especificação I2C. E atingir o clock I2C de 400kHz não pode ser alcançado com capacitância de 400pF usando a corrente de pull-up de 3mA especificada dos resistores. Felizmente, diminuir a velocidade ajudará - a menos que os dispositivos tenham uma limitação mínima de velocidade de clock. Não sabemos quais são esses dispositivos e quais são as tensões do barramento I2C, mas, na verdade, os pullups devem ser ajustados para fornecer pelo menos 3 mA e se os dispositivos permitirem e concordarem com a tensão de baixo nível do barramento, mais ainda.
Justme 25/03/19
Sim, vou testar com isso, mas minha pergunta é por que funciona se não houver energia sobre esse cabo?
user3503519
Um par de cabos flutuantes não possui a mesma capacitância que o seu par de sinais quando possui quando o cabo é aterrado. Para sua configuração, tanto o +12 quanto o Gnd são essencialmente os mesmos .... eles têm capacitância para o cabo de sinal que afeta o tempo de espera. .
precisa
2

Algumas notas:

Obter os valores de pull up corretos é vital, principalmente para a SDA. Dispositivos diferentes podem afundar quantidades diferentes de corrente. Vi configurações que geram 1s extras nos dados por causa de um resistor de pull-up muito pequeno, depois de mudar para um chip sensor menor. As geometrias menores significavam que não era possível baixar o ônibus para um zero limpo.

A velocidade mata. Um cabo longo é efetivamente um filtro LRC passa-baixo. Para muitos aplicativos I2C, é possível diminuir o tempo do relógio sem perder nada. Um relógio mais lento pode compensar um pull-up fraco e uma grande capacitância (mas não um pull-up muito forte).

Os cabos longos são um convite à EMI. Vi uma implementação do I2C que precisava de uma pinça de ferrite para passar nos testes de imunidade. Terminação final, cabo blindado ou filtros podem ajudar.

Cuidado com a resistência paralela. Se você possui 1k de pull-up no mestre e, em seguida, 1k em cada um dos quatro dispositivos clientes no barramento, então você tem um pull-up de 200 Ohm. Não vai trabalhar.

Jason Treon
fonte
0

A placa breakout Sparkfun I2C é uma boa solução que apresenta:

PCA9615 buffer
I2C Supply voltage range 2.3-5.5V
Differential Supply voltage range 3-5.5V
draws 16µA of current
Extends I2C bus up to 100 feet
Data rate up to 400kHz
2x Qwiic Connectors

insira a descrição da imagem aqui

Gatorback
fonte
-1

Primeiro: quero agradecer à comunidade por postar uma resposta.
Segundo: Encontrei uma solução com base nessas respostas, eis o que fiz:

Testados os resistores de pull-pull para 4.7K e 2K. No 2K, começo a receber respostas de tempos em tempos, então diminuo para 1K e começo a receber respostas, mas parte dos dados estava faltando em cada uma delas. Depois disso, o resistor pullup comutado no pino SDA com 10K e tudo começa a funcionar de maneira estável.
Portanto, a solução no meu caso é 1K pullup no SCL e 10K no SDA.

Obrigado pelo seu tempo.

user3503519
fonte
1
Isso é loucura. Que tipo de hardware você usa aqui? Talvez algo esteja mal configurado.
pipe
1
De um lado, o ESP32 com micropython, do outro lado, o atmega8 programado com o arduino IDE. Eu finalmente não consideram que a comunicação segura, por isso vai mudar para serial (RS232), como eu testei ele funciona bem nessas faixas
user3503519
1
Se eu fosse você, também daria uma olhada no RS-485, que seria ainda mais robusto e ainda mais simples. A desvantagem é que ele requer mais fios de sinal, mas você já possui muitos deles no seu CAT5.
pipe
1
Bem, eu não vejo como implementar diretamente o RS-485 no processador atmega ou no ESP 32 sem conversores e hardware adicionais, portanto o RS-232 é a melhor opção aqui. Apenas um shifter de nível TTL será usado.
user3503519