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