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.
Respostas:
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.
fonte
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.
fonte
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:
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.
fonte
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.
fonte
A placa breakout Sparkfun I2C é uma boa solução que apresenta:
fonte
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.
fonte