I2C mit PIC32 und MCP4706 funktioniert nicht

Wir arbeiten derzeit an einem Batterieladegerät für ein Elektrofahrrad, aber Prototyping mit einer PIC32MX695F512H-Bausatzplatine und einem MCP4706-DAC, die auf eine Breakout-Platine gelötet und mit einem PICKIT3 programmiert wurden. Wir haben bisher ein paar andere Peripheriegeräte, die alle funktionieren, einschließlich eines 20x4-LCD, auch über I2C, also funktioniert zumindest das. Unser Problem ist, dass unser DAC mit 5 V arbeitet und 5 V ausgibt, unabhängig davon, ob wir eine Vref angeschlossen haben oder nicht. (Der Chip schaltet standardmäßig Vref auf Vdd, wenn nichts mit den Pins verbunden ist)

Der Ausgang des DAC geht an einen Spannungsfolger, der einen Leistungs-MOSFET steuert, wodurch eine variable Strommenge zur Batterie fließen kann, basierend auf Messwerten von einem Stromsensor (Inline) und einem Spannungssensor an den Batterieanschlüssen.

Relevante Codeschnipsel sind unten angehängt:

#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();
}

Wir bekommen nur Vref raus. Wir haben alle 8 Adressen ausprobiert, die das Brett haben kann, und keine Würfel.

Hat jemand einen Tipp, wie er uns helfen kann? wir stecken seit ein paar Tagen an diesem Problem fest. Danke.

Sehen Sie etwas auf den Leitungen, wenn Sie auf das Oszilloskop oder den Logikanalysator schauen?
Daran habe ich gar nicht gedacht. Wir schließen es gerade an, um einen Blick darauf zu werfen.
Dies ist nur ein 6-Pin-Gerät. Entlöten Sie es und versuchen Sie es mit einem anderen. Sie könnten viel Zeit mit einem Problem verschwenden, das nur für eine Instanz eines fehlerhaften Geräts spezifisch ist. Welches Paket verwendest du übrigens für diesen DAC? SOT oder DFN?
Befindet sich das funktionierende 20x4-LCD auf demselben I2C-Bus? Das bestätigt tendenziell, dass die Busspuren funktionieren.
Gleicher I2C-Bus, LCD funktioniert noch. SOT-Paket, also kann ich, obwohl es mühsam zu löten ist, immer ein anderes Gerät ausprobieren.

Antworten (2)

Wir haben es vor etwa ein oder zwei Wochen zum Laufen gebracht - entschuldigen Sie die Verzögerung. Es stellte sich heraus, dass der Chip entweder frittiert oder schlecht war. Wir haben ein anderes Breakout-Board verwendet (es ist ein winziges Paket, das schwer zu löten war und nur einen Breakout hatte), den Chip angelötet, funktioniert ganz gut. Gelöst markieren.

Sie konfigurieren die I2C-Leitungen als Ausgänge.

TRISD=0;                        //Sets Port D to output

Möglicherweise stören die Ausgangstreiber. Versuchen Sie, sie als Eingänge zu konfigurieren. (Das ist, was ich auf PIC24 tun muss.)