IOWarrior und SPI

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

Moderator: Guido Körber

stippe
Posts: 14
Joined: Sat Aug 26, 2006 11:26 pm

Post by stippe »

Wie bescheuert muß man sein um die 53 da rein zu schreiben.

Vielen Dank es klappt auch mit 24 MHz

Mein Projekt ist gerettet

Danke nochmals
Vodafone
Posts: 12
Joined: Tue Nov 21, 2006 3:24 pm

Post by Vodafone »

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:
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.
Ich habe ihn im moment mit Pin 24 (P0.4/SPI - SS/LCD- /On) verbunden.
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
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

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.
Vodafone
Posts: 12
Joined: Tue Nov 21, 2006 3:24 pm

Post by Vodafone »

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
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

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.
Vodafone
Posts: 12
Joined: Tue Nov 21, 2006 3:24 pm

Post by Vodafone »

jetzt ergibt das ganze für mich einen sinn! danke!

also kann ich den /SS wie einen ganz normalen IO-PIN (z.b. P1) setzen und löschen?


gibts irgendwo ein tutorial oder so, dass das lesen/schreiben ein bissl erleutert? aus dem thermometer-bsp. werde ich nicht so ganz schlau.

mfg
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Nein, /SS wird von der SPI Funktion bedient. Aber es passt zu dem CNVT Signal.
Vodafone
Posts: 12
Joined: Tue Nov 21, 2006 3:24 pm

Post by Vodafone »

muss ich also mein layout nicht ändern?

jez muss ich "nur" noch herausfinden wie ich /ss programmtechnisch ansteuern muss....
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

/SS wird von der SPI Funktion des IO-Warrior gesteuert. Mal das Kapitel zum SPI aufmerksam lesen.
Vodafone
Posts: 12
Joined: Tue Nov 21, 2006 3:24 pm

Post by Vodafone »

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.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Sowas ist sinnloser Spielkram. Am USB gehen die Daten für jedes Gerät alle Geräte die die gleiche Transfergeschwindigkeit benutzen.

Abgesehen davon darf nicht jeder einfach Strom verbrauchen am USB.
Vodafone
Posts: 12
Joined: Tue Nov 21, 2006 3:24 pm

Post by Vodafone »

das mit dem spielkram, ist schon war.
doch kommt es imma gut an wenn was mitblinkt (ich bin auch kein fan davon).
dann werde ich halt eine schaltung "zimmern".

mfg
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Aber bitte dazu keine Fragen hier stellen, die Antwort ist einfach: USB Signale in Ruhe lassen.
Vodafone
Posts: 12
Joined: Tue Nov 21, 2006 3:24 pm

Post by Vodafone »

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.
void 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);
}
vielen dank. mfg
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

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:

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
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.

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 
Eberhard
Post Reply