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

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 so wie ich die Spezifikation für das Programmieren verstehe ist es eigentlich ganz einfach. Das /SS Signal ist nicht dazu geeiegnet den RST zu erzeugen, weil RST während des Programmierens High sein soll. Also einfach einen beliebigen Portpin dafür benutzen. /SS wird garnicht benutzt.

Das mit der Clock ist ebenfalls nicht besonders kompliziert, wenn kein Quartz dran ist muss halt erst mal Takt da sein, damit der Chip sich initialisieren kann. Die beste Lösung dürfte es sein einfach einen Quartz zu verwenden.
stippe
Posts: 14
Joined: Sat Aug 26, 2006 11:26 pm

Post by stippe »

Hallo

Es geht hier nicht um um den /SS Ausgang.
Auf dem Osszilloskop sieht man ganz genau.
Der Clock muß 1/16 von der Osszillatorfrequenz sein.
Ich habe jetzt mit 24 Mhz gearbeitet.
Also könnte ich mit ca. 1,5MBit/s programmieren.
Laut demQuellcode habe ich aber 62.5kBit/s gewählt.

Mein Tclcl beträgt nach dem Datenblatt von µC 1/24Mhz=41,6nsec
Um ein Byte zu schreiben und damit auch der µC nicht abschaltet, dürfen die Abstände zwischen den Bytes nicht weniger als 64Tclcl+400µsec betragen. (ca. 403µsec].
Der Abstand zwischen den Datenpaketen beträgt aber 10msec. In der Zeit wechselt mein /SS Signal nicht den Pegel.

Ich habe jetzt kein Bild davon, aber in etwa sieht es so aus.

DATEN 10ms. DATEN.

Mir wäre es lieber

DATEN fast keine Clockunterbrechungen DATEN

Ich programmiere den gleichen µC mit über die RS232 Schnittstelle und über ein Adapter USB->RS232. Die daten werden zwar langsamerer übertragen 9,6kBit/sec, aber da gibt es keine Unterbrechng des Clocksignals und keine Verzögerung in msec Bereich zwischen den Bytes.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

64Tclcl+400µsec ist die Zeit die der Chip braucht um ein Byte zu schreiben, schickt man die Daten schneller, dann geht der Schreibvorgang möglicherweise schief.

Wo bitte kommt die Information her, dass der Chip den Programmiermodus abbricht, wenn die Daten nicht mit einer Mindestgeschwindigkeit kommen?

Kommt denn beim Program Enable Kommando überhaupt das $69 vom Chip zurück?
stippe
Posts: 14
Joined: Sat Aug 26, 2006 11:26 pm

Post by stippe »

Nicht so ganz richtig

Wenn in der Zeit keine weitere Datenpakete kommen, dann bricht er ab.

Serial Byte Write Cycle Time 64tclcl+400µsec
Seite 28


Die Rückantwort muß man nicht unbeding haben
Werde aber testen, wenn ich nach Hause komme.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

stippe wrote:Nicht so ganz richtig

Wenn in der Zeit keine weitere Datenpakete kommen, dann bricht er ab.

Serial Byte Write Cycle Time 64tclcl+400µsec
Seite 28
Das ist die Zeit, die der Chip zum Schreiben braucht. Wo steht da,dass der Chip das Programmieren abbricht wenn man länger wartet? Das wäre extrem unlogisch.
stippe
Posts: 14
Joined: Sat Aug 26, 2006 11:26 pm

Post by stippe »

Ich habe jetzt folgenden Code geschickt:

Code: Select all

memset(&report, 0, sizeof(report));
	report.ReportID = 0x09;
	report.Bytes[0] = 0x04;
	report.Bytes[1] = 0xAC;
	report.Bytes[2] = 0x53;
	report.Bytes[3] = 0x00;
	report.Bytes[4] = 0x69;
	IowKitWrite(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
	IowKitRead(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
	for (j = 0; j < 6; j++)
				printf("%.2x\n", report.Bytes[j]);
	
	printf("\n");
	memset(&report, 0, sizeof(report));
	report.ReportID = 0x09;
	report.Bytes[0] = 0x04;
	report.Bytes[1] = 0xAC;
	report.Bytes[2] = 0x53;
	report.Bytes[3] = 0x80;
	report.Bytes[4] = 0x00;
	IowKitWrite(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
	IowKitRead(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
	for (j = 0; j < 6; j++)
printf("%.2x\n", report.Bytes[j]);
und das bekomme ich raus

04 ff ff ff 69 00
04 69 ac 53 80 00

trotzdem wird nicht gelöscht
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Wie wird denn das RST Signal erzeugt?
Mike D
Posts: 91
Joined: Wed Jun 02, 2004 4:07 pm
Location: Elbe- Weser-Dreieck
Contact:

Post by Mike D »

nimm doch mal die print-schleife dazwischen raus
stippe
Posts: 14
Joined: Sat Aug 26, 2006 11:26 pm

Post by stippe »

Quellcode

Code: Select all

IOWKIT_SPECIAL_REPORT report;
	
	memset(&report, 0, sizeof(report));
	if (devHandle!=NULL)
	{
	memset(&report, 0, sizeof(report));
	report.ReportID = 0x08;
	report.Bytes[0] = 0x01;
	report.Bytes[1] = 0x07;
	IowKitWrite(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
	Sleep(200);	
	}

	WriteSimple(iows[0], 0xfe);
	Sleep(400);
	
	memset(&report, 0, sizeof(report));
	report.ReportID = 0x09;
	report.Bytes[0] = 0x04;
	report.Bytes[1] = 0xAC;
	report.Bytes[2] = 0x53;
	report.Bytes[3] = 0x00;
	report.Bytes[4] = 0x00;
	IowKitWrite(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
	IowKitRead(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
	//for (j = 0; j < 6; j++)
	//			printf("%.2x\n", report.Bytes[j]);

	//printf("\n");
	memset(&report, 0, sizeof(report));
	report.ReportID = 0x09;
	report.Bytes[0] = 0x04;
	report.Bytes[1] = 0xAC;
	report.Bytes[2] = 0x53;
	report.Bytes[3] = 0x80;
	report.Bytes[4] = 0x00;
	IowKitWrite(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
	IowKitRead(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report));
	//for (j = 0; j < 6; j++)
	//			printf("%.2x\n", report.Bytes[j]);
Sleep(400);

	report.ReportID = 0x08;
	report.Bytes[0] = 0x00;
	IowKitWrite(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
	

	WriteSimple(iows[0], 0xFFFFFFFF);
	// Close device
	IowKitCloseDevice(devHandle);
out:
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Wenn ich jetzt richtig rate, dann wird P0.0 als RST verwendet und auf den falschen Pegel gesetzt.
stippe
Posts: 14
Joined: Sat Aug 26, 2006 11:26 pm

Post by stippe »

inverter natürlich dazwischen
DM7404N
Habe jetzt 3MHz Quarz eingesetzt und doch 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 »

Mal ausprobiert ob die Lesebefehle gehen?
stippe
Posts: 14
Joined: Sat Aug 26, 2006 11:26 pm

Post by stippe »

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

Post by Guido Körber »

Dann gehen mir langsam die Ideen aus. Nur eine noch: Laut Datenblatt dauert der Erase-Cycle 500msec, ich denke während der Zeit darf RST nicht auf low zurück gehen.

Obergrenzen für die Zeiten definiert das Datenblatt aber nicht, also ist davon auszugehen, dass es keine gibt, der Chip also wartet bis er einen Befehl bekommt.

Vielleicht einfach mal probieren die Reports von Hand mittels SimpleHIDwrite zu schicken, da kann man dann ggf. nach jedem Einzelschritt in Ruhe messen.
wayoda
Posts: 362
Joined: Fri Dec 19, 2003 12:00 pm
Location: Wuppertal/Germany

Post by wayoda »

Hallo,
also in dem Datenblatt des AT, das ich mir anschaut habe steht für Chip Erase
die Bytefolge:
10101100 100xxxxxx xxxxxxxx xxxxxxxx

als Report wäre das doch

Code: Select all

//chip erase
memset(&report, 0, sizeof(report)); 
report.ReportID = 0x09; 
report.Bytes[0] = 0x04; 
report.Bytes[1] = 0xAC; 
report.Bytes[2] = 0x80; 
report.Bytes[3] = 0x00; 
report.Bytes[4] = 0x00; 
IowKitWrite(devHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, sizeof(report)); 
der Code im Beispiel schickt aber 0xAC 0x53 0x80 0x00.
stippe wrote: Habe jetzt 3MHz Quarz eingesetzt und doch nichts
Der Quarz am AT bestimmt die Arbeitsgeschwindigkeit des MC, aber er hat nichts mit der Datenübertragungsrate am SPI zu tun. Zu beachten ist allerdings die Bedingung, das die vom IOWarrior erzeugte Clock-Frequenz <= 1/16 der Quarz-Frequenz sein muss.
Ein langsamerer Quarz könnte also bewirken, das der IOWarrior die Daten zu schnell sendet. Wenn man die Timing-Werte am SPI überschlägt, sollte ein 33MHz Quarz die richtige Wahl sein um den IOWarrior von 0.0625 - 2MBit/sec arbeiten zu lassen.

Eberhard
Post Reply