I2C con PIC32 y MCP4706 no funciona

Estamos trabajando en un cargador de batería para una bicicleta eléctrica en este momento, pero estamos creando prototipos con una placa de kit PIC32MX695F512H y un DAC MCP4706 soldado en una placa de conexión, programada con un PICKIT3. Tenemos algunos otros periféricos que funcionan hasta ahora, incluida una pantalla LCD de 20x4 también sobre I2C, así que al menos eso funciona. Nuestro problema es que nuestro DAC funciona y emite 5 V, independientemente de si tenemos o no un Vref conectado. (el chip por defecto corta Vref a Vdd si no hay nada conectado a los pines)

La salida del DAC va a un seguidor de voltaje que controla un MOSFET de potencia, lo que permite que fluya una cantidad variable de corriente a la batería según las lecturas de un sensor de corriente (en línea) y un sensor de voltaje en los terminales de la batería.

Los fragmentos de código relevantes se adjuntan a continuación:

#define DAC 0x60
.
.
.
// Configure I2C registers
void ConfigI2C()
{
    //1 USES RD10 AS SCL1 AND RD 9 AS SDA1
    /// I2CxCON I2CxSTAT I2CxADD I2CxMSK I2CxTRN I2CxRCV
    I2C1BRG=0x186;                  //390 for 80MHz to 100KHz
    I2C1CONbits.A10M=0;             //Use 7-bit addresses
    I2C1CONbits.DISSLW=1;           //disable slew control for standard
    I2C1CONbits.ACKDT=0;            //Use and ACK not NACK
    I2C1ADD=22;                     //Sets slave address for PIC32
    TRISD=0;                        //Sets Port D to output
    I2C1CONbits.ON=1;               //turn on I2C
}
.
.
.
// Start
void I2C_start(void)
{
    I2C1CONbits.SEN=1;          //send start
    while(I2C1CONbits.SEN){}  //waits till start bit detected
}

void I2C_stop(void)
{
    I2C1CONbits.PEN=1;          //send stop
    while(I2C1CONbits.PEN){}    //waits till stop bit detected
}
.
.
.
void SendI2C3(char addrs,char regis, char data)
{
    char ack;
    I2C_start();
    ack=I2C_write(addrs); //Address for LED is 0x50
    ack=I2C_write(regis); //0xFE for LED
    ack=I2C_write(data);  //0x20to0x7F standard
    I2C_stop();
}

Acabamos de sacar Vref. Probamos las 8 direcciones que puede tener el tablero, y ningún dado.

¿Alguien tiene algún consejo sobre cómo ayudarnos? Hemos estado atascados en este problema durante un par de días. Gracias.

¿Ves algo que suceda en las líneas cuando las miras en el osciloscopio o en el analizador lógico?
Ni siquiera pensé en eso. Lo estamos conectando ahora mismo para echar un vistazo.
Este es solo un dispositivo de 6 pines. Desoldarlo y probar con otro. Podría perder mucho tiempo en un problema que es específico de una sola instancia de un dispositivo defectuoso. Por cierto, ¿qué paquete estás usando para ese DAC? SOT o DFN?
¿Está la pantalla LCD 20x4 en funcionamiento en el mismo bus I2C? Eso tiende a confirmar que los rastreos del autobús están funcionando.
Mismo bus I2C, LCD sigue funcionando. paquete SOT, así que aunque es un dolor de cabeza para soldar, siempre puedo probar con otro dispositivo.

Respuestas (2)

Lo hicimos funcionar hace una o dos semanas, perdón por la demora. Resulta que el chip estaba frito o malo. Usamos otra placa de conexión (es un paquete pequeño que fue difícil de soldar y solo tenía una conexión), soldamos el chip y funciona completamente bien. Marcandolo solucionado.

Está configurando las líneas I2C como salidas.

TRISD=0;                        //Sets Port D to output

Los controladores de salida pueden estar interfiriendo. Intente configurarlos como entradas. (Esto es lo que tengo que hacer en PIC24.)