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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von fxlxo (Gast)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.