SPI an IOW 24

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
muesing7
Posts: 21
Joined: Thu Jul 21, 2005 1:57 pm

SPI an IOW 24

Post by muesing7 »

Hallo,
ich versuche gerade die SPI Schnittstelle an meinem IOW24 zu aktivieren. Komisch ist, dass keine Fehlermeldungen oder sonstiges kommen, aber nichts rauskommt ( Messe mit nem Oszi), alle anderen Funktionen gehen auch!
Noch schlimmer ist, und jetzt wirds erst interessant, das die Beispiel exe auch nichts aus´m MOSI oder Clk Ausgang schiebt :cry: .......
Habe bereits das 2te IC im Test!
Irgend einer von euch vielleicht eine Idee was hier schief läuft ??

Wäre dankbar für Hilfe :D
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Poste doch mal ein bischen Source hier (mit Code Tags).
supachris
Posts: 124
Joined: Tue Mar 16, 2004 12:30 am
Location: Dresden

Post by supachris »

Also ich habs geschafft, nen AD-Wandler von Maxim auszulesen per SPI. Das ging. Weiter hab ich da noch nix probiert. Wenn du Sourcecode (VC++ 7.0) haben willst, meld dich per PM oder mail.
Gruß SupaChris
Guido Körber
Site Admin
Posts: 2857
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Welches Beispiel?
muesing7
Posts: 21
Joined: Thu Jul 21, 2005 1:57 pm

Post by muesing7 »

Also ich habe das Beispielprogramm, mit dem MAX??? Temperaturbaustein getestet! Da muss doch irgendwie was aus diesem clk und MOSI Ausgang rauskommen oder was!!!!??
Ich habs nun mal probiert bei meinem Programm den Eingang auf Masse nd 5 V zu legen, dass klappt da kommt dann tatsächlich 0x00 und 0xFF rein! Aber no clk and no MOSI und ich will schreiben nicht lesen :roll:
Muss leider los, Quellcode kann ich sonst Morgen nochmal posten!
Vielen Dank erstmal an alle!
muesing7
Guido Körber
Site Admin
Posts: 2857
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Eigenartig, da müsste sich wirklich was an den Leitungen tun. MOSI allerdings wird nicht viel von sich geben, der MAX hat keinen Eingang, nur einen Ausgang.
muesing7
Posts: 21
Joined: Thu Jul 21, 2005 1:57 pm

Post by muesing7 »

Guten Morgen,

@ Guido, da ja aber immer nur senden und empfangen gleichzeitig geht, werden da bei jeder Abfrage zwei Dummy- Bytes übergeben! Und die müsste ich eigentlich auch messen können!?!?

Hier nochmal der Code:

Code: Select all

void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
  IOWKIT_HANDLE hMyHandle;
  IOWKIT_SPECIAL_REPORT report;
  int value = 0;
  hMyHandle = IowKitOpenDevice ( );


  memset(&report, 0, sizeof(report));
  report.ReportID = 0x08;
  report.Bytes[0] = 0x01; // enable SPI
  report.Bytes[1] = 0x10; // mode /CPOL, CPHA, 62.5 KBit
  IowKitWrite(hMyHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
  Sleep (200);

  report.ReportID = 0x9;       //Dummydata
  report.Bytes[0] = 0x2;       //Dummydata
  IowKitWrite(hMyHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report,  sizeof(report));
  IowKitRead(hMyHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
  Memo1->Lines->Add ("SPI read = ");
  value = report.Bytes[1] << 8 | report.Bytes[2];
  Memo1->Lines->Add (IntToStr (value));     //convert and show value
  report.ReportID = 0x8;
  report.Bytes[0] = 0x0; // disable SPI
  IowKitWrite(hMyHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
  IowKitCloseDevice(hMyHandle);

}
MfG Lasse
muesing7
Posts: 21
Joined: Thu Jul 21, 2005 1:57 pm

Post by muesing7 »

Hi noch mal,
es ist übrigens so, dass sowohl der MOSI als auch der clk Ausgang, beide wärend der Schleife auf low gehen und danach wieder (wie vorher) auf high! Mit diesen beiden Dummybytes scheint auch irgendwas nicht nur Dummy zu sein, da bei anderen Werten das Programm hängen bleibt :shock: .......Ich werds weiter untersuchen!
Gruß Lasse
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Der eingestellte Modus ist CPOL /CPHA 2MBit. Das erscheint mit ein bischen steil. Bei einer offenen Schaltung sollte das Stoerungen geben.
Ein MAX6675 will ausserdem /CPOL CPHA haben (mit dem arbeite ich hier). Es waere nett den genauen Chipnamen zu bekommen.

Das sleep ist nicht notwendig.

Ein "memset(&report, 0, sizeof(report));" waere nicht schlecht. Initialisierte Dummybytes sind eine gute Idee.

IowKitWrite hat einen Rueckgabewert, den man testen sollte.

Was steht denn in allen gelesenen Bytes?

Wieviele Bytes will der Chip denn haben? Wirklich 2?
muesing7
Posts: 21
Joined: Thu Jul 21, 2005 1:57 pm

Post by muesing7 »

Hi,
ich benutze hier den DS1867 (Dig Poti)! Die Geschichte mit der SPI initialisierung hatte ich gerade nur zum rumtesten verändert!
Der DS 1867 will genau 17 bit haben!
Lesen kann ich, wobei ich halt nur auf Masse oder 5V gehe, da ich den Eingang nicht beschaltet habe! Was ich nur nicht verstehe, wie sollte der das ohne den clk machen :?: ist doch n Master ! der muss den doch liefern....
Das Sleep ist bereits weg :-) dachte nur der ist vielleicht n bisschen überfordert oder so...
Mal was ganz anderes, die beiden Bytes (ReportID und Bytes[0]) verlassen die überhaupt jemals den IOW 24? Ich glaube eher nicht oder!?
Wie sende ich den meine Daten überhaupt aus der SPI SChnittstelle?--> Bytes[1] bis Bytes[4] voll malen, und dann vorher mit Bytes[0] = 0x4 initialisieren??
Gruß Lasse
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Na da hast du dir vielleicht einen Baustein ausgesucht :-(
Dem Datenblatt nach muss man ihm 17 Bit oder ein Vielfaches davon schicken. Da 17 eine Primzahl ist, muessen es wohl 17 Bytes sein, da der IO-Warrior nur Bytes schicken kann.
Also muessen 17 Bytes mit 8x dem gleichen 17-Bit-Pattern gefuellt werden. Viel Spass.
Das Ganze muss dann mit drei Writes geschrieben werden, da der IO-Warrior nur 6 Bytes pro Report nimmt.
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Das hier duerfte es mit dem Fuellen sein. Ganz sicher bin ich aber nicht. Es braucht einen Puffer von 20 Bytes.

Code: Select all

void initbuffer(DWORD pattern, unsigned char *buffer)
 {
  int i;
  DWORD mask;

  mask = 0x1FFFF;
  memset(buffer, 0, 20);
  for(i = 0; i < 9; i++)
   {
    pattern &= mask;
    *(DWORD *) (buffer + i*2) &= mask;
    *(DWORD *) (buffer + i*2) |= pattern;
    pattern <<= 1;
    mask <<= 1;
    mask |= 1;
   }
 }
Hinsichtlich des Schreibens des Puffers muss man drei IowKitWrite/IowKitRead-Paare verwenden. 2x mit 6 Bytes im Report und SSactive gesetzt, damit der IO-Warrior weiss das noch weitere Reports folgen. Der dritte Report mit den restlichen 5 Bytes und natuerlich ohne SSactive.
Zu den restlichen Bits soll Guido mal was sagen.
Post Reply