Problema al iniciar la comunicación I2C entre Arduino y 3.3V Slave

3

Estoy tratando de entrar en la detección capacitiva y, por lo tanto, necesito una comunicación estable entre un Arduino y un TI FDC2114 , que ya está soldado en un EVM. Ambos admiten I2C, y debido a la diferente tensión de operación de 5V para Arduino y 3.3V para FDC, estoy usando un PCA9512A cambio de nivel bidireccional y 10k pullups a 5V (Arduino Mega interna) así como a 3.3V.

Al escanear la dirección del FDC, a veces recibo una respuesta positiva (ACK en el último reloj después de la dirección de 7 bits solicitada) pero principalmente un NACK. Incluso si recibo un ACK, unos segundos después, el FDC ya no puede bajar el SDA a 0V y obtengo NACK nuevamente. En el caso de NACK, puede ayudar a desconectar SDA y SCL mientras está bajo voltaje y enchufarlos nuevamente, pero no funciona siempre. Ya he cambiado todos los cables, por lo que no debería ser un problema mecánico. También observé que el voltaje máximo es 3.4V en SCL y más de 3.6V en SDA, pero no sé si esto podría causar algún problema y también de dónde proviene la diferencia de voltaje.

Al utilizar la MCU incluida del EVM, no hay ningún problema. ¿Qué me estoy perdiendo, por qué no funciona de manera confiable?

    
pregunta J. Mustard

6 respuestas

2

Problema resuelto!

Intenté que el FDC funcionara con un Arduino Mini Pro 3,3V y tuve el mismo problema que antes.

Al final, la solución fue simple: el FDC tiene un Pin de apagado (SD), que lo pone en suspensión cuando ALTO y lo activa cuando está BAJO. Cuando conecté SD a GND, todos los problemas desaparecieron. Ahora tengo una señal estable entre Arduino Mini Pro 3,3V y FDC2114. Creo que también funcionaría con el Arduino Mega y el cambio de nivel, pero no puedo probarlo.

Gracias de nuevo por tu ayuda.

    
respondido por el J. Mustard
1

Lamento no haber respondido en los últimos días. Parece que el PCA9512A ya no funciona, porque no hay ni un reloj ni una señal de datos en el lado de 3.3V. Por lo tanto, ordené un Arduino Mini Pro 3,3V para evitar el problema del cambio de nivel, aunque sería mejor resolver el problema en lugar de solo evitarlo. Pero quiero avanzar en mi proyecto, por lo que parece ser la forma más rápida.

Pero algunos puntos para aclarar: En los esquemas, los pullups en el lado de 5V están equivocados. Son internos, no externos como sugiere la imagen. Además, en realidad son 10k, porque es un Arduino Mega 2560. Todos los dispositivos comparten una base común sólida. Probé frecuencias entre 100kHz y 400kHz, pero ninguna de ellas pareció funcionar. El pin ACC se eleva a 3.3 V mediante una resistencia de 10k, que permite acelerar el tiempo de subida. Los condensadores están lo más cerca posible del FDC.

Debido a que el cambio de nivel es un defecto, no puedo cargar ninguna imagen de rastreo. Lo siento por eso, pero gracias por tu ayuda de todos modos.

    
respondido por el J. Mustard
0

El Arduino ya tiene resistencias pullup incorporadas. Esto puede estar afectando su capacidad para tirar las líneas hacia abajo lo suficiente. Deshabilite los pullups incorporados o elimine los pullups externos de 10KΩ y vea si la situación mejora.

    
respondido por el evildemonic
0

Aquí hay algunas ideas, disculpe si ya las ha considerado.

Su problema podría no ser eléctrico, podría ser lógico. El cambiador de nivel I2C que está utilizando está diseñado para detectar las condiciones de INICIO y DETENCIÓN en el bus, por lo que si su software es incorrecto, es posible que el búfer no esté en el modo correcto.

Cuando inicie la comunicación I2S, intente prever cada operación con un bit START seguido de un bit STOP. Eso debería restablecer el búfer al estado correcto. Luego, examine su código I2C para ver si hay un problema en la forma en que maneja las condiciones de PARADA. Use suficientes demoras para que la velocidad de comunicación de su I2C no sea demasiado rápida. 400kHz debería funcionar de manera confiable.

Finalmente, en su código I2C en el Arduino, no configure la salida a alto cuando desee transmitir un nivel alto. En su lugar, configure el pin (SDA o SCL) para que ingrese, luego las resistencias se encargarán de jalar los pines. Si es posible que nunca conduzca los pines SDA y SCL a un nivel alto, podría quitar la palanca de cambios de nivel por completo y usar solo la resistencia de 3,3 voltios para esos pines. 3.3 voltios en los pines de entrada de Arduino deben ser lo suficientemente altos como para detectar un estado alto.

    
respondido por el PkP
0

Comience con un circuito más simple: está usando un arduino de 5v; simplemente use un Arduino de 3.3v y su dispositivo esclavo de 3.3v. El atmega328 tiene una capacidad nominal de 2 a 5 voltios a diferentes velocidades, por lo que si desea intercambiar el cristal y la entrada, puede reutilizar el que tiene; solo debe consultar la hoja de especificaciones para ver qué velocidades se ejecutan a qué voltajes. He leído que algunas personas tienen suerte, incluso con solo 20 mhz con solo 3.3v. Con solo el dispositivo arduino y el dispositivo esclavo, puede estar más seguro del circuito y hacer que el boceto funcione correctamente. Luego agregue complejidad al circuito después del hecho si necesita usar el arduino 5v por alguna razón. Los clones de ebay chinos realmente funcionan muy bien, pero generalmente se basan en el atmel 32u4 que tiene USB integrado para evitar el costo de un chip externo. El mayor inconveniente para ellos es el envío es un mes.

    
respondido por el Jared Chmielecki
-1

¡Quita el convertidor de nivel!

Dado que los controladores I2C tienen un drenaje abierto, puede conectarlos sin usar un convertidor de nivel.

  

Los conductores de bus I2C están "en drenaje abierto", lo que significa que pueden tirar del   línea de señal correspondiente baja, pero no puede conducirla alta.

Ref .: enlace

    
respondido por el MatsK

Lea otras preguntas en las etiquetas