Forum: Mikrocontroller und Digitale Elektronik UART und I2C Konflikt mit STM32duino STM32G070


von Paul-Gerhard S. (paul-g)


Lesenswert?

Habe ein Problem bei der Verwendung von UART und I2C in Arduino IDE 2 
und STM32duino.
Die angeschlossene Hardware ist ein NUCLEO-G070RB. An das Board ist 
auser einem USB/Seriell-Wandler an PA10/PA9 nichts angeschlossen oder 
zusätzlich beschaltet.

Sketch ist folgender:
1
#include <Arduino.h>
2
#include <Wire.h>
3
#include <HardwareSerial.h>
4
5
6
HardwareSerial MySerial(PA10, PA9); // nucleo -> USB-Seriell-Wandler
7
//HardwareSerial MySerial(PA3, PA2); // nucleo -> stlink Virtual Com Port
8
9
10
void setup()
11
{
12
  MySerial.begin(9600);
13
  delay(200);
14
15
  MySerial.println("Test");
16
17
  //Wire.begin(); 
18
}
19
20
21
void loop()
22
{
23
  
24
}

Ich teste die Seriellen Schnittestellen bisher immer nacheinander. Beide 
Schnittstellen funktionieren. Sobald ich aber das Wire.begin() für I2C 
einkommentiere funktioniert nur die PA3/PA2 UART. Bei PA10/PA9 und 
Wire.begin() bekomme ich im Terminal nur noch ein ▒▒

Kennt sich jemand mit STM32duino aus oder weiß wie man da weiter nach 
einem Fehler sucht? Oder weiß jemand, dass UART an P10/PA9 und I2C nicht 
gleichzeitig verwendet werden darf?

Vielen Dank!

von N. M. (mani)


Lesenswert?

Paul-Gerhard S. schrieb:
> Oder weiß jemand, dass UART an P10/PA9 und I2C nicht gleichzeitig
> verwendet werden darf?

Natürlich nicht gleichzeitig an den gleichen Pins.
Das wird vermutlich hier dein Problem sein.

Ich würde also Mal versuchen entweder die UART oder die I2C Pins zu 
wechseln.

Kannst ja Mal die Initialisierung umdrehen.
Also erster Wire, dann UART.
Wenn dann UART funktioniert und I2C nicht klauen die sich gegenseitig 
eine Ressource z.B. die Pins.

Oder Wire dreht am System Takt oder so...
Dann mach Mal nach Wire.begin() nochmal ein MySerial.begin(9600)

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

N. M. schrieb:
> Ich würde also Mal versuchen

den Quellcode zu betrachten und auch bedingte Kompilierung einzufügen 
und mehr Textausgaben und ein C-Buch,
also suche welche Ports I2C und UART nutzen und stelle fest wer wann was 
verwendet und wer was verwenden kann!

nur als Anregung zum selberlernen
1
#if defined(__AVR_ATmega1284P__)
2
3
// --------------- serial in ---------------
4
  if (Serial.available() > 0) 
5
  { char incomingByte = (char)Serial.read();
6
    if(incomingByte == 13)  // Wenn das Enter ankommt
7
    { strcpy(serial_in_command, serial_in_buff);
8
//      strcpy(serial_in_buff,"");
9
      memset(&serial_in_buff[0], 0, sizeof(serial_in_buff));
10
      chr_cnt = 0;
11
      if(strlen(serial_in_command))
12
      { Serial.println(F("")); Serial.print(serial_in_command);  Serial.println(F(" -> erkannt!!!!")); 
13
#if defined(__AVR_ATmega1284P__)
14
        Serial1.println(serial_in_command);  
15
#endif
16
        inSTRauswertung();
17
      } // if(strlen(serial_in_command))
18
    }
19
    else // Falls kein Enter kommt muss der Text gespeichert werden in dem inText Array
20
    { if(isprint(incomingByte))
21
        serial_in_buff[chr_cnt++] = incomingByte;
22
    }
23
  } // if (Serial.available() > 0)

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Joachim B. schrieb:
> nur als Anregung zum selberlernen

Ein STM32 ist kein AVR!
Dein AVR hat keine alternative Portpins.

von N. M. (mani)


Lesenswert?

Joachim B. schrieb:
> den Quellcode zu betrachten und auch bedingte Kompilierung einzufügen und mehr 
Textausgaben und ein C-Buch

Ist Aufgabe des TOs. Ich gebe nur Anregungen.

Joachim B. schrieb:
> und mehr Textausgaben

Wenn die serielle Ausgabe nicht geht? Gute Idee! Sein TX macht Müll. Da 
bringt ihm dein Code Schnipsel mit RX einlesen auch nichts.

Apropos, ich würde da an deiner Stelle noch etwas in Out of Bound beim 
hinzufügen in den Puffer serial_in_buffer und in Input validation was 
die Null Terminierung angeht investieren.

Joachim B. schrieb:
> nur als Anregung zum selberlernen

Brauche ich nicht, danke.
Ich würde einfach die Setup mit dem Debugger durchlaufen und die 
Register ansehen ob sie so stehen wie ich es erwarte.

von Joachim B. (jar)


Lesenswert?

Arduino F. schrieb:
> Dein AVR hat keine alternative Portpins

Danke, ich weiß das, aber z.B. ein ESP hat alternative Portpins und man 
muß halt beim STM auch mal recherchieren!
Ferner erinnere ich mich auch daran daß es STM gibt die nicht alle Pins 
nutzen können oder Fake waren, war hier

Beitrag "wie Bluepill Board prüfen?"

N. M. schrieb:
> Apropos, ich würde da an deiner Stelle noch etwas in Out of Bound beim
> hinzufügen in den Puffer serial_in_buffer und in Input validation was
> die Null Terminierung angeht investieren.

ist drin und wird auf Überlauf geprüft, das war ein Beispiel auf die 
Schnelle, ich kann nicht dem TO alle Arbeit zm selberlernen abnehmen.
Hilfe zur Selbsthilfe war meine Idee.

: Bearbeitet durch User
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.