Forum: Mikrocontroller und Digitale Elektronik I2C Master Receive, Probleme mit SCL nach ReStart


von fxlxo (Gast)


Lesenswert?

Hallo,

ich versuche aus der MPU6050 1Byte zulesen.
Dazu benutze ich Interrupts und eine I2C_freq von 5000Hz(ja so wenig... 
zum testen erstmal) auf dem STM32F103C8T6.

Nun habe ich folgendes gelesen und versucht umzusetzen:
Refrence Manual RM0008 (ST),
Application Report SLVA704 (Texas Instruments),
Application Note AN2824 (ST),

Das Problem:
Der Takt hört auf der SCL-Leitung wird nach schätzungsweise(hab nur 
1-Channel Oszi) dem 3ten Byten, also dem Adressbyte mit ReadBit, auf und 
dementsprechend lese ich was falsches ein.
Komisch finde ich, dass die Interruptflags alle so kommen, wie erwartet:
Erst StartF, dann AddrF, dann wieder StartF und zum Schluss auch noch 
das RxNEF.

langsam lese ich schon auf der 5ten Seite der Suchergebnisse von 
Google...

Wenn ich die Interrupts ausmache und Polling mache, funktioniert alles 
wunderbar.

Wie lest Ihr einzelne Bytes mit Interrupts auf den STM-Dinger aus?

Hier meine I2C_EV_ISR:
1
void i2c_handleEventInterrupt_ReadMethod1(void){
2
3
  if(i2c1_EV_ISR_Count < 25){
4
    i2cDebugISRanfang[(i2c1_EV_ISR_Count* 2) +1] = I2C_Module->SR2;
5
    i2cDebugISRanfang[(i2c1_EV_ISR_Count* 2)] = I2C_Module->SR1;
6
  }
7
8
  //const uint16_t readSR1 = I2C_ReadRegister(I2C_Module, I2C_Register_SR1);
9
  if(i2cDirectionWrite){
10
    if(I2C_GetFlagStatus(I2C_Module, I2C_FLAG_SB) == SET){
11
      I2C_ReadRegister(I2C_Module, I2C_Register_SR1);
12
       I2C_Send7bitAddress(I2C_Module, deviceAddress, I2C_Direction_Transmitter);
13
14
    }else if(I2C_GetFlagStatus(I2C_Module, I2C_FLAG_ADDR) == SET){
15
      I2C_ReadRegister(I2C_Module, I2C_Register_SR1);
16
      I2C_ReadRegister(I2C_Module, I2C_Register_SR2);
17
18
19
      if(rxRemainCount != 0){
20
        i2cDirectionWrite = 0;
21
22
        I2C_GenerateSTART(I2C_Module, ENABLE);
23
24
      }
25
      I2C_SendData(I2C_Module, regAddr);
26
27
    }else if(I2C_GetFlagStatus(I2C_Module, I2C_FLAG_TXE) == SET){
28
      if(txCount != 0){
29
        txCount--;
30
        I2C_SendData(I2C_Module, txBuffer[txBufferIndex++]);
31
        if(txCount  == 0){
32
        //letztes byte wurde in DR geschreiben
33
           I2C_GenerateSTOP(I2C_Module, ENABLE);
34
        }
35
      }else if(rxRemainCount != 0){
36
        i2cDirectionWrite = 0;
37
        ledAn();
38
        I2C_GenerateSTART(I2C_Module, ENABLE);
39
        //I2C_SendData(I2C_Module, 0); // um TXE mit Gewalt zu löschen
40
      }else if(txCount == 0){
41
        i2cBusyFlag = 0;
42
      }
43
    }
44
  }else{
45
    if(I2C_GetFlagStatus(I2C_Module, I2C_FLAG_SB) == SET){
46
      I2C_ReadRegister(I2C_Module, I2C_Register_SR1);
47
      I2C_Send7bitAddress(I2C_Module, deviceAddress, I2C_Direction_Receiver);
48
    }else if(I2C_GetFlagStatus(I2C_Module, I2C_FLAG_ADDR) == SET){
49
50
51
      //Clear ADDR_Flag
52
      I2C_ReadRegister(I2C_Module, I2C_Register_SR1);
53
      I2C_ReadRegister(I2C_Module, I2C_Register_SR2);
54
      //I2C_SendData(I2C_Module, 0); // um TXE mit Gewalt zu löschen
55
      //SingleByte Read
56
      if(rxRemainCount == 1){
57
        I2C_AcknowledgeConfig(I2C_Module, DISABLE);
58
        I2C_GenerateSTOP(I2C_Module, ENABLE);
59
      }
60
61
62
    }else if(I2C_GetFlagStatus(I2C_Module, I2C_FLAG_RXNE) == SET){
63
64
      rxBuffer[txBufferIndex++] = I2C_ReceiveData(I2C_Module);
65
66
      --rxRemainCount;
67
      if(rxRemainCount == 1){
68
        I2C_AcknowledgeConfig(I2C_Module, DISABLE);
69
        I2C_GenerateSTOP(I2C_Module, ENABLE);
70
      }else if(rxRemainCount == 0){
71
        i2cBusyFlag = 0;
72
      }
73
    }
74
75
  }
76
  //ledToggle();
77
  if(i2c1_EV_ISR_Count < 25){
78
    i2cDebugISRende[(i2c1_EV_ISR_Count* 2) +1] = I2C_Module->SR2;
79
    i2cDebugISRende[(i2c1_EV_ISR_Count* 2)] = I2C_Module->SR1;
80
  }
81
82
  ++i2c1_EV_ISR_Count;
83
84
85
}

Hier meine Debugausgabe am Terminal:

starting I2Cpp_test2...

I2C1::init()... !i2cModulisReady, enable tim2, enable GPIO AF, I2C1 
DeInit, I2C1 Init enable I2C1-Interrupts

starting...-------------

i2c1_EV_ISR_Count:      0


whileCount:             1
I2Cdev (0xd0) reading 1 bytes from 0x6b...
deviceAddress:          208
i2cDirectionWrite:      1
i2cBusyFlag:            1
regAddr:                107
rxBufferIndex:          0
rxRemainCount:          1
txCount:                0
txBufferIndex:          0
43. Done (1 read).
b:                      67
i2c1_EV_ISR_Count:      5

SRx bei i2c1_EV_ISR_Count:      0
ISRAnfang
1:                      1
2:                      3
ISREnde
1:                      0
2:                      3

SRx bei i2c1_EV_ISR_Count:      1
ISRAnfang
1:                      130
2:                      7
ISREnde
1:                      0
2:                      7

SRx bei i2c1_EV_ISR_Count:      2
ISRAnfang
1:                      1
2:                      3
ISREnde
1:                      0
2:                      3

SRx bei i2c1_EV_ISR_Count:      3
ISRAnfang
1:                      2
2:                      3
ISREnde
1:                      0
2:                      3

SRx bei i2c1_EV_ISR_Count:      4
ISRAnfang
1:                      64
2:                      3
ISREnde
1:                      0
2:                      3

SRx bei i2c1_EV_ISR_Count:      5
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      6
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      7
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      8
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      9
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      10
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      11
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      12
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      13
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      14
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      15
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      16
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      17
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      18
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0

SRx bei i2c1_EV_ISR_Count:      19
ISRAnfang
1:                      0
2:                      0
ISREnde
1:                      0
2:                      0
ISRERROR
1:                      0
2:                      0

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.