Vielen Dank für die Antworten, leider komme ich erst jetzt zum
Antworten.
foobar schrieb:
> Sicher, dass der Test (warten auf 0) richtig rum ist?
Genau das wars, BTF soll ja nicht gesetzt sein.
Man sollt eben nicht 1 Uhr morgens noch Coden.
Gerd E. schrieb:
> Mw E. schrieb:
>> Wenn ich jetzt im Debugger den Registerwatch öffne, dann steht da 0x80
>> beim SR1.
>
> Ich würde dem Debugger an der Stelle nicht unbedingt vertrauen. Wenn der
> Debugger Register auslesen will, kann es zu einigen lustigen Effekten
> kommen die Fehler vorspiegeln wo gar keine sind.
Registerlesen beim I2C kann ja durchaus an der Statemachine rumspielen
(zB SR2 lesen resetet das ADDR Bit).
An der Stelle ist da zwar nichts im DaBla Dokumentiert, aber wer weis
was ST da ins Silizium gegossen hat.
Jedenfalls wird das auslesen der Register an der Statemachine gespielt
haben zB durch das DataRegister lesen und schon hats das BTF geflippt.
Wieso hat der PeripheralBus eigentlich keine Leitung für "das ist jetzt
eine Registerwatch Debugauslesung, bitte behalte die internen States der
Statemachine bei" ?! Wär doch mal ne gute Neuerung.
Jim M. schrieb:
> Die metrische Tonne Casts bringt hier nix IMHO.
Verzweiflungstat ;)
Ein volatile cast würde reichen.
Jim M. schrieb:
> Zeig mir wie "struct i2c" definiert ist und ich zeige Dir (vermutlich)
> Deinen Fehler.
Bittesehr:
1 | struct i2c {
|
2 | unsigned int CR1;
|
3 | unsigned int CR2;
|
4 | unsigned int OAR1;
|
5 | unsigned int OAR2;
|
6 | unsigned int DR;
|
7 | unsigned int SR1;
|
8 | unsigned int SR2;
|
9 | unsigned int CCR;
|
10 | unsigned int TRISE;
|
11 | };
|
es bringt übrigens nichts dort volatile vor das struct zu schreiben,
dann meckert der Compiler zurecht mit:
"periph/i2c_regdefs.h:14:1: warning: useless type qualifier in empty
declaration"
Erst durch das Casten wird das volatile, ist das struct volatile, so
auch seine Inhalte.
A. K. schrieb:
> Was soll es eigentlich bringen, die Adresse als uint zu übergeben und
> überall zu casten? Statt den Parameter gleich richtig zu definieren.
> Ganz allgemein würde ich empfehlen, Casts möglichst sparsam einzusetzen.
Es gibt ja nicht nur den einen I2C, also übergeb ich die Basisadresse
des I2C und lege dann das struct über die Register.
Da könnt man jetzt nochn enum nehmen.
Direkt nen Pointer aufn struct übergeben könnt man auch, aber dann muss
ich eben beim anlegen auch schon rumcasten.
Oder wie würdest du das machen?
Jedenfalls tut das jetzt, ab und zu gibts maln NACK nachm write, aber
das kann ja immermal vorkommen beim I2C wenn der Slave grade kein Bock
hat zu Antworten.