Forum: Mikrocontroller und Digitale Elektronik SJA1000 CLK_OUT unerwartetes Verhalten


von Karsten K. (karsten42)


Lesenswert?

Liebe CAN-Freaks,

Ich steige gerade von ATMEGA162/MCP2515 auf AT90CAN und SJA1000 um :-)
 Den SJA habe ich an das XMEM interface von AT90CAN angeschlossen und 
setze !CS noch "per Hand" da ich mit dem Adressdecoder noch nicht 
zurecht komme.

Um nun zu testen ob die Kommunikation mit dem SJA1000 funktioniert, sehe 
ich mit CLK_OUT an und setze das Register CDR. Der SJA1000 ist auf 
Intelmode ( Pin 11 auf +5V ). F_CPU = 16Mhz Ich benutze die 
Kreativ-Chaos Lib.

Schalte ich den CLK_OUT via Bit3 auf 1 und somit auf aus,Bits 2..0 auf 0 
ist am CLK_out 1.6Mhz zumessen. Setze ich z.B. CD.1 und CD:0 also clk/8 
ist am Ausgang 4Mhz zu messen.
Lese ich den default Wert das Register CDR nach einem Hardware-Reset 
aber innerhalb des SW-Reset aus so bekomme ich 0x01 zurück anstatt der 
im Datenblatt angegebenen 0x0 für intelmode.

Anscheinend kann ich ja mit dem SJA1000 via XMEM kommunizieren, aber 
irgendwas läuft da falsch.

Hat jemand vielleicht ein Tipp??

Daaanke,
Karsten

1
uint8_t
2
init_HW(){
3
4
...
5
// init XMEM to access SJA1000
6
// Enable XMEM, one wait state for all memory sections )
7
// Free PC2 to PC7 for other usage)
8
XMCRA |= (1 << SRE | 1 << SRW10 );
9
XMCRB |= (1 << XMBK | 1 << XMM2 | 1 << XMM1);
10
// use PC2 for !CS until I know how to work with adresse
11
// decoder
12
DDRC |= (1 << PC2);   //OUT
13
PORTC |= (1 << PC2); // Set High
14
15
}
16
17
18
uint8_t sja_init()
19
{
20
  uint8_t reg = 0;
21
  
22
  // enter reset mode
23
  sja_write(MOD, (1<<RM)|(1<<AFM));
24
  
25
  reg = sja_read(CDR);
26
  // choose PeliCAN-Mode, external clock off
27
//  sja_write(CDR, (1<<CANMODE) | (1<<CLKOFF));
28
  sja_write(CDR, (1<<CANMODE) | (1<<CD1) | (1<<CD0) ); //CLK/8
29
  
30
  // set 250Kbaud the bitrate configuration
31
  sja_write(BTR0, (1<<_SJW0)|(1<<_BRP0));
32
  sja_write(BTR1, (1<<TSEG13)|(1<<TSEG12)|(1<<TSEG20));
33
  
34
  // filter are not practical useable, so we disable them
35
  sja_write(AMR0, 0xff);
36
  sja_write(AMR1, 0xff);
37
  sja_write(AMR2, 0xff);
38
  sja_write(AMR3, 0xff);
39
  
40
  // set output driver configuration
41
  sja_write(OCR, (1<<OCTP0)|(1<<OCTN0)|(1<<OCMODE1));
42
  
43
  // enable receive interrupt
44
  sja_write(IER, (1<<RIE));
45
  
46
  // leave reset-mode
47
  sja_write(MOD, (1<<AFM));
48
  
49
  return reg;
50
}

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Was für eine Taktquelle hängt denn am SJA1000?

Wenn der kein eigenes Quarz hat, kann man auch die Fuse für CKOUT am AVR 
setzen und dann XTAL1 damit verbinden.

von Karsten K. (karsten42)


Lesenswert?

Hallo Herr Dannegger,

Ach, gerade vor 30sec. habe ich das Problem gefunden! Ein simpler 
Layout-Fehler. Ich hatte D0 bis D3 von At90CAn zum SJA1000 um "eins nach 
links" versetzt angeschlossen.

Ich sehe, dass ich auf dem Steckboard noch sorgfältiger sein muss. Nur 
hatte ich das SJA1000 mit einem PCA82C250 auf eine kleine Platine 
gelötet und diese mit Steckkontakten für das Steckboard versehen. Mit 
SMD-Löten und den ersten Gehversuchen mit XMEM sind der Fehlerquellen 
viele und das Datenblatt vom SJA1000 ist auch nicht gerade sehr einfach.

Herzlichen Dank für Ihre Mühe!!!

Karsten

P.S. der SJA1000 läuft mit einem eigenen 16Mhz Quarz...

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
Noch kein Account? Hier anmelden.