Forum: Mikrocontroller und Digitale Elektronik STM8S105K4 / SDCC / I2C => Problem


von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

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).

von Axel S. (a-za-z0-9)


Lesenswert?

Ralph S. schrieb:
> das Problem ist, wie ich glaube, dass die Pins
> für B4 und B5 auf I2C geremappt werden müssen
>
> Die Adresse des Optionbytes fuer "alternate function remap" liegt an
> Adresse 0x4803 und das Bit zum Setzen der alternate Funktion ist 6.

> #define ARF *(unsigned char*) 0x4803
> #define ARF6 (1 << 6)
> ARF= |= ARF6;
>
> führt nicht zum Erfolg

Kann es so auch nicht. Die meisten Optionbytes gibt es zweimal, einmal 
in normaler Form und einmal negiert. Du mußt immer beide Bytes 
beschreiben. Wenn du in AFR (@ 0x4803) das Bit #6 setzt, muß du in NAFR 
(@ 0x4804) das Bit #6 löschen. Nur dann akzeptiert der STM8 die 
Funktion.

von Ralph S. (jjflash)


Lesenswert?

Habe ich, nachdem ich das hier gepostet habe, dann auch gemacht.

Außerdem habe ich das Option Bit im Flash-CR2 Register (und im negierten 
Register) gesetzt / gelöscht.

Kein Effekt.

Um zu sehen, ob mein I2C Code prinzipiell funktioniert, habe ich den 
STM8S105 nicht über meinen Bootloader gefüttert, sondern über einen 
ST-Link und hierbei das Bit für das Remapping gesetzt und siehe da, der 
I2C Code funktioniert.

Mein Problem ist also, wie ich aus dem laufenden Programm dieses 
Remapping Bit setzen kann.

Ich hätte nicht gedacht, dass mir das so Probleme bereitet, bei einem 
STM32 geht das Remapping problemlos !

von Ralph S. (jjflash)


Lesenswert?

Für diejenigen, die evtl. einmal dasselbe Problem haben, das hier hat 
dann funktioniert:

[code]
  i2c_init(1);                          // 2 = ca. 100kHz I2C Clock-Takt

  #if (f105_i2c == 1)

    // Unlockkey setzen
    FLASH_DUKR = 0xae;
    FLASH_DUKR = 0x56;

    // Modifying Optionbit erlauben
    FLASH_CR2 |= FLASH_CR2_OPT;
    FLASH_NCR2 &= ~FLASH_CR2_OPT;

    // Alternative Funktion fuer B4 und B5 auf I2C setzen
    AFR= ARF_AFR6;
    NAFR= ~(ARF_AFR6);

  #endif
[code]

Erst die I2C Schnittstelle "normal" initialisieren, über das DUKR EEProm 
und Flash "unlocken", das FLASH_CR2 Optionsbit setzen und danach das 
Alternate Function Remap Bit !

Irgendwie liebe ich solche Dinge zum Rumknobeln nicht, halten sie doch 
einen davon ab, wasm man machen möchte !

von $$$ (Gast)


Lesenswert?

Man koennte vor dem Schreiben pruefen, ob das Schreiben
ueberhaupt notwendig ist. Ist ja EEPROM...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.