Wie das immer so ist: Die Dinge von denen man annimmt sie wären einfach
und schnell erledigt sind es dann nicht.
Ich migriere meine Sourcen von STM8S103 so, dass ich sie auch auf einem
STM8S105 verwenden kann und war überrascht, dass nach dem Anpassen
meines speziellen Bootloaders für STM8 fast alles lief.
Aber eben nur "fast".
Mein Problem hängt (mal wieder) mit I2C zusammen, das will auf (m)einem
s105 einfach nicht und das Problem ist, wie ich glaube, dass die Pins
für B4 und B5 auf I2C geremappt werden müssen (was sie bei einem 103er
nicht müssen).
Hier wirds jetzt (nicht wirklich) lustig.
Die Adresse des Optionbytes fuer "alternate function remap" liegt an
Adresse 0x4803 und das Bit zum Setzen der alternate Funktion ist 6.
Ein:
1 | #define ARF *(unsigned char*) 0x4803
|
2 | #define ARF6 (1 << 6)
|
3 | |
4 | .
|
5 | .
|
6 |
|
7 | ARF= |= ARF6;
|
führt nicht zum Erfolg, wenn man das Datenblatt weiter studiert (oder
besser gesagt, wenn ich das richtig interpretiert habe), dann muss der
Flashspeicher für das Optionbyte das man schreiben möchte noch entsperrt
werden, also mache ich ein
1 | #define FLASH_PUKR *(unsigned char*) 0x5062
|
2 | |
3 | .
|
4 | .
|
5 |
|
6 | FLASH_PUKR = 0x56;
|
7 | FLASH_PUKR = 0xAE;
|
weil das die Abfolge ist, den Flash zu entsperren und ich dachte die
Optionbytes setzen zu können.
Das haut aber nicht hin.
Den Code den ich für I2C verwende ist der, den ich auch für einen
STM8S103 verwende und dort auch gut funktioniert. Im Datenblatt habe ich
keine Unterschiede beim Initialisieren und verwenden des I2C mit
STM8S103 und STM8S105 gefunden (ich habe die von mir verwendeten
Register und Registerbits der einzelnen Controller verglichen).
Wer kennt die Fallstricke bei einem STM8S105 und leuchtet mit der
Taschenlampe damit mir ein Licht aufgeht ?
By the way: Das Datenblat des STM8S104 hat definitiv einen Fehler (siehe
Screenshot): Es führt auf Seite 111 das Autofunction-Remappbit 6 zweimal
auf (anstelle von Remappbit 7).