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