Forum: Mikrocontroller und Digitale Elektronik Fifos reseten im cypress cy7c6013


von Dete K. (dete)


Lesenswert?

Hallo Zusammen,

Nachdem mir bei euch so schnell und gut geholfen wurde, möchte ich eine 
neue frage stellen:

Ich möchte den FX2 an Hand der, in der CyUSB.dll vorhandenen Methode,
Device.Reset()  Reseten und darauf in der Firmware reagieren.

Welches Register wird durch das reseten geändert?

Das will ich abfragen und daran die FIFOs reseten (quasi füllstand 
rücksetzen)

ist dass in der TD_Poll() möglich?

Ich bedanke mich im voraus

von Christian R. (supachris)


Lesenswert?

Die Methode aus der DLL löscht meines Wissens nicht den Füllstand der 
Slave FIFOs. Das geht nur durch
1
SYNCDELAY;
2
FIFORESET = 0x80;             // activate NAK-ALL to avoid race conditions
3
SYNCDELAY;                    // see TRM section 15.14
4
FIFORESET = 0x02;             // reset, FIFO 2
5
SYNCDELAY;                    // 
6
FIFORESET = 0x04;             // reset, FIFO 4
7
SYNCDELAY;                    // 
8
FIFORESET = 0x06;             // reset, FIFO 6
9
SYNCDELAY;                    // 
10
FIFORESET = 0x08;             // reset, FIFO 8
11
SYNCDELAY;                    // 
12
FIFORESET = 0x00;             // deactivate NAK-ALL
13
SYNCDELAY;

direkt auf dem FX2. Aufrufen kannst du die Funktion beispielsweise durch 
einen Vendor-Request oder Standard-Request, die Funktionsrümpfe sind in 
der fw.c bereits drin.

von Dete K. (dete)


Lesenswert?

Richtig, diese Zeilen will ich ausführen, wenn die Methode 
Device.Reset() ausgeführt und damit ein Bit in irgendeinem Register 
verändert wird.

> SYNCDELAY;
> FIFORESET = 0x80;             // activate NAK-ALL to avoid race
> conditions
> SYNCDELAY;                    // see TRM section 15.14
> FIFORESET = 0x02;             // reset, FIFO 2
> SYNCDELAY;                    //
> FIFORESET = 0x04;             // reset, FIFO 4
> SYNCDELAY;                    //
> FIFORESET = 0x06;             // reset, FIFO 6
> SYNCDELAY;                    //
> FIFORESET = 0x08;             // reset, FIFO 8
> SYNCDELAY;                    //
> FIFORESET = 0x00;             // deactivate NAK-ALL
> SYNCDELAY;
>

Wenn ich kapitel 7 TRM (Resets) richtig verstehe wird Bit URES (Bit 5) 
im Register USBIRQ auf 1 gesetzt sobals Device.reset() ausgelöst wird.
Mit dem Eintrag :

USBIRQ = 0xFF;
USBIE = 0x10;

in die TD_Init() und dem Eintrag:

if (USBIRQ & 0x10)
{
PA1 = 0x01; //ist ein Ausgang, damit überprüfe ich die Abfrage mittels 
oszi
            // hier müssen die FIFO-Resets rein
}

in die TD_Poll() klappt das schon ganz gut,

Woran liegt es, dass diese IF-Abfrage unregelmäßig ausgeführt wird?
manchmal beim ersten, manchmal erst beim zweiten oder auch erst beim 3. 
Aufruf der Reset_Methode

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.