Forum: Mikrocontroller und Digitale Elektronik CC430 hängt zu lange fest


von Rangi J. (rangi)


Lesenswert?

Hallo Forum,
ich habe ein Problem mit dem CC430 von TI. Ich hoffe jemand kennt sich 
damit aus.
Wenn ich den Radio-Core aus dem Sleep aufwecke braucht dieser sehr lange 
um nach Idle oder Rx zu wechseln. Im Datenblatt steht:

"When the radio needs to transition from the SLEEP state to an active 
state (e.g., IDLE, RX or TX) the CPU must not go into a low power mode 
until the  Radio is active. This is reflected by the RF_RDYn signal 
transitioning from 1 to 0. This can be observed best on the programmable 
RFINx signals, e.g., the GDO2 signal fed to RFIN2 is programmed by 
default to RF_RDYn."

Das ist im Code auch so implementiert.
1
  TP1_ON();   //Zeitmessung
2
  while ((RF1AIN&0x04)== 0x04);                   // c-ready ?
3
  TP1_OFF();  //Zeitmessung
Jedoch dauert das bei mir ca. 200 ms. Ich habe auch keine weitere Angabe 
gefunden wie lange das dauern darf ausser das danach nochmal 810µs 
gewartet werden soll.
Was kann da falsch sein? 200 ms ist mich echt zu lange.

von Rangi J. (rangi)


Lesenswert?

Keiner eine Idee?

Der TI-Support hat seinen Namen auch verdient:
"The ASKTEXAS team is unfortunately not able to provide technical 
support on this range of products."
ASKTEXAS = Fragen ja, von Antworten haben wir nix gesagt.
und weiter:
"The WiLink family products are intended for High volume (OEM) 
manufacturers. If you are interested on technologies such as Bluetooth, 
WiFi and GPS, you could use our 3rd parties modules as a ready to use 
solution for your design."
Bitte verwende nicht diesen Schrott sonderen den anderen. Aha, jetzt 
soll ich meine Hardware komplett ändern weil die keine Antworten für 
dieses Produkt geben? Aber sie verkaufen es doch. aufreg

Keiner eine Idee? Ich bin wirklich in meinem Projekt darauf angewiesen 
das keine Wartezeit auftritt. Währenddessen werden Daten aufgenommen und 
die müssen gespeichert werden und soviel Speicher für nochmal 100ms hab 
ich einfach nicht.

von CC430 (Gast)


Lesenswert?

Hallo,

also 200ms sind definitiv zu lange. Irgendetwas stimmt mit deinem Code 
nicht.
Poste den doch mal.

Und zu deinem Projekt:
Du hast also irgendeine Form von Datenlogger. Dieser nimmt 
kontinuierlich  Daten auf und zu einem bestimmten Zeitpunkt erwartest du 
ein Signal von außen, weshalb du den Receiver benötigst?

von Rangi J. (rangi)


Lesenswert?

Zum Projekt: Viele Funkknoten lauschen auf einem Medium. Jetzt wird ein 
externes Ereignis festgestellt und alles anderen Teilnehmer müssen per 
Funk darüber informiert werden. Diese lauschen ständig und halten 
rückwirkend nur eine bestimmte Zeit an Daten vorrätig. Und wenn der 
initiierende Knoten schon so lange braucht um seinen eigenen Funk 
aufzuwecken, dann überschreiben die anderen Funkknoten bereits ihre 
Daten und das Ereigns ist verloren.
Quelltext ist ganz schön viel, ich habe den Code TI zum lesen und 
schreiben der Register verwendet. siehe slac525a.zip
"SLAA465 - CC430 RF Examples\CC430x613x RF 
examples\RF_Examples_CCS\Asynchronous_Communication\HAL\RF1A.c"
Der entscheidende Punkt ist in der Funktion
1
u8 Strobe(u8 _bStrobe)
2
{
3
   u8 statusByte = 0;
4
   //u16 gdo_state;
5
 
6
   // Check for valid strobe command
7
   if((_bStrobe == 0xBD) || ((_bStrobe >= RF_SRES) && (_bStrobe <= RF_SNOP)))
8
   {     
9
     
10
      // Clear the Status read flag
11
      RF1AIFCTL1 &= ~(RFSTATIFG);
12
     
13
      // Wait for radio to be ready for next instruction
14
      while( !(RF1AIFCTL1 & RFINSTRIFG));
15
#if 1
16
      // Write the strobe instruction
17
      if ((_bStrobe > RF_SRES) && (_bStrobe < RF_SNOP))
18
      {
19
         //IOCFG steht dauerhaft auf 0x29 und muss nicht immer umkonfiguriert werden
20
         //gdo_state = GetRegister(IOCFG2); // buffer IOCFG2 state
21
         //SetRegister(IOCFG2, 0x29); // c-ready to GDO2
22
       
23
         RF1AINSTRB = _bStrobe;
24
         if ( (RF1AIN&0x04)== 0x04 )             // chip at sleep mode
25
         {
26
            if ( (_bStrobe == RF_SXOFF) || (_bStrobe == RF_SPWD) || (_bStrobe == RF_SWOR) ) { }
27
            else   
28
            {
29
               IO_TP1_ON();  // Zeitmessung
30
               while ((RF1AIN&0x04)== 0x04);                   // c-ready ?
31
               IO_TP1_OFF();  // Zeitmessung
32
               TIM_vDelay(900 us);   // Delay for ~810usec at 12MHz CPU clock
33
            }
34
         }
35
         //SetRegister(IOCFG2, gdo_state); // restore IOCFG2 setting
36
      }
37
      else      // chip active mode
38
      {
39
         RF1AINSTRB = _bStrobe;     
40
      }
41
#else
42
      // Versuch ohne Abprüfung von C-READY - kein Erfolg
43
      RF1AINSTRB = _bStrobe;
44
#endif
45
      statusByte = RF1ASTATB;
46
47
   }
48
   return statusByte;
49
}
50
51
bool WaitForIdle(void)
52
{
53
 u8 ba,bb;
54
  for(ba=25;ba;ba--)              /*maximal n loops warten*/
55
  {
56
    switch(GetChipState())  /* chipstate auslesen und fehlerbehandlung*/
57
    {
58
      case eneCSt_TX:          /*tue nichts - er ist am senden oder vorbereiten*/
59
      case eneCSt_FSTXOn:      /*ein folgender interrupt wird abgewartet*/
60
        break;
61
      case eneCSt_RX:
62
        Strobe(REG_SIDLE);
63
        /*nobreak*/
64
      case eneCSt_Idle:
65
        return (true); /*for-schleife und switch verlassen*/
66
      case eneCSt_Sleep:
67
        Strobe(REG_SIDLE);  // << - Hier ist die Wartezeit - RF war im Sleep und soll nach IDLE wechseln
68
        break;
69
      case eneCSt_RXFIFO_Overflow:
70
        bStrobe(REG_SFRX);
71
        break;
72
      case eneCSt_TXFIFO_Underflow:
73
        Strobe(REG_SFTX);
74
        break;
75
      default:
76
      /*alle anderen states die automatisch nach bestimmter zeit nach idle zurueckfallen*/
77
        break;
78
    }
79
    for(bb=64;bb;bb--)
80
    {
81
      asm(" NOP");   /*kurze wartezeit um zeit zugeben nach idle zu wechseln*/
82
    }
83
  }
84
  return (false);
85
}

von Rangi J. (rangi)


Lesenswert?

Vergessen, diese Bits sind gesetzt:
MCSM0.XOSC_FORCE_ON=1
XT2OFF=0

von nur mal so (Gast)


Lesenswert?

In der for Schleife steht "maximal" 25 loops warten. Die Schleife wird 
aber nie vorher abgebrochen!

von Rangi J. (rangi)


Lesenswert?

@nur mal so
ausser in der Zeile wo steht : "/*for-schleife und switch verlassen*/"

von Rangi J. (rangi)


Lesenswert?

Ich wollte meinen alten Beitrag mal wieder nach oben kehren. Ich habe 
noch immer keine Lösung für das Problem gefunden.
Ich habe jetzt den Wake-On-Radio Mode so eingestellt, dass er alle 210ms 
wach wird und sich danach wieder schlafen legt. Daten können auch 
empfangen werden, wenn ich von einem anderen Funksystem 220ms 
dauer-sende.
Möchte ich aber selber meinen Funkcore aus dem Wake-On-Radio aufwecken 
bleibt das Strobe "SIDLE" so lange hängen, bis der nächste Zylkus des 
WOR-Timers dran ist. Im schlimmsten Fall also 210ms.
Und Schuld ist diese Zeile:
1
 while ((RF1AIN&0x04)== 0x04);
in der Strobe-Funktion von TI. Hier wird so lange gewartet.
Programmablauf beim Senden ist:
- State des Core abfrage, Ergebnis 0 (Sleep)
- Strobe SIDLE ausführen (jetzt hängt der Befehlt wie oben beschrieben)
- Nach der Pause ist der Core wie normal im Idle

Kann ich den Radio-Core noch irgendwie anders aufwecken? Was ist das für 
ein merkwürdiges Verhalten?

von Rangi J. (rangi)


Lesenswert?

Keiner ein Idee?

von Rangi J. (rangi)


Lesenswert?

Nach langer Forschungsarbeit habe ich folgendes rausgefunden:
1. selbst mit dem Beispiel von TI hängt der RF-Core bis zum nächsten 
WOR-Timer-Event.
2. wenn man anstelle des IDLE-Strobes das RX-Strobe verwendet, geht die 
Umschaltung ganz schnell. Danach ist er allerdings nicht im RX sondern 
Trommelwirbel im Idle. Wer hätte das gedacht?

Jetzt ist noch ein Problem: Der Core sagt mir zwar ist ist Idle, macht 
aber scheinbar nicht das was er soll. Ein folgende TX-Strobe hat keine 
Wirkung.

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.