IOWarrior und SPI
Moderator: Guido Körber
Hallo leute,
wie ersichtlich bin ich hier neu und auch im Umgang mit dem IO-Warrior stehe ich noch sehr weit am Anfang.
Ich möchte euch mal mein Vorhaben schildern:
Ich möchte zwei Analogsignale mit einer Auflösung von 12bit wandeln, über den USB-Bus übertragen und unter C(pp) zur anzeige bringen.
Ich habe daher folgende Bauteile gewählt:
IO-Warrior 24
und als zwei-Kanal AD-Wandler den LTC1861 von Linear Technology
Dieser Verfügt über eine SPI-Schnittstelle und über diese möchte ich mit dem IO-Warrior kommunizieren.
Nur über einen Pin bin ich mir über dessen Funktion und Anschluss nicht so ganz im Klaren:
Liege ich da richtig?
Hier mal ein Auszug aus dem Datenblatt:
Ich verstehe nicht so ganz was ich dem Baustein schicken muss damit ich ihn auf lesen der einzelen Kanäle bzw. senden der Daten an den PC.
Wäre nett wenn sich jemand die Zeit nehmen könnte.
Schon mal recht herzlichen Dank im Vorraus.
mfg
wie ersichtlich bin ich hier neu und auch im Umgang mit dem IO-Warrior stehe ich noch sehr weit am Anfang.
Ich möchte euch mal mein Vorhaben schildern:
Ich möchte zwei Analogsignale mit einer Auflösung von 12bit wandeln, über den USB-Bus übertragen und unter C(pp) zur anzeige bringen.
Ich habe daher folgende Bauteile gewählt:
IO-Warrior 24
und als zwei-Kanal AD-Wandler den LTC1861 von Linear Technology
Dieser Verfügt über eine SPI-Schnittstelle und über diese möchte ich mit dem IO-Warrior kommunizieren.
Nur über einen Pin bin ich mir über dessen Funktion und Anschluss nicht so ganz im Klaren:
Ich habe ihn im moment mit Pin 24 (P0.4/SPI - SS/LCD- /On) verbunden.CONV (PIN1): Convert Input. A logic high on this input starts the A/D conversation process. If the CONV input is left high after the A/D conversison is finished, the part powers down. A logic low on this input enables the SDO pin, allowing the data to be shifted out.
Liege ich da richtig?
Hier mal ein Auszug aus dem Datenblatt:
Ich verstehe nicht so ganz was ich dem Baustein schicken muss damit ich ihn auf lesen der einzelen Kanäle bzw. senden der Daten an den PC.
Wäre nett wenn sich jemand die Zeit nehmen könnte.
Schon mal recht herzlichen Dank im Vorraus.
mfg
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Ich habe mal den Link auf den kopierten Auszug des Datenblattes gelöscht, sowas verstößt gegen das Urheberrecht. In Zukunft bitte nur Links auf z.B. das Originaldatenblatt beim Hersteller, das bringt auch mehr, weil man da dann die komplette Information einsehen kann.
Also Conv an /SS scheint mir erst mal ziemlich falsch. CONV sollte besser ein eigener Pin sein. Die Auswahl welchen Kanal man haben will macht man mit den Daten die man an den Chip schickt. SPI schiebt immer gleichzeitig daten in beide Richtungen, die ersten beiden Bits zum A/D Wandler wählen den Kanal aus, danach beginnt der damit die Daten zu senden.
Übrigens ist es nicht ganz einfach einen 12 Bit Wandler so zu Laufen zu bekommen, dass man auch wirklich 12 Bit echte Daten und nicht 4-5 Bit Rauschen bekommt.
Also Conv an /SS scheint mir erst mal ziemlich falsch. CONV sollte besser ein eigener Pin sein. Die Auswahl welchen Kanal man haben will macht man mit den Daten die man an den Chip schickt. SPI schiebt immer gleichzeitig daten in beide Richtungen, die ersten beiden Bits zum A/D Wandler wählen den Kanal aus, danach beginnt der damit die Daten zu senden.
Übrigens ist es nicht ganz einfach einen 12 Bit Wandler so zu Laufen zu bekommen, dass man auch wirklich 12 Bit echte Daten und nicht 4-5 Bit Rauschen bekommt.
ok danke. hab ich nicht gewuss. sorry.
Hier der direkte link: http://www.linear.com/pc/downloadDocume ... 2081,D1181
hoffe das funzt so.
S10 schein für mich von bedeutung zu sein...
also soll ich den CONV auf irgend einen Pin von P1 hängen?
verstehe ich das so richtig:
ich muss den CONV richtig setzen, ein 2bit-wort für den passenden kanal schicken und dann kommen die daten rüber?
Am rauschen bin ich gerade drann...
edit: Kann ich port0 auch verwenden? würde vom layout her besser passen
Hier der direkte link: http://www.linear.com/pc/downloadDocume ... 2081,D1181
hoffe das funzt so.
S10 schein für mich von bedeutung zu sein...
also soll ich den CONV auf irgend einen Pin von P1 hängen?
verstehe ich das so richtig:
ich muss den CONV richtig setzen, ein 2bit-wort für den passenden kanal schicken und dann kommen die daten rüber?
Am rauschen bin ich gerade drann...
edit: Kann ich port0 auch verwenden? würde vom layout her besser passen
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Also wenn man mehr vom Datenblatt sieht, dann ergibt sich ein etwas anderes Bild: CONV kann sehr wohl mit /SS verbunden werden.
Um einen Wert zu messen muss man erst mal die Bits in den Chip schreiben, die den Kanal auswählen. Durch die L/H Flanke an CONV wird dann die A/D Wandlung angeschmissen und mit dem nächsten Zugriff schreibt man die Bits für die nächste Wandlung rein und holt gleichzeitig die Daten von der letzten ab.
Um einen Wert zu messen muss man erst mal die Bits in den Chip schreiben, die den Kanal auswählen. Durch die L/H Flanke an CONV wird dann die A/D Wandlung angeschmissen und mit dem nächsten Zugriff schreibt man die Bits für die nächste Wandlung rein und holt gleichzeitig die Daten von der letzten ab.
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
ok, der warrior läuft zumindest mal. jetzt werde ich mich an die SPI-programmierung machen.
noch eine hardware-technische frage:
gibts es beim warrior einen Pin senden/empfangen-anschluss oder sowas in der art, damit man visuell (über leds) sieht wann daten übermittelt werden. so wie bei der rs232 die die RX/TX pins.
z.b. der FTDI-chip hat so einen anschluss
es geht rein nur um die optik, sonst nichts.
noch eine hardware-technische frage:
gibts es beim warrior einen Pin senden/empfangen-anschluss oder sowas in der art, damit man visuell (über leds) sieht wann daten übermittelt werden. so wie bei der rs232 die die RX/TX pins.
z.b. der FTDI-chip hat so einen anschluss
es geht rein nur um die optik, sonst nichts.
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
hallo,
ich habe jetzt das thermometer-bsp umgeschrieben, doch leider funktioniert es nicht. ich bekomme immer nur 0 zurück.
ich denke das es am setzen der flags für den warrior oder etwas mit der SS leitung nicht funktioniert. vl passt das handling des warriors für die SS nicht mit dem CONV des wandlers zusammen.
der wert 0x2 für den kanal müsste passen oder?
vl weis jemand was ich falschmache.
ich habe jetzt das thermometer-bsp umgeschrieben, doch leider funktioniert es nicht. ich bekomme immer nur 0 zurück.
ich denke das es am setzen der flags für den warrior oder etwas mit der SS leitung nicht funktioniert. vl passt das handling des warriors für die SS nicht mit dem CONV des wandlers zusammen.
der wert 0x2 für den kanal müsste passen oder?
vl weis jemand was ich falschmache.
vielen dank. mfgvoid CMAXIM6675Dlg::OnClose()
{
if (IOWarrior != NULL)
{
IOWKIT_SPECIAL_REPORT report;
KillTimer(Timer);
memset(&report, 0, IOWKIT_SPECIAL_REPORT_SIZE);
//report.ReportID = 0x8;
report.ReportID = 0x8;
report.Bytes[0] = 0x01;
report.Bytes[1] = 0x07;
// report.Bytes[0] = 0x0; // disable SPI
IowKitWrite(IOWarrior, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
IowKitCloseDevice(IOW);
}
CDialog::OnClose();
}
void CMAXIM6675Dlg::OnTimer(UINT nIDEvent)
{
if (IOWarrior != NULL)
{
IOWKIT_SPECIAL_REPORT report;
WORD value;
CString s;
memset(&report, 0, sizeof(report));
report.ReportID = 0x9; //start
report.Bytes[0] = 0x22; // config des warriors
report.Bytes[1] = 0x2; //10 um Kanal 1 im single-ended mode einzustellen
IowKitWrite(IOWarrior, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
IowKitRead(IOWarrior, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
value = (report.Bytes[1] << 8 | report.Bytes[2]) >> 3;
s.Format("%.2f", (float) value);
CDialog::SetDlgItemText(IDC_STATIC, s);
}
CDialog::OnTimer(nIDEvent);
}
Hallo,
die Aktivierung der SPI-Modes scheint nicht ganz richtig zu sein.
Laut Datenblatt des LTC muss SCK HIGH sein wenn keine Daten übertragen werden. Das Einschalten sollte so aussehen:
Siehe Datenblatt LTC Seite 9
Bei dem Report der zum IOWarrior geschickt wird ist zwar useDRDY=0 aber ignoreDRDY=1. Ob das zur Fehlfunktion führt kann ich nicht beurteilen, aber ich würde beide Bits auf 0 setzen, da DRDY nicht benutzt wird.
Eberhard
die Aktivierung der SPI-Modes scheint nicht ganz richtig zu sein.
Laut Datenblatt des LTC muss SCK HIGH sein wenn keine Daten übertragen werden. Das Einschalten sollte so aussehen:
Code: Select all
memset(&report, 0, IOWKIT_SPECIAL_REPORT_SIZE);
report.ReportID = 0x8;
report.Bytes[0] = 0x01;
report.Bytes[1] = 0x0F; //CPOL=Idle high;CPHA=DriveThenSample;SPEED=0,0625 MBit/sec
Bei dem Report der zum IOWarrior geschickt wird ist zwar useDRDY=0 aber ignoreDRDY=1. Ob das zur Fehlfunktion führt kann ich nicht beurteilen, aber ich würde beide Bits auf 0 setzen, da DRDY nicht benutzt wird.
Code: Select all
memset(&report, 0, sizeof(report));
report.ReportID = 0x9; //start
report.Bytes[0] = 0x02; // config des warriors
report.Bytes[1] = 0x2; //10 um Kanal 1 im single-ended mode einzustellen