Estoy tratando de ingresar a 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 son compatibles con I2C, y debido a la diferente tensión de funcionamiento de 5 V para Arduino y 3,3 V para FDC, estoy usando un cambiador de nivel bidireccional PCA9512A y pullups de 10k a 5 V (Arduino Mega interno), así como a 3,3 V.
Al escanear la dirección del FDC, a veces obtengo 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, algunos segundos después, el FDC ya no puede bajar el SDA a 0 V y obtengo NACK nuevamente. En el caso de NACK, puede ayudar desconectar SDA y SCL mientras están bajo voltaje y volver a conectarlos, pero no siempre funciona. Ya cambié todos los cables, por lo que no debería ser un problema mecánico. También observé que el voltaje máximo es de 3,4 V en SCL y más de 3,6 V en SDA, pero no sé si esto podría causar algún problema y también de dónde resulta la diferencia de voltaje.
Cuando se usa la MCU incluida del EVM, no hay ningún problema. ¿Qué me estoy perdiendo, por qué no funciona de manera confiable?
¡Problema resuelto!
Intenté hacer funcionar el FDC 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 reposo cuando está 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 Arduino Mega y el cambiador de nivel, pero no puedo probarlo.
De nuevo, gracias por tu ayuda.
Siento no haber contestado estos últimos días. Parece que el PCA9512A ya no funciona, porque no hay ni reloj ni señal de datos en el lado de 3.3V. Por lo tanto, pedí un Arduino Mini Pro 3,3V para evitar el problema del cambio de nivel, aunque sería mejor resolver el problema en lugar de evitarlo. Pero quiero avanzar en mi proyecto, así que esta parece ser la forma más rápida.
Pero algunos puntos de aclaración: en los esquemas, los pullups en el lado de 5V son incorrectos. Son internos, no externos como sugiere la imagen. Además, en realidad son 10k, porque es un Arduino Mega 2560. Todos los dispositivos comparten un terreno común sólido. Probé frecuencias entre 100kHz y 400kHz, pero ninguna parecía funcionar. El pin ACC se eleva a 3,3 V mediante una resistencia de 10 k, lo que permite los aceleradores de tiempo de subida. Los condensadores están lo más cerca posible del FDC.
Debido a que el cambiador de nivel es defectuoso, no puedo cargar ninguna imagen de rastreo. Lo siento por eso, pero gracias por su ayuda de todos modos.
El Arduino ya tiene resistencias pullup incorporadas. Esto puede estar afectando su capacidad para bajar las líneas lo suficiente. Deshabilite los pullups integrados o elimine los pullups externos de 10KΩ y vea si la situación mejora.
Aquí hay algunas ideas, lo siento 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 hacer un preámbulo de cada operación con un bit de INICIO seguido de un bit de PARADA. 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 retrasos para que su velocidad de comunicación I2C no sea demasiado rápida. 400kHz debería funcionar de manera confiable.
Finalmente, en su código I2C en Arduino, no configure la salida en alto cuando desee transmitir un nivel alto. En su lugar, configure el pin (SDA o SCL) para que se ingrese, luego las resistencias se encargarán de subir los pines. Si es posible que nunca lleve los pines SDA y SCL a un nivel alto, puede quitar el cambiador de nivel por completo y usar solo la resistencia pull-up a 3.3 voltios para esos pines. 3,3 voltios en los pines de entrada de Arduino deben ser lo suficientemente altos para detectar un estado alto.
Comience con un circuito más simple: está usando un arduino de 5v, solo use un Arduino de 3.3v y su dispositivo esclavo de 3.3v. El atmega328 está clasificado para operación de 2-5v a varias velocidades, por lo que si desea cambiar el cristal y la entrada, puede reutilizar el que tiene, solo consulte la hoja de especificaciones para saber qué velocidades debe funcionar y qué voltajes. He leído que algunas personas tienen suerte incluso con solo 20 mhz completos con solo 3.3v. Con solo el 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 de 5v por algún motivo. Los clones chinos de eBay en realidad funcionan muy bien, pero por lo general se basan en el atmel 32u4 que tiene un USB incorporado para evitar el costo de un chip externo. El mayor inconveniente para ellos es que el envío es de un mes.
¡Retire el convertidor de nivel!
Dado que los controladores I2C son de drenaje abierto, puede conectarlos sin usar un convertidor de nivel.
Los controladores de bus I2C son de "drenaje abierto", lo que significa que pueden bajar la línea de señal correspondiente, pero no pueden subirla.
Ref.: https://learn.sparkfun.com/tutorials/i2c/i2c-at-the-hardware-level
Nick Alexeev
Jota
Sam Gibson
J. Mostaza
Sam Gibson
ACC
conectado el pin en el PCA9512A. (b) La ubicación física de los capacitores es importante. (c) Dijiste: " 10k pullups a 5V (Arduino Mega interno) " Un Arduino Mega usa el MCU ATmega1280, pero su especificación (ver página 355) dice que las resistencias pull-up internas están entre 20k y 50k. (e) Espero ver los rastros del alcance.próximo truco
bitsmack