Forum: Mikrocontroller und Digitale Elektronik Problem STM32 + Si4703 Radio IC


von R. H. (breezer)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche nun schon seit geraumer Zeit diese Kombination zum Laufen 
zu bringen.

Als Grundlage habe ich mir die Sparkfun Si4703 Library für Arduino 
genommen und etwas umgeschrieben für den STM32: 
https://github.com/sparkfun/SparkFun_Si4703_Arduino_Library

Nun ergibt sich ein Problem welches ich überhaupt nicht nachvollziehen 
kann:

Das Radiomodul läuft nur wenn ich an einer ganz bestimmten Stelle ein 
Breakpoint in den Code einfüge und das Programm dann durch manuelles 
anklicken weiterlaufen lasse.

Wenn ich den Code einfach ohne Debugfunktion auf dem STM32 lade 
funktioniert das Radiomodul nicht.

in der Main routine rufe ich einmal si4703_init(); auf zum 
initialisieren des Si4703.

Hier der Code für den Si4703

Der besagte Breakpoint befindet sich am Ende der readRegisters() 
Funktion.
1
//Read the entire register control set from 0x00 to 0x0F
2
void readRegisters(){
3
4
  unsigned char inBuff[32];
5
6
  HAL_I2C_Master_Receive(&hi2c3, SI4703, inBuff, 32, 100);
7
8
  //Si4703 begins reading from register upper register of 0x0A and reads to 0x0F, then loops to 0x00.
9
  //Wire.requestFrom(SI4703, 32); //We want to read the entire register set from 0x0A to 0x09 = 32 bytes.
10
11
  //while(Wire.available() < 32) ; //Wait for 16 words/32 bytes to come back from slave I2C device
12
  //We may want some time-out error here
13
14
  //Remember, register 0x0A comes in first so we have to shuffle the array around a bit
15
  unsigned char i = 0;
16
17
  for(int x = 0x0A ; ; x++) { //Read in these 32 bytes
18
    if(x == 0x10) x = 0; //Loop back to zero
19
    si4703_registers[x] = inBuff[i] << 8;
20
    i++;
21
    si4703_registers[x] |= inBuff[i];
22
    i++;
23
    if(x == 0x09) break; //We're done!
24
  }
25
}  //<<<< wenn hier durch Breakpoint gestoppt wird und anschließend weitergelaufen lassen wird funktioniert das Radiomodul
26
27
//Write the current 9 control registers (0x02 to 0x07) to the Si4703
28
//It's a little weird, you don't write an I2C addres
29
//The Si4703 assumes you are writing to 0x02 first, then increments

: Bearbeitet durch User
von Och nöö (Gast)


Lesenswert?

R. H. schrieb:
> Hier der Code für den Si4703

Nicht schon wieder: kilometerlanger Sourcecode im Text.

Kannst du die Hinwise zum Posten von Code nicht verstehen?
Zu kleingedruckt? Bist schon lang genug hier dass du dir
wenigstens eine Lupe kaufen könntest.

von R. H. (breezer)


Lesenswert?

Danke für den Hinweis, ich habs geändert...

von Och nöö (Gast)


Lesenswert?

R. H. schrieb:
> Das Radiomodul läuft nur wenn ich an einer ganz bestimmten Stelle ein
> Breakpoint in den Code einfüge und das Programm dann durch manuelles
> anklicken weiterlaufen lasse.

Die Erfahrung zeigt dass so ein Breakpoint ein undefiniertes langes
Delay hinzufügt das eine Anordnung "irgendwo" braucht um dann zu
funktionieren. Das muss gar nicht direkt an oder in der Nähe der
Stelle sein an der unterbrochen wird.

Oft genug erlebt in meiner Anfängerzeit bei der es um das
Initialisieren von Text-LCDs ging.

Näheres werde ich im unübersichtlich geschriebenen Code nicht
nachforschen ....

von R. H. (breezer)


Lesenswert?

Hallo,

falls es jemanden interessiert:

Ich hab den Fehler jetzt gefunden, es lag nicht an irgendwelchen Delays.
Das Problem war die fehlende Initialisierung der inBuff bzw. outBuff 
Arrays.

Nach dem Ändern auf
1
unsigned char inBuff[32] = {0};
 funktioniert alles.

Keine Ahnung warum es im Debug mode auch ohne die Initialisierung 
funktioniert hat...

MfG

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