Hallo alle zusammen :P Ich benutze das STM324x91-Eval Entwicklungsboard und habe einen separaten IC an das I2C angeschlossen. Aber ich habe ein ähnliches Problem wie folgender User: https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy%2est%2ecom%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fSTM32F103XX%20I2C%20Busy%20Flag%20after%20unsuccessful%20transfer&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=458 Wenn ich den Befehl "HAL_I2C_Mem_Read" ausführe kommt es gelegentlich zu einem Timeout error. Manchmal funktioniert der nächste Befehl wieder, manchmal kommt beim nächsten Befehl allerdings eine "Busy Meldung". Diese bekomme ich dann nicht mehr weg. Wenn ich in diesem Zustand SDA und SCL messe fällt auf, dass SCL zwar auf high ist SDA aber aucf low. Außerdem kommen keine Clock Signale mehr. Why this error hapens and what can i do? Warum passiert dieser Fehler und was kann man dagegen tun? Im Link weiter oben, werden folgende Zeilen als abhilfe verwendet. SET_BIT(hi2c1.Instance->CR1, I2C_CR1_STOP); I2C_WaitOnFlagUntilTimeout(&hi2c1, I2C_FLAG_BUSY, SET, 1000); Wenn ich diese in meinen Code einfüge tritt er Fehler allerdings weiterhin auf. Allerdings sind die Spannungen an SDA und SCL nach dem Fehler nicht immer gleich. Manchmal sind beide Unterschiedlich, manchmal sind beide Signale low oder High. Erst nach einem Hardware Reset sind wieder Clock Signale zu erkennen. Hier ist mein verwendeter Code:
1 | zaehler =0; |
2 | do
|
3 | {
|
4 | while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY); |
5 | test = HAL_I2C_Mem_Read(&hi2c1, panel_touch_adresse, adresse_anpassen(mxt_object_message_count_t44.start_address), I2C_MEMADD_SIZE_16BIT, (uint8_t *)buffer, mxt_object_message_count_t44.size_minus_one +1, 100); |
6 | |
7 | if(test == HAL_ERROR) |
8 | {
|
9 | HAL_GPIO_WritePin(GPIOG, GPIO_PIN_7, RESET); |
10 | HAL_Delay(1000); |
11 | }
|
12 | if(test == HAL_BUSY) |
13 | {
|
14 | HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_10); |
15 | HAL_Delay(1000); |
16 | |
17 | |
18 | SET_BIT(hi2c1.Instance->CR1, I2C_CR1_STOP); |
19 | I2C_WaitOnFlagUntilTimeout(&hi2c1, I2C_FLAG_BUSY, SET, 1000,HAL_GetTick()); |
20 | }
|
21 | if(test == HAL_TIMEOUT) |
22 | {
|
23 | HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_12); |
24 | HAL_Delay(1000); |
25 | }
|
26 | |
27 | |
28 | zaehler++; |
29 | if (zaehler >=2) test = HAL_OK; //Nicht ok. Ich breche auf diese Weise die Schleife ab |
30 | |
31 | |
32 | }while(test != HAL_OK); |