Hallo zusammen,
ich habe gerade eine Merkwürdigkeit: Ich habe eine Schleife, die prüfen
soll, ob Pins high sind, die niemals abbricht, obwohl das Oszilloskop
sagt, daß die Pins eindeutig im High-Zustand sind. Die Schleife ist
einfach:
1 | uint_fast8_t i2c_bitbang_waitbusy(I2C_TypeDef *I2Cx)
|
2 | {
|
3 | volatile bool scl, sda;
|
4 | do
|
5 | {
|
6 | scl = GPIOB->IDR & GPIO_Pin_8;
|
7 | sda = GPIOB->IDR & GPIO_Pin_9;
|
8 | }
|
9 | while( (!scl) || (!sda) );
|
10 | return EXIT_SUCCESS;
|
11 | }
|
Beim ersten Aufruf bricht diese Funktion nie ab. Setze ich im Debugger
die Variablen so, daß die Schleife abbricht, reagiert sie ab dem zweiten
Durchlauf wie erwartet.
Der Blick in den Debugger ins Register IDR sagt mir, daß die Pins low
seien, was zum niemals-Abbrechen paßt. Das Oszilloskop sagt mir aber
eindeutig, daß die Pins auf +5V liegen. Beide sind als Open Drain Output
eingestellt. Der Peripherie-Takt ist natürlich auch eingeschaltet.
Was kann dazu führen, daß das Register IDR nicht den extern anliegenen
Zustand widerspiegelt?