El esclavo I2C no reconoce constantemente

6

Estoy tratando de comunicarme con un módulo Cypress CapSense, modelo CY8CMBR3106S. Durante las pruebas iniciales, utilicé el puente CY3240-I2USB USB-I2C de Cypress, que funciona perfectamente. Luego me mudé a un Arduino para hacer un prototipo de mi propia aplicación. Sin embargo, parece que no consigo que el Arduino se comunique de manera confiable con el controlador CapSense. Usando el bosquejo del escáner I2C encontrado aquí , el Arduino descubre el controlador CapSense tal vez una vez de cada 40 intentos.

En un intento de depurar esto, localicé el bus utilizando tanto el puente Cypress USB-I2C como el Arduino. Descubrí que el controlador siempre da un ACK con el puente Cypress, y casi nunca genera un ACK con el Arduino. Sin embargo, aparte de los diferentes voltajes y velocidades de reloj (con los que he jugado en vano), parece que no puedo encontrar diferencias importantes entre los marcos enviados desde las dos fuentes diferentes, lo que explicaría los ACK inconsistentes.

En este punto, me siento algo perdido: cualquier consejo sería muy apreciado. Gracias!

Aquí hay algunas capturas de alcance: tenga en cuenta que los canales 1 y 2 son SCL y SDA, respectivamente.

Comunicación exitosa utilizando el puente Cypress (observe ACK después del 8º pulso de reloj)

ComunicaciónfallidausandoArduino(notafaltadeACK)

Comunicación exitosa muy rara usando Arduino

    
pregunta djrapp

1 respuesta

3

Como se discutió en los comentarios anteriores, la solución en este caso fue aumentar la frecuencia de las transmisiones I2C.

Según la hoja de datos, el controlador Cypress CapSense da un NACK en la primera transacción I2C después de pasar al estado activo. Como ha señalado @Roger Rowland , después de aproximadamente 340 ms de inactividad en el bus, el controlador entra en un nivel bajo Estado del poder. Dado que mis transmisiones estaban más separadas que este tiempo de espera, cada transmisión despertaría el dispositivo del estado de bajo consumo al estado activo y recibiría un NACK. Este problema se resuelve aumentando la frecuencia de las transmisiones a menos del valor de tiempo de espera, o repitiendo una transmisión determinada de forma consecutiva hasta que se reciba un ACK.

    
respondido por el djrapp

Lea otras preguntas en las etiquetas