Forum: Compiler & IDEs PIC32MX I2C Problem


von David H. (davidm)


Angehängte Dateien:

Lesenswert?

Ich habe hier ein PIC32MX mit einem MCP3422 ADC.

Frage 1: Muss ich bevor ich hier ADC Werte Auslesen kann erstmal das 
Config register beschrieben werden? (Ich möchte die default Werte 
nehmen)


Frage 2: Warum bleibt SDA low nachdem ich versucht habe Bytes zu lesen? 
(ich bin mir ziemlich sicher das der MCP3422 diese auf low zieht)

1
void ADC_Init(void) {
2
    UINT32              actualClock;
3
    
4
    actualClock = I2CSetFrequency(ADC_I2C_BUS, GetPeripheralClock(), ADC_I2C_CLOCK_FREQ);
5
    if ( abs(actualClock-ADC_I2C_CLOCK_FREQ) > ADC_I2C_CLOCK_FREQ/10 )
6
    {
7
        DBPRINTF("Error: I2C1 clock frequency (%u) error exceeds 10%%.\n", (unsigned)actualClock);
8
    }
9
10
    // Enable the I2C bus
11
    I2CEnable(ADC_I2C_BUS, TRUE);
12
13
}
14
15
16
17
void ADC_get_value(void) {
18
19
    UINT8               i2cData[10];
20
    I2C_7_BIT_ADDRESS   SlaveAddress;
21
    BOOL                Success = TRUE;
22
    UINT8               i2cbyte[5];
23
    BYTE                ix;
24
    
25
    if( !StartTransfer(FALSE) )
26
    {
27
        while(1);
28
    }
29
30
    I2C_FORMAT_7_BIT_ADDRESS(SlaveAddress, 0x68, I2C_READ);
31
    i2cData[0] = SlaveAddress.byte;
32
    TransmitOneByte(i2cData[0]);
33
    
34
     if(!I2CByteWasAcknowledged(ADC_I2C_BUS))
35
            {
36
                DBPRINTF("Error: Sent byte was not acknowledged\n");
37
                Success = FALSE;
38
            }
39
40
      {
41
        if(I2CReceiverEnable(ADC_I2C_BUS, TRUE) == I2C_RECEIVE_OVERFLOW)
42
        {
43
            DBPRINTF("Error: I2C Receive Overflow\n");
44
            Success = FALSE;
45
        }
46
        else
47
        {
48
49
            for (ix=0; ix < 10; ix++) {
50
            
51
            while(!I2CReceivedDataIsAvailable(ADC_I2C_BUS));
52
            I2CAcknowledgeByte(ADC_I2C_BUS, TRUE);
53
            i2cbyte[ix] = I2CGetByte(ADC_I2C_BUS);
54
            DelayMs(10);
55
            }
56
            DelayMs(10);
57
        }
58
    }
59
60
         StopTransfer();




So ganz verstehe ich auch nicht die Reihenfolge hier:
1
 // Warten bis ein Byte da ist? und wer schaltet dann die clock Leitung?
2
 // oder wird hier einfach mal auf glueck getaktet bis was kommt?
3
4
     while(!I2CReceivedDataIsAvailable(ADC_I2C_BUS)); 
5
     I2CAcknowledgeByte(ADC_I2C_BUS, TRUE);
6
     i2cbyte[ix] = I2CGetByte(ADC_I2C_BUS);
7
     DelayMs(10);

: Bearbeitet durch User
von David H. (davidm)


Angehängte Dateien:

Lesenswert?

Das erste senden der Config mit einem Write scheint er zu machen.

Wenn ich dann aber lesen möchte liest er das erste Byte und Master 
sendet ACK.

Da wo eigentlich das zweite byte gelesen werden sollte hört der Master 
einfach mit dem Clock Signal auf und SDA/SCL bleiben Low.

Wenn ich nun SCL mit normalem Port I/O toggle dann zieht dann gibt der 
Slave die SDA Leitung wieder frei.
1
    if( !StartTransfer(FALSE) )
2
    {
3
        while(1);
4
    }
5
6
    I2C_FORMAT_7_BIT_ADDRESS(SlaveAddress, 0x68, I2C_READ);
7
    i2cData[0] = SlaveAddress.byte;
8
    TransmitOneByte(i2cData[0]);
9
    
10
     if(!I2CByteWasAcknowledged(ADC_I2C_BUS))
11
            {
12
                DBPRINTF("Error: Sent byte was not acknowledged\n");
13
                Success = FALSE;
14
            }
15
      {
16
        
17
        if(I2CReceiverEnable(ADC_I2C_BUS, TRUE) == I2C_RECEIVE_OVERFLOW)
18
        {
19
            DBPRINTF("Error: I2C Receive Overflow\n");
20
            Success = FALSE;
21
        }
22
        else
23
        {
24
           
25
while(!I2CReceivedDataIsAvailable(ADC_I2C_BUS));  <-- Liest 0 und Master sendet ACK
26
I2CAcknowledgeByte(ADC_I2C_BUS, TRUE);
27
i2cbyte[0] = I2CGetByte(ADC_I2C_BUS);
28
29
            
30
while(!I2CReceivedDataIsAvailable(ADC_I2C_BUS));  <-- hier kommt nix mehr / er bleibt in while()
31
I2CAcknowledgeByte(ADC_I2C_BUS, TRUE);
32
i2cbyte[1] = I2CGetByte(ADC_I2C_BUS);

: Bearbeitet durch User
von David H. (davidm)


Lesenswert?

Hat irgendwer vielleicht Beispielcode der die Micorchip lib verwendet 
und mehr als 1 Byte zurück liest?

von Gaetano (Gast)


Lesenswert?

Hello, I too have encountered this problem, how did you solve it?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.