IOWarrior und SPI
Moderator: Guido Körber
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
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.
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.
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.
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.
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
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?
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?
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
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 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
Ich habe jetzt folgenden Code geschickt:
und das bekomme ich raus
04 ff ff ff 69 00
04 69 ac 53 80 00
trotzdem wird nicht gelöscht
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]);
04 ff ff ff 69 00
04 69 ac 53 80 00
trotzdem wird nicht gelöscht
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
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:
-
- 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:
-
- Site Admin
- Posts: 2876
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
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.
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.
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
der Code im Beispiel schickt aber 0xAC 0x53 0x80 0x00.
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
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 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.stippe wrote: Habe jetzt 3MHz Quarz eingesetzt und doch nichts
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