Hallo Leute, ich habe ein SJA1000 CAN Controller über EBI (External Bus Interface) SMC Inteface (static memory controller)des Atmel AVR32UC3 angeschlossen. Habe aber die DATEN Leitung mit dem AD Leitung verbunden. Da der SJA100 Multiplexte Adres und Datenleitung hat, habe ich den ALE über ein GPIO pin gesteuert. Zuerst setze ich den ALE auf High dann schreibe ich die adresse, Dann setze ich den ALE auf LOW und lese die Daten. Habe auch die Timings nach dem Datenblatt des CAN Controllers eingestellt. Wenn ich alle Regsiter nacheinander Lese bekomme ich folgendes: 00 04 08 0C 10 14 18 1C 20 24 28 2C 30 34 38 3C 40 44 48 4C 50 54 58 5C 60 64 68 6C 70 74 78 7C. Aber aus dem Register 30 kann men laut Datenblatt nur ein FFH lesen. Das ist aber nicht der Fall. Was jemand wo der Wurm drin ist ?
In der CAN-Lib auf http://www.kreatives-chaos.com/artikel/universelle-can-bibliothek wird es wie Unten gezeigt gemacht. Vielleicht hilft dir das. Aber wie immer: Ohne Quarantäne.
1 | void sja1000_write(uint8_t address, uint8_t data) |
2 | {
|
3 | // set address
|
4 | SET(SJA1000_ALE); |
5 | PORT(SJA1000_DATA) = address; |
6 | _NOP(); |
7 | RESET(SJA1000_ALE); |
8 | |
9 | // write data
|
10 | PORT(SJA1000_DATA) = data; |
11 | RESET(SJA1000_WR); |
12 | _NOP(); |
13 | SET(SJA1000_WR); |
14 | }
|
15 | |
16 | uint8_t sja1000_read(uint8_t address) |
17 | {
|
18 | uint8_t data; |
19 | |
20 | // set address
|
21 | SET(SJA1000_ALE); |
22 | PORT(SJA1000_DATA) = address; |
23 | _NOP(); |
24 | RESET(SJA1000_ALE); |
25 | DDR(SJA1000_DATA) = 0; |
26 | |
27 | // read data
|
28 | RESET(SJA1000_RD); |
29 | _NOP(); |
30 | data = PIN(SJA1000_DATA); |
31 | SET(SJA1000_RD); |
32 | DDR(SJA1000_DATA) = 0xff; |
33 | |
34 | return data; |
35 | }
|
> 00 04 08 0C 10 14 18 1C 20 24 28 2C 30 34 38 3C 40 44 48 4C 50 54 58 5C 60 > 64 68 6C 70 74 78 7C. Das sieht aus, als ob du einfach die Addresse*4 zurückliest. Irgendwie riecht das nach einem 32-Bit-Prozessor... > Zuerst setze ich den ALE auf High dann schreibe ich die > adresse, Dann setze ich den ALE auf LOW und lese die Daten. Und führst dabei natürlich 2 mal den kompletten Buszyklus mit nRD bzw. nWR aus. Kontrollier doch mal mit einem passenden Messgerät (Oszi, LA) das Timing deines Buszyklus. Der sieht sicher anders aus, als der SJA das erwartet. EDIT: Das Beispiel von Werner B. funktioniert über einen Port, nicht über das Speicherinterface... Damit wird das Bustiming des SJA von Hand nachgebildet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.