MPU6050 no ACK

G2 LaunchPad (no) conectado a MPU-6050

Estoy tratando de hacer que mi MSP430 se comunique con un sensor MPU-6050 a través de I2C. Si alguien puede verificar este hardware y ver si hay algún problema, se lo agradecería. Las resistencias están conectadas al riel rojo. Ahora mismo son 2,2k, pero también he probado 8k y 10k.

Y el código sigue enganchado en la línea que se indica a continuación. Bastante seguro de que el esclavo no está devolviendo una señal de reconocimiento:

    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent (UCTXSTP auto clears after STOP is sent)
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C start condition with UCTR flag for transmit
    while((IFG2 & UCB0TXIFG) == 0);     //UCB0TXIFG is set immidiately (UCB0TXIFG is set to indicate TXBUF is ready for more data) 
    UCB0TXBUF = registerAddr;           //write registerAddr in TX buffer
    __delay_cycles(1000);
    while((IFG2 & UCB0TXIFG) == 0);     // CODE GETS STUCK HERE.
                                                         //wait until TX buffer is empty and transmitted  
    UCB0CTL1 &= ~UCTR;                // Clear I2C TX flag for receive
    UCB0CTL1 |= UCTXSTT + UCTXNACK;    // I2C start condition with NACK for single byte reading
    while (UCB0CTL1 & UCTXSTT);             // Start condition sent? RXBuffer full?
    receivedByte = UCB0RXBUF;
    UCB0CTL1 |= UCTXSTP;                    // I2C stop condition
    return receivedByte;
¿Puede describir su solución de problemas?
A menudo, los buses de tablero tienen una ruptura intencional en el medio. ¿Está SEGURO de que sus buses I2C están elevados, como usted midió?
Si puede capturar alguna actividad I2C con un osciloscopio, publíquela.
¿El "cliente" reacciona de alguna manera?
¿Qué dirección ( registerAddr) estás usando?
Continuidad de la protoboard confirmada con un multímetro.
He confirmado que los buses I2C están a 3.5V. El dispositivo del cliente no tiene indicadores ni luces visibles para que compruebe si está respondiendo. No he llegado a darle sentido a esa otra respuesta. Estoy tratando de acceder de forma remota a la dirección de registro 0x75. Intenté implementar la respuesta que obtuve en otro lugar al no habilitar las interrupciones, pero eso no hizo ninguna diferencia.
Así es como entiendo las cosas con las interrupciones: ya sea que estén habilitadas o no, las banderas de interrupción se encienden y apagan y aún se pueden sondear manualmente. Habilitar interrupciones solo determina si el flujo de control se transfiere automáticamente al vector/rutinas de interrupción.
Bien. El punto es que, si habilita las interrupciones sin definir ningún controlador , enviará su CPU a la maleza y no podrá lograr nada útil.
@DaveTweed No sabía eso, ¡gracias! Pensé que simplemente ignoraría las cosas y seguiría con su vida.
Ah, y algunas soluciones de problemas que olvidé mencionar: Escribí un ciclo para buscar una señal ACK de todas las direcciones I2C entre 0x00 y 0xFB (un límite superior arbitrario). No se informa nada. La última vez que puse un o-scope a SDA y SCL, ambos estaban en un nivel alto constante.
Si su SCL nunca baja, está mirando el pin incorrecto o no tiene su MCU configurado correctamente para I2C, o no ha descubierto cómo usar el disparador de alcance.
@ChrisStratton Me has hecho pensar que es un problema de software. Mencionaste grandes puntos y cargué un código que funcionó para que dos MSP se comunicaran entre sí. Ejecuté este código en la configuración de hardware "incorrecta", el hardware que estoy tratando de hacer funcionar ahora. Obviamente, el software no hará lo que se pretende, ¡pero ahora tengo una señal de reloj ! Voy a volver a sumergirme en el software, comparar los dos programas y ver qué pasa. Gracias por tus comentarios. Estoy un poco avergonzado de no haber pensado en probar este paso de solución de problemas antes.
Solución de problemas que he probado hasta ahora: diferentes MSP430. Modelos idénticos, unidades diferentes. Con y sin protoboard. Con y sin cables de puente. Actualmente tiene cables soldados en esclavo e insertados en encabezados hembra en Launchpad. Diferentes valores de resistencia (2k, 8k, 10k). La placa de conexiones del esclavo actual tiene resistencias integradas. Muchos programas de muestra diferentes. Las variaciones incluyen el uso de interrupciones, no usar interrupciones pero confiar en la funcionalidad I2C incorporada. Qué funciona: Puedo hacer que dos MSP hablen sobre I2C. ¿Qué tiene un MSP430 que no tenga un acelerómetro?
Eso es probar cosas diferentes y ver lo que no funciona, no solucionar problemas. Necesitas encontrar una manera de ver las comunicaciones. Un Bus Pirate es probablemente nuestra forma más barata de entrar, aunque está lejos de ser ideal.

Respuestas (1)

Según la fotografía, el voltaje de referencia de E/S lógica del sensor no está conectado y flota.