SPI an IOW 24
Moderator: Guido Körber
SPI an IOW 24
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 .......
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
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 .......
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
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
-
- Site Admin
- Posts: 2857
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
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
Muss leider los, Quellcode kann ich sonst Morgen nochmal posten!
Vielen Dank erstmal an alle!
muesing7
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
Muss leider los, Quellcode kann ich sonst Morgen nochmal posten!
Vielen Dank erstmal an alle!
muesing7
-
- Site Admin
- Posts: 2857
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
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:
MfG Lasse
@ 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);
}
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 .......Ich werds weiter untersuchen!
Gruß Lasse
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 .......Ich werds weiter untersuchen!
Gruß Lasse
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
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?
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?
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
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
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
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.
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.
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Das hier duerfte es mit dem Fuellen sein. Ganz sicher bin ich aber nicht. Es braucht einen Puffer von 20 Bytes.
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.
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;
}
}
Zu den restlichen Bits soll Guido mal was sagen.