I2C Probleme am PIC18F26K42

OP #7496808
Lesenswert?

Hallo zusammen,

ich komme hier leider allein nicht weiter. Mein PIC Sendet und empfängt daten via I2C2 von einem Temperatur sensor. Funktioniert alles tippitoppi

Nun möchte ich via I2C1 einen 12 bit DAC Ansteuern der in abhängigkeit der Temperatur seine Spannung ändert. Soweit so gut.

Nun das "problem" wenn ich wie bei I2C2 auch die MCC generierten Funktionen nutze (die dort ja wunderbar funktionieren) sendet er mir genau 2 byte aber nichts aus den daten.

Daraufhin habe ich eine eigene funktion gebaut die so aussieht:

1
void writeADC(  uint8_t adress, uint8_t adress2, 
2
                uint8_t byte1, uint8_t byte2) {
3
        if(!I2C1CON0bits.EN)
4
        {
5
            //CNTIF 0; ACKTIF 0; WRIF 0; ADRIF 0; PCIF 0; RSCIF 0; SCIF 0; 
6
            I2C1PIR = 0x00;
7
            //CNTIE disabled; ACKTIE disabled; WRIE disabled; ADRIE disabled; PCIE disabled; RSCIE disabled; SCIE disabled; 
8
            I2C1PIE = 0x00;
9
            //BTOIF No bus timout; BCLIF No bus collision detected; NACKIF No NACK/Error detected; BTOIE disabled; BCLIE disabled; NACKIE disabled; 
10
            I2C1ERR = 0x00;
11
            //Count register 
12
            I2C1CNT = 0xFF;
13
            //Enable I2C1
14
            I2C1CON0bits.EN = 1;
15
        }
16
        
17
        I2C1TXB  = adress;
18
        __delay_us(100);
19
        
20
        I2C1TXB  = adress2;
21
       __delay_us(100);
22
        I2C1TXB  = byte1;
23
       __delay_us(100);
24
        I2C1TXB  = byte2;
25
        __delay_us(86);
26

27
         //Disable I2C1
28
        I2C1CON0bits.EN = 0;
29
        //CNTIF 0; ACKTIF 0; WRIF 0; ADRIF 0; PCIF 0; RSCIF 0; SCIF 0; 
30
        I2C1PIR = 0x00;
31
        //Set Clear Buffer Flag
32
        I2C1STAT1bits.CLRBF = 1;
33
}

nun kommen (gemessen mit dem Oszi) alle signale an, aber es tut sich nichts... hat jemand eie idee?

Vielen Dank euch. der Konverter ist ein MCP4725

PS: Habe ich möglicherweise die Daten falsch übergeben das die MCC funktion sie nicht gesendet hat??

1
//dataDAC ist ein uint16_t
2
//ADC und DAC habe ich bei der bennenung mal verwechselt, stimmt jedoch
3
I2C1_Write2ByteRegister(I2C1_ADC_ADRESS, I2C1_ADC_BIT1, dataDAC);
4

5
void I2C1_Write2ByteRegister(i2c1_address_t address, uint8_t reg, uint16_t data)
6
{
7
    while(!I2C1_Open(address)); // sit here until we get the bus..
8
    I2C1_SetDataCompleteCallback(wr2RegCompleteHandler,&data);
9
    I2C1_SetBuffer(&reg,1);
10
    I2C1_SetAddressNackCallback(NULL,NULL); //NACK polling?
11
    I2C1_MasterWrite();
12
    while(I2C1_BUSY == I2C1_Close()); // sit here until finished.
13
}
OP #7496833
Lesenswert?

Hallo Andreas,

danke für deine Antwort. Aus dem I2C Baustein habe ich im grunde extrahiert das er die Register füllt und dann in einem Polling interrupt darauf wartet das wieder frei wird. nur sendet er wie gesagt die Daten nicht. das mit dem delay kommt mir ebenfalls irgendwie sehr merkwürdig vor, aber laut dem Datenströmen die am oszi rauskommen funktioniert es. start bit, adresse1, adresse, 2 datenbytes und stopbit dazwischen mit den ack bits alles wie es soll...

Die MCC funktionen sind leider so verschachtelt das ich irgendwann ausgestiegen bi :(

OP #7497116
Lesenswert?

Also ich bin ein gutes Stück weiter, ich habe rausgefunden warum die MCC nicht ging, ich habe als adresse stehts das komplette byte inkl. RW bit agegeben intern jedoch shiftet er um 1 und setzt das rw bit selbst. Nun sendet er alle daten, ausser!! das letzte byte, hier sedet er nur 4 bit dann ist sense... jemand eine idee??

OP #7497192
Lesenswert?

Okay also falls jemand ein ähnliches Problem haben sollte, hier die Lösung, scheibar gibt es einen fehler in der while schleife. in Fakt schliest sich der i2c bus mit der mcc stadard funktion BEVOR alle daten übertragen werden konnten, ein kleines delay ach dem Masterwrite und vor dem close löst das problem. und erzeugt auch im oszi keine überflüssigen takte oä.

VG :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren