I2C só funciona quando sondado ou carregado com 1Mohm

9

Estou tentando solucionar problemas de comunicação entre um msp430fr5847 (mestre) e um sensor escravo com chip I2C desconhecido (parte de um sensor industrial)

Estou tendo problemas com um novo lote de sensores em que meus dados estão sendo retornados com todos os zeros, no entanto, ao tentar solucionar problemas com o meu Saleae logic pro (2Mohm, 10pf) ou com o meu osciloscópio (10Mohm, 50pf), o sistema funciona perfeitamente ao investigar o pino SDA.

Solucionando problemas ainda mais, o circuito funciona corretamente se eu adicionar um resistor de 1Mohm entre o SDA e o terra, mas não funcionará apenas se adicionar um capacitor de 10pf ou 100pf.

Eu estou usando 4.7k puxar resistores para o meu trilho de 3.3v.

O que pode estar causando esse problema e o que pode ser feito para solucionar problemas sem corrigir o problema acidentalmente.


EDIT: 19/07/2017 Aqui está um rastreamento rápido do escopo dos meus sinais.

Outra coisa que esqueci de mencionar é que apenas o SDA sondador faz com que a placa funcione, o SCL sondado ou a minha linha de interrupção não o faz funcionar corretamente.

Rastreio de escopo de SDA e SCL


EDIT: 21/07/2017

O gráfico engrossa, parece que a conexão de um osciloscópio diferente não faz o circuito funcionar corretamente e pode ser visto que a única diferença é que um ACK não está sendo transmitido.

Nova imagem de escopo

Na figura acima, os traços azul e verde são o SCL e o SDA quando o circuito não está funcionando corretamente. Os traços amarelo e rosa são de quando eu também conecto minha lógica Saleae ao SDA Pin e à terra, mas sem conectar o USB (tentando evitar loops de terra).

Para adicionar um pouco mais de fundo ao sensor, é um sensor de pressão industrial que compramos do fabricante. Anteriormente, projetamos e testamos essas PCBs com nosso primeiro lote de sensores. Recentemente, recebemos um novo lote e agora estamos enfrentando esses problemas. Pesquisei um pouco e suspeito fortemente (depois de pesquisar no Google frases únicas da folha de dados) que internamente o sensor usa um ZSC31014 ou similar, folha de dados em PDF AQUI


EDIT: 26/07/2017

Portanto, espero que a última parte da solução desse problema, conforme a resposta detalhada de SamGibson, implementei a correção de definir o bit alto do endereço para mascarar as falhas no final do bit inicial.

Isso funcionou principalmente com os dados que chegavam conforme o esperado, mas agora parece que no primeiro comando de leitura após uma gravação (se esse é o termo correto para um grupo de bits i2c), o escravo tenta ACK um pouco mais cedo (em a posição do bit de gravação). Eu posso dizer que é o escravo puxando a linha para baixo através da adição de um pequeno resistor (47 ohm) em série com a Linha SDA.

Normalmente, eu começava isso como uma nova pergunta, mas quando anexo o mesmo escopo que não teve efeito na solução de problemas acima, esse problema parece desaparecer, realmente parece ser um problema limítrofe, mesmo que eu anexasse o probe de escopo, sem conectá-lo ao escopo, o problema foi resolvido, portanto, suponho que seja um problema de capacitância.

Lote do problema sem escopo anexado

Gráfico sem escopo

Problema com a sonda do osciloscópio conectada, mas não anexada ao osciloscópio, observando a tensão um pouco mais alta quando o escravo puxa o bit de gravação em vez do bit ACK.

Com escopo anexado

Hugoagogo
fonte
11
Você tem algum rastreamento de escopo #
Kevin White
11
Você inadvertidamente inverteu seu sinal de relógio?
Andy aka
6
Confirme se o barramento I2C possui e está usando um fio terra comum (MSP ao sensor I2C). São necessários 3 fios: SDA, SCL e GND, com SDA e SCL puxados até Vcc (possível 4º fio) através de resistores de pull-up.
31717 Chris Knudsen
11
@Hugoagogo - Yikes! SDA e SCL são anormais, de maneiras diferentes. Presumo que o rastreamento está com os novos sensores com falha ? Em caso afirmativo, você pode fornecer um rastreamento com os sensores de trabalho antigos ? Talvez a diferença possa não ser tão grande, ou seja, você já teve um problema antes, mas estava apenas funcionando. Mais informações básicas podem revelar dados úteis, por exemplo, como você sabe que esses chips I2C são "novos", considerando que o chip é "desconhecido"? Suponho que alguma engenharia reversa foi feita para permitir que o MSP430 (que você controla?) Seja usado com um sensor (que você não controla?). Quão diferente é a configuração "original"?
21717 SamGibson
11
Bem, eu concordo com SamGibson. Eu não seria tão rápido em dizer que os picos são erros de medição. Eu acho que você deveria tentar pesquisar um pouco mais e tentar eliminá-los, se eles vierem da sua configuração de medição ou descobrir o motivo pelo qual eles estão lá. Afinal, eles parecem estar alinhados com as bordas de queda do SCL. Eu também tentaria conectar o sensor diretamente na placa de circuito impresso. Isso pode ajudá-lo a descartar que os problemas são causados ​​pelo cabo ou pela distância do sensor da placa principal.
nickagian

Respostas:

11

Eu acho que encontrei a resposta. Acontece que este é um problema conhecido, mas só descobri que depois de ter decidido onde estava o problema e procurado por ele!

Aqui está o processo pelo qual passei, para que você possa segui-lo (e, se necessário, poderá adaptar sua investigação se encontrar resultados diferentes das minhas suposições). A conclusão é que parece haver uma incompatibilidade entre (pelo menos alguns) o comportamento do MSP430 I²C e o comportamento necessário do I²C pelo dispositivo que você suspeita ser o escravo do I²C, o IDT ZSC31014 . Ter a folha de dados desse dispositivo é essencial para entender isso, então obrigado por encontrá-lo.

A boa notícia é que existem (pelo menos) duas soluções alternativas para esse problema, que explicarei no final.

O gráfico engrossa, parece que a conexão de um osciloscópio diferente não faz o circuito funcionar corretamente e pode ser visto que a única diferença é que um ACK não está sendo transmitido.

Os novos traços são úteis, obrigado, embora eu os interprete um pouco diferente.

(O sinal inferior do sinal SCL, que me preocupou no rastreamento inicial, ainda está presente no rastreamento mais recente. É interessante que o sinal secundário no SCL pareça maior que o sinal secundário no SDA, especialmente considerando as diferentes escalas verticais entre os sinais SCL e SDA no Ainda sugeriria investigar a subida do SCL eventualmente, mas não acredito que esteja relacionada ao problema principal.)

Existem essas duas "falhas" no SDA:

  • Uma falha imediatamente antes ou logo após o pulso do ACK não é incomum, quando um mestre do I²C libera o controle do SDA para permitir que um escravo execute o ACK e, em seguida, o mestre pode re-dirigir o SDA novamente. Portanto, eu estou ignorando esse.

  • É a falha inicial do SDA, antes do primeiro pulso do SCL, o que é mais incomum. A partir da amplitude dessa falha inicial do SDA (veja mais adiante) e do fato de ocorrer apenas antes do primeiro pulso do SCL (rotulado como 0), mas não ocorre antes dos pulsos do SCL posteriores, onde poderíamos ver uma falha no SDA (como o SCL pulsos rotulados como 4, 5, 6 ou 7), sabemos que não é um artefato de medição nem um acoplamento do SCL (por exemplo).

(Para referência posterior, a falha inicial do SDA se parece com pelo menos 2V no rastreamento mais recente, portanto, com Vdd a 3,6V de comentários anteriores, isso torna a amplitude da falha do SDA pelo menos (2 / 3,6) = 0,55 x Vdd. Compare isso com os limites relevantes do nível lógico I2C discutidos posteriormente.)

Ignorando a diferença do ACK, acredito que vejo outra diferença entre os dois conjuntos de rastreamentos na segunda captura de tela. A amplitude dessa falha inicial do SDA parece um pouco diferente, comparando os principais traços do SDA rotuladosC1 (amarelo-ish?) E o segundo traço SDA marcado M3(azul). Agora, acredito que as diferenças na amplitude dessa falha inicial da SDA é o que pode fazer com que seu problema apareça ou desapareça, como explico abaixo.

Uma resolução ainda mais específica sobre a falha ajudaria (esse é um dos problemas ao tentar solucionar problemas "remotamente" - eu mesmo não posso operar o 'escopo!). Presumo que, quando você aumenta o zoom, parece o início de uma lógica I²C normal "1" (ou seja, uma curva RC na borda ascendente, especialmente se você temporariamente tornar as flexões mais fracas, por exemplo, 10k), exceto que isso não acontece ' t atinja a tensão positiva total antes de retornar a uma lógica "0". É o que é mostrado em outra página da web vinculada posteriormente. Se você vir uma forma diferente da sua falha, minha análise posterior poderá não se aplicar.

O I²C Master está no controle do barramento no ponto dessa falha, entre o I²C Start e o primeiro pulso de clock do SCL (que você rotulou como "0", embora seja o MSbit). Isso me fez suspeitar do comportamento do MSP430, embora com o SCL baixo naquele momento, uma falha no SDA não deva afetar os dispositivos compatíveis com I²C, pois eles aguardam o SCL subir alto antes de lerem o estado do SDA.

Então, esse I²C Slave é realmente compatível com I²C? Acontece que o ZSC31014 é " exigente " e menos tolerante do que alguns outros dispositivos I²C, exatamente no momento em que acredito que o MSP430 está produzindo essa falha!

A folha de dados do ZSC31014 lista 3 áreas em que eles admitem que o comportamento de I²C do dispositivo é "diferente". Você também pode ser afetado pelos dois primeiros nesta lista em outros momentos (que não fazem parte desta análise), mas é o terceiro ponto que marquei abaixo em vermelho, que está relacionado a essa falha inicial do SDA:


extrato da folha de dados do ZSC31014


A amplitude dessa falha inicial da SDA é crítica . Se essa falha não se elevar o suficiente para ser reconhecida pelo ZSC31014 como uma lógica "1" antes de cair novamente, você estará bem - o dispositivo precisa ver uma queda no SDA para quebrar essa "regra" e só pode ser uma borda descendente se já tiver sido reconhecida como uma lógica "1".

Qualquer coisa que afete a amplitude dessa falha SDA, como a carga adicional de um analisador de escopo ou lógico no sinal SDA, pode ser suficiente para impedir que a falha seja reconhecida pelo ZSC31014 como atingindo a lógica "1" e, portanto, não "caindo" SDA edge ", terceiro ponto da lista, pode ocorrer (em um dia bom, dependendo de tensões, temperaturas etc.). No entanto, como você descobriu, a variação entre diferentes osciloscópios é suficiente para significar que alguns deles adicionam carga suficiente para parar o problema e outros não. Essa configuração deve ser muito marginal!

Isso confirma minha preocupação de que seus lotes de sensores "funcionais" anteriores possam estar "apenas" funcionando, pois os MCUs MSP430 nessas configurações "funcionais" provavelmente também estarão produzindo falhas no SDA. Minha teoria sobre uma possível diferença entre lotes de sensores, que poderia explicar o comportamento diferente que você relatou (lote "funcionando" vs. lote "não operacional") é explicada a seguir.

Curiosamente, o ZSC31014 é diferente do padrão I²C em outra área que não é mencionada nessa lista pelo fabricante, e isso pode explicar por que você parece notar uma diferença entre lotes de sensores.

Os limites lógicos padrão de I²C são (simplificados) - abaixo de 0,3 x Vdd para a lógica "0" e acima de 0,7 x Vdd para a lógica "1", como mostrado na especificação de I²C :


limites de nível lógico da especificação I2C


No entanto, o ZSC31014 possui limites diferentes , 0,2 x Vdd e 0,8 x Vdd, o que significa que sua "região indefinida" entre esses limites é maior que os dispositivos I²C típicos:


limiares de nível lógico da folha de dados do ZSC31014


Essa "região indefinida" maior aumenta a chance de a falha entrar na área de nível de tensão indefinida, onde pode ser reconhecida como uma lógica "1" (lembre-se, qualquer coisa acima de 0,2 x Vdd pode ser reconhecida pelo ZSC31014 como uma lógica "1" , já que na região indefinida, tudo é permitido - é apenas acima de 0,8 x Vdd quando deve ser reconhecido como uma lógica "1"). E, como explicado anteriormente, se a falha for reconhecida pelo ZSC31014 como tendo atingido a lógica "1", quando ela cair novamente para a lógica "0", você quebrou a "regra" marcada em vermelho para o comportamento de I²C necessário pelo ZSC31014.

Como o reconhecimento dos níveis lógicos nessa região de tensão "indefinida" não é especificado, o fabricante do sensor não está quebrando a especificação se criar um lote que reconheça a lógica "1" somente quando atingir 0,7 x Vdd, mas fizer outro lote que reconheça uma lógica "1" tão baixa quanto 0,4 x Vdd, por exemplo. Esse segundo lote hipotético teria mais chances de ver a falha do SDA como uma vantagem decrescente do SDA, violando o terceiro ponto da lista, mas não quebrando suas especificações.

(Muitos dos problemas em que trabalhei, ao longo dos anos, foram assim: existem dois dispositivos, nenhum dos quais está quebrando individualmente uma especificação que possui brechas - mas um é exigente e menos tolerante, em um ponto em que o outro precisa que os dispositivos conectados sejam mais tolerantes por causa de seu comportamento obscuro! Cada um desses dispositivos faz uma boa interface com a maioria dos outros dispositivos, mas não é confiável (ou falha completamente) quando conectados um ao outro.)

Então o que você pode fazer? Pensei em duas opções:

  • Não use um MSP430 - use outro MCU que não crie essa falha inicial do SDA. No entanto, espero que você tenha investido muito tempo no software e não queira portar o código para outro MCU, se isso puder ser evitado.

  • "Bit-bang" o protocolo I²C no MSP430, em vez de usar seu módulo de hardware interno I²C. Dessa forma, você está no controle total dos sinais I²C e pode impedir que essa falha ocorra. No entanto, obviamente seria um pouco trabalhoso criar suas próprias rotinas I²C, depurá-las e o código resultante pode ser maior do que quando se usa o módulo de hardware MSP430 I²C, o que por si só pode ser um problema se você estiver com pouco espaço em Flash.

Depois, procurei problemas no MSP430 I²C e descobri que essa combinação do MSP430 + ZSC31014 é um problema conhecido, devido a essa falha no SDA do MSP430! Veja esta discussão no fórum TI E2E MSP430:

Fórum TI E2E: pulsos de falha do MSP430 I2C causando problemas para o chip periférico I2C

A solução mencionado lá, é para alterar o endereço ZSC31014 I²C para que SDA é alto no momento em que a falha positiva poderia ocorrer, e desde SDA é feita de alta, em seguida, de qualquer maneira, não há real falha em SDA:

Nossa solução alternativa é configurar o chip ZSC para ter um endereço com o bit 6 definido (por exemplo, agora estamos usando 0x42) - isso transforma o pulso de falha em um bit "alto" limpo e agradável para a duração do bit 6 do endereço, o que se livra da vantagem problemática.

A mesma solução alternativa é efetivamente o inverso da sugestão na folha de dados do ZSC31014, na caixa vermelha que eu marquei. Eles dizem que uma falha no SDA deve ser evitada se o primeiro bit (que é o MSbit) do endereço ZSC31014 I²C for 0 -, portanto, não torne o MSbit do endereço I²C um "0", faça um "1", ou seja, defina o bit 6 no endereço I²C de 7 bits!

Como o encadeamento do fórum TI E2E e a folha de dados do ZSC31014 estão focados no endereço I²C, talvez a falha do SDA não ocorra ou não seja um problema se ocorrer durante o envio de outros dados no barramento. Você precisará investigar isso.

Portanto, ignorando a primeira solução alternativa do uso de um MCU diferente, as duas soluções (mais práticas) são:

  • Faça um bit-bang no barramento MSP430 I²C escrevendo seu próprio código, para que você não crie essa falha no SDA, ou
  • Altere o endereço ZSC31014 I²C para que o bit 6 de seu endereço de 7 bits seja definido, o que significa que o SDA já está alto quando a falha ocorreria, para que nenhuma falha real ocorra no SDA quando o ZSC31014 é endereçado (supondo que uma falha SDA não ocorre após outros eventos I²C Start durante a transferência de dados ou, se houver, que o ZSC31014 não fique "chateado").

Espero que ajude!

SamGibson
fonte
2
Esta é uma resposta impressionante e muito útil, antes que eu marque como aceito, há alguma maneira de fornecer a você mais um representante por continuar usando a solução de problemas. Também atualizarei minha pergunta com minha solução alternativa quando ela começar.
Hugoagogo
11
@ Hugo - Esse é um pensamento muito gentil :-) Eu acredito que isso pode ser feito oferecendo uma recompensa em que a razão da recompensa seria " Recompensa a resposta existente ". Como não sou especialista no processo, não posso dizer muito mais do que isso. É claro que eu ficaria feliz em ter um representante extra (demorou algumas horas para fazer a análise e a redação ;-)), mas se você não quiser usar uma recompensa ou não conseguir descobrir o processo , então não se preocupe, é tudo um karma positivo de qualquer maneira :-) Espero que minha resposta funcione!
21417 SamGibson
@ Hugo - Não sei se você é notificado de atualizações nas respostas, mas apenas para sua informação, adicionei um parágrafo sobre o SCL e sua parte inferior (ainda é um quebra-cabeça, mas duvido que esteja relacionado ao principal problema) e eu ' adivinhei que a amplitude da "falha inicial do SDA" no último rastreamento do escopo era de pelo menos 0,55 x Vdd, que está bem na região de tensão "indefinida", onde diferentes sensores (ou diferentes lotes de sensores ;-)) poderiam tratar isso como uma lógica "1" ou não, sem quebrar sua especificação. Estarei offline por um tempo em breve, então, novamente, boa sorte!
21417 SamGibson
11
Obrigado novamente pela assistência. Terei uma chance com a recompensa na segunda-feira, quando estiver dentro. (Para o registro, não sou notificado de atualizações de respostas) #
Hugoagogo 22/07/17
eu seria capaz de fazer você refletir sobre uma última atualização da pergunta.
Hugoagogo 26/07