Probleme mit MCP25625

#3961964
Lesenswert?

Hallo,

Ich habe derzeit Probleme eine CAN Kommunikation auf die Reihe zu 
bekommen.
Benutzen tue ich die CAN Lib von Fabian Greif
http://www.kreatives-chaos.com/artikel/universelle-can-Bibliothek

Als Controller nutze ich den MCP25625 anstelle dem MCP2515. Die sind 
beide identisch, bis auf das der MCP25625 auch den CAN Transreceiver 
inne hat.

Die SPI Kommunikation zwischen dem Atmega168 und dem MCP25625 
funktioniert.
Am CAN-BUS messe ich zwischen CANL und CANH einen Widerstand von 60Ohm.

Gibt es in der Hardware einen gravierenden Fehler, den ich übersehen 
habe?
Oder vielleicht ist das Layout der Platine nicht gut.

Für Hinweise und Tipps wäre ich sehr dankbar.


EDIT: Im Schaltplan ist ein ATMega8 vermerkt, es ist aber ein ATMega168 
verbaut die mit intern mit 8MHz getaktet werden. Die Externe Taktung aus 
dem MCP25625 nutze ich nicht.
EDIT2: Der MCP25625 wird mit 16MHz getaktet
1
#define F_CPU 8000000UL
2
//#define UART_BAUD_RATE 9600
3

4
#include <avr/io.h>
5
#include "i2cmaster.h"
6
#include "MCP23008.h"
7
#include "I2C_LCD.h"
8
#include <avr/pgmspace.h>
9
#include "can.h"
10
#include "uart.h"
11
#include <avr/interrupt.h>
12

13

14

15

16

17

18

19

20
typedef uint8_t prog_uint8_t;
21

22

23
prog_uint8_t can_filter[] =
24
{
25
  // Group 0
26
  MCP2515_FILTER(0),        // Filter 0
27
  MCP2515_FILTER(0),        // Filter 1
28
  
29
  // Group 1
30
  MCP2515_FILTER_EXTENDED(0),    // Filter 2
31
  MCP2515_FILTER_EXTENDED(0),    // Filter 3
32
  MCP2515_FILTER_EXTENDED(0),    // Filter 4
33
  MCP2515_FILTER_EXTENDED(0),    // Filter 5
34
  
35
  MCP2515_FILTER(0),        // Mask 0 (for group 0)
36
  MCP2515_FILTER_EXTENDED(0),    // Mask 1 (for group 1)
37
};
38

39

40

41
int main(void)
42
{
43
    
44
  //  uart_init(UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU));
45
  //  sei();
46
  //  uart_puts("\r\nGeht los \n\r");
47
    
48

49
  DDRB =0xff;
50

51
  
52
  i2c_init();
53
  lcd_init();
54

55
  
56
  
57
  lcd_light(true);
58

59
  lcd_printlcc(1,1,"geht los");
60
  //uart_puts("Geht los \r\n");
61
  _delay_ms(200);
62
  
63
  if (can_init(BITRATE_125_KBPS))
64
    lcd_printlcc(2,1,"CAN geht");
65
    //uart_puts("CAN OLUYOR\r\n");
66
  else
67
    lcd_printlcc(2,1,"CAN geht net");
68
    //uart_puts("CAN OLMUYOR\r\n");
69
    
70
  can_static_filter(can_filter);
71
  //_delay_ms(500);  
72
  
73
  
74
  
75
  can_t msg;
76
  
77
  msg.id = 0x123456;
78
  msg.flags.rtr = 0;
79
  msg.flags.extended = 1;
80
  
81
  msg.length = 4;
82
  msg.data[0] = 0xde;
83
  msg.data[1] = 0xad;
84
  msg.data[2] = 0xbe;
85
  msg.data[3] = 0xef;
86

87
 
88
   uint8_t error = can_read_error_register().tx;
89
   char Buffer[1];
90
   itoa(error,Buffer,10);
91
    
92
   lcd_printlcc(2,1,Buffer);
93
   //uart_puts(Buffer);
94
   //uart_puts("\r\n");
95
    
96
    //lcd_printlcc(1,1,"Warte auf msg");
97

98
  
99
  
100
  
101
  while(1)
102
  {
103
    
104
    if (can_check_message())
105
    {
106
      can_t msg;
107
      
108
      lcd_printlcc(1,1,"geldi amk");
109
      
110
      itoa(msg.id,Buffer,10);
111
      lcd_printlcc(2,1,Buffer);
112
      //uart_puts(Buffer);
113
      //uart_puts("\r\n");
114
            
115
      if (can_get_message(&msg))
116
      {
117
        uart_puts("CAN MESSAGE gelesen   : ");    
118
        itoa(msg.id,Buffer,10);
119
        lcd_printlcc(2,1,Buffer);
120
        //uart_puts(Buffer);
121
        //uart_puts("\r\n");
122
        
123
        msg.id += 10;
124
        uart_puts("CAN MESSAGE geschickt   : ");
125
        itoa(msg.id,Buffer,10);
126
        lcd_printlcc(2,1,Buffer);
127
        //uart_puts(Buffer);
128
        //uart_puts("\r\n");
129
        can_send_message(&msg);
130
        
131
      }
132
    }
133
    
134
  }
135
  
136
}
Angehängte Dateien:
#3962059
Lesenswert?

Hallo,

habe es nur kurz überflogen aber ich sehe nicht das Stby an dem Can Chip 
negiert ist, dh Du hast ihn mit Gnd
auf aus geklemmt.

Lg Sven

Ps ok vergiss es Du schriebst die Spi Kommunikation ist in Ordnung.

Pps: ich habe jetzt noch mal im DB gelesen,
ich verstehe das so, das das Spi Interface weiter läuft,
nur die Module Tx Rx werden abgeschaltet.
Das würde ja genau Dein Problem beschreiben.
#3962140
Lesenswert?

Sven K. schrieb:
> Pps: ich habe jetzt noch mal im DB gelesen,
> ich verstehe das so, das das Spi Interface weiter läuft,
> nur die Module Tx Rx werden abgeschaltet.
> Das würde ja genau Dein Problem beschreiben.

Hallo Sven, danke fürs schauen.
Das stimmt auch, aber der STBY Pin ist active high. Wenn ich auf Masse 
ziehe, dann dürfte er ja nicht im Standby sein, oder?
Gast #3962230
Lesenswert?

Bülent C. schrieb:
> dunno.. schrieb:
>> Grade noch gesehen, was macht der 120r in canh? Das soll nicht die
>> Terminierung sein, oder...?
>
> Doch, das ist die Terminierung. CANH und CANL gehen noch an JP2

Dann schau dir nochmal an, wie man CAN terminiert. die 120r werden nicht 
in reihe, sondern zwischen H und L geschalten.
Gast #3962662
Lesenswert?

Tut mir leid für die harsche Kritik: Das ganze Platinenlayout ist 
ziemlich gruselig. Bauteile (Quartz und zugehörige Kondensatoren sind 
nur ein Beispiel) mit kurzen Leitungen an den MC. Leitungen 
grundsätzlich so kurz wie möglich und Y-Abzweiger und Kreuzungen 
vermeiden. Die Leiterbahnen auf dem Bottom-Layer gehen oft wahllos hin 
und her...
#3962713
Lesenswert?

Uli schrieb:
> Tut mir leid für die harsche Kritik
Dafür tue ich ja das Layout hier ins Forum..

Uli schrieb:
> Y-Abzweiger und Kreuzungen
> vermeiden.

Sollte ich da lieber 'T' Verbindungen nutzen, wo sich drei Leiterbahnen 
treffen?

Leider ließen sich kurze Leiterbahnen nicht vermeiden.

Das mit dem Quarz habe ich schon öfters gehört hier.. Was genau ist 
nicht ok?


Ich mache jetzt eh ein neues Layout mit einem SSOP28 anstelle dem 6x6 
QFN28 des MCP25626.
- Als Quarz werde ich jetzt mal ein 7x5mm nehmen.
- An den Reset PIN tue ich noch ein 47nF Kerko gegen Masse, oder wären 
100nF besser?

Gibt es noch weitere Verbesserugsvorschläge?
#3962795
Lesenswert?

Thomas O. schrieb:
> in den Atmel Application Notes habe ich schon 10nF und 47nF gesehen. Ich
> benutze immer 100nF da ich eigentlich nur solche Kerkos für alle µC's
> und IC's nehme.

Ok, eigentlich spielt es keine Rolle, ob 10, 47 oder 100nF Kerko, nur 
dürfte er nicht zu groß sein..Von den 100nF Kerkos habe ich auch 
reichlich da.
Zur Sicherheit werde ich noch eine Diode gegen VCC schalten 
(antiparallel), um bei einem Abfall des VCC (abschalten) den Kerko 
schneller entladen zu können.
#3963122
Lesenswert?

Aber dein CAN Problem beschreibst Du nicht wirklich, oder übersehe ich 
etwas?

Hast Du JP2 geschlossen?
Da Du die Register zurücklesen kannst:
Initialisiere den CAN und gehe Buson.
Lies den Status zurück, ob er wirklich Active gegangen ist.

Weise eine Nachricht zum Senden an.
Lass die Interrupte erstmal aus.
Kurz warten, nicht dass Du einem Passive oder Busoff zuvorkommst.
Status relevante Register auslesen.

Ohne Gegenstelle müßte der CAN ständig senden und Error Passive melden.

Was siehst Du?
#3963217
Lesenswert?

Steffen Rose schrieb:
> Aber dein CAN Problem beschreibst Du nicht wirklich, oder übersehe ich
> etwas?

Weiter oben hatte ich die Register Einträge gepostet

>
> Hast Du JP2 geschlossen?
Ja

> Da Du die Register zurücklesen kannst:
> Initialisiere den CAN und gehe Buson.
> Lies den Status zurück, ob er wirklich Active gegangen ist.
done
>
> Weise eine Nachricht zum Senden an.
done
> Lass die Interrupte erstmal aus.
Das ist fest verankert in der LIB. Daher habe ich keinen großen Einfluss 
darauf.
> Kurz warten, nicht dass Du einem Passive oder Busoff zuvorkommst.
> Status relevante Register auslesen.
done
>
> Ohne Gegenstelle müßte der CAN ständig senden und Error Passive melden.
>
> Was siehst Du?
Der tx hat bit 7 und rx keins bei der ersten Platine.
Rx zeigt einen Überlauf des Empfang Buffers an und tx kein Fehler Bit
bei der zweiten.


Für eine bessere Analyse, was auf dem MCP25625 passiert, muss ich ihn 
mal direkt und ohne die LIB ansprechen.
#3963219
Lesenswert?

dunno.. schrieb:
> Bülent C. schrieb:
>> Das mit dem Quarz habe ich schon öfters gehört hier.. Was genau ist
>> nicht ok?
>
> Nachdem ich hier den Lothar schon erwähnt hatte:
> http://www.lothar-miller.de/s9y/categories/33-Quarz
>
> lothar miller + quartzlayout bringt von google auch nen haufen treffer
> hier. ziemlich spannend zu lesen, wenns interessiert. ;)

Das sieht sehr gut aus. Danke für den Hinweis.
#3963275
Lesenswert?

Bülent C. schrieb:
> Steffen Rose schrieb:
>> Aber dein CAN Problem beschreibst Du nicht wirklich, oder übersehe ich
>> etwas?
>
> Weiter oben hatte ich die Register Einträge gepostet

Das war mir durch die Lappen gegangen, da du nicht direkt die 
Registerwerte gepostet hast.


>>
>> Hast Du JP2 geschlossen?
> Ja
>
>> Da Du die Register zurücklesen kannst:
>> Initialisiere den CAN und gehe Buson.
>> Lies den Status zurück, ob er wirklich Active gegangen ist.
> done
>>
>> Weise eine Nachricht zum Senden an.
> done
>> Lass die Interrupte erstmal aus.
> Das ist fest verankert in der LIB. Daher habe ich keinen großen Einfluss
> darauf.

Du kannst nicht einmal den globalen Interrupt sperren/gesperrt lassen?
OK, solange dies nicht dein eigentliches Problem ist. Du hattest nur 
selbst die Vermutung geäußert.

>> Kurz warten, nicht dass Du einem Passive oder Busoff zuvorkommst.
>> Status relevante Register auslesen.
> done
>>
>> Ohne Gegenstelle müßte der CAN ständig senden und Error Passive melden.
>>
>> Was siehst Du?
> Der tx hat bit 7 und rx keins bei der ersten Platine.
> Rx zeigt einen Überlauf des Empfang Buffers an und tx kein Fehler Bit
> bei der zweiten.

Wieder erwähnst Du nicht die Register oder SPI Kommandos, auf die Du 
dich beziehst.

EFLG
CANSTAT

RX und TX sind die Bezeichner für zwei Platinen?

Wenn RX überläuft:
Was meinen die Register:
CANINTE
CANINTF
auf diesem System?

Häufiges Problem: Der Interrupt wird in der CPU häufig per 
Flankenwechsel ausgelöst. Mit dieser Einstellung kann man schnell auch 
mal einen Interrupt verpassen. In diesem Fall wäre ein Level Interrupt 
besser.
Doch das könntest Du auch schnell auf der Platine nachmessen - ob die 
Interruptleitung dauerhaft aktiv ist.
#3965691
Lesenswert?

Lothar Miller schrieb:
> Und was funktioniert nicht?
Mit CAN1 schicke ich eine Nachricht an CAN2, der empfängt diese, 
inkrementiert die ID und schickt sie zurück an CAN1, der wiederum tut 
das gleiche....CAN1 kann die Message nicht schicken, bzw CAN2 erhält 
diese nicht. Das weiß ich im Moment garnicht.
> Wie stellst du das fest?
Debug ausgabe am LCD bzw. UART. Register der MCP25625 auf den jeweiligen 
Platinen kann ich lesen und beschreiben. Daher gehe ich mal davon aus, 
das die SPI Kommunikation funktioniert.
> Hast du ein Oszilloskop?
Noch nicht. Aber ein Analyzer ist schon auf dem Weg. Oszi folgt.
#3965702
Lesenswert?

Lothar Miller schrieb:
> Gut. Denn wenn du nicht mal weißt, ob überhaupt was aus die Leitung
> rausgeht, bzw. wie das aussieht, ist es wie Stochern in der Suppe: mit
> ein wenig Glück findest du einen Brocken Fleisch...

Eben..Deswegen habe ich auch in der zwischenzeit das Layout optimiert, 
um eventuelle harwarebedingte Fehler auszumerzen. Auch benutze ich kein 
6x6 QFN28 mehr, wo ich die Befürchtung habe, das ich es evtl. nicht 
richtig verlöten konnte. Die Paste hatte ich zwar sauber auf die 
einzelnen Pads angebracht, aber 100%'ig bin ich mir nicht sicher ob da 
Kontakt ist.
#3965761
Lesenswert?

Bülent C. schrieb:
> Frank K. schrieb:
>> Anbei ein alternativer Schaltungsvorschlag, den ich eben mal so in einer
>> Stunde gemacht habe. Denke mal darüber nach...

> Ich nutze aber keinen PIC...
Ich weiß wohl, dass Dein Horizont begrenzt ist.

> Aber worüber genau soll ich nachdenken?
genau darüber. Siehe Teil 1 Deiner Antwort.

Du siehst ja, dass mein Vorschlag einfacher ist, weniger Bauteile 
braucht, billiger ist, und obendrein schneller ist, weil kein SPI 
dazwischen ist und der ECAN im PIC eine Weiterentwicklung des MCP2515 
ist und mehr Buffer und andere kleine Verbeserungen und Bugfixes hat.

Ich kann Dir den Weg zeigen, gehen musst Du ihn selber.

fchk

PS: Es gäbe noch den LPC11C14, bei dem auch der Transceiver intern ist 
(zwei Dies in einem Package). Ich habe aber immer gerne den Transceiver 
extern, weil das immer das erste ist, was kaputt geht, und ein SO08 ist 
einfacher getauscht als ein QFN32 mit Exposed Pad. Außerdem brauchts 
manchmal andere Transceiver, zB für SIngle Wire Can, FT CAN, Low Speed 
Busse etc.
#3965794
Lesenswert?

Frank K. schrieb:
> Bülent C. schrieb:
>> Frank K. schrieb:
>>> Anbei ein alternativer Schaltungsvorschlag, den ich eben mal so in einer
>>> Stunde gemacht habe. Denke mal darüber nach...
>
>> Ich nutze aber keinen PIC...
> Ich weiß wohl, dass Dein Horizont begrenzt ist.
Was soll denn dieser Unsinn???? gehts noch?
>
>> Aber worüber genau soll ich nachdenken?
> genau darüber. Siehe Teil 1 Deiner Antwort.
Siehe meine Antwort oben!

>
> Du siehst ja, dass mein Vorschlag einfacher ist, weniger Bauteile
> braucht, billiger ist, und obendrein schneller ist, weil kein SPI
> dazwischen ist und der ECAN im PIC eine Weiterentwicklung des MCP2515
> ist und mehr Buffer und andere kleine Verbeserungen und Bugfixes hat.
>
Biller ist es ganz gewiss nicht, eher teurer als die Kombi ATMega168 und 
MCP25625..40 Cent sogar!! Ok, SPI ist ein Flaschenhals...aber für die 
vorliegende Anforderung reicht es allemal.


> Ich kann Dir den Weg zeigen, gehen musst Du ihn selber.
Danke, aber den von Dir vorgeschlagenen Weg kann ich nicht gehen!
Wie kannst Du denn eigentlich einen Vorschlag machen, wenn Du nicht mal 
die Anforderungen kennst?!?!

>
> fchk
>
> PS: Es gäbe noch den LPC11C14, bei dem auch der Transceiver intern ist
> (zwei Dies in einem Package). Ich habe aber immer gerne den Transceiver
> extern, weil das immer das erste ist, was kaputt geht, und ein SO08 ist
> einfacher getauscht als ein QFN32 mit Exposed Pad. Außerdem brauchts
> manchmal andere Transceiver, zB für SIngle Wire Can, FT CAN, Low Speed
> Busse etc.

Der LPC11C14 nicht, sondern der LPC11C22 und LPC11C24 haben den 
Transceiver inne.
#3965813
Lesenswert?

Frank K. schrieb:
> Du siehst ja, dass mein Vorschlag einfacher ist, weniger Bauteile
> braucht, billiger ist, und obendrein schneller ist, weil kein SPI
> dazwischen ist und der ECAN im PIC eine Weiterentwicklung des MCP2515
> ist und mehr Buffer und andere kleine Verbeserungen und Bugfixes hat.

....oder willst Du hier eine PIC vs. AVR Diskussion anzetteln...so ala :
Beitrag "Re: AVR gegen den Rest der Welt"
#3966066
Lesenswert?

Steffen Rose schrieb:
> Woher weißt Du, ob die SPI Kommunikation funktioniert, wenn Du nicht
> einmal die Fehlerregister auslesen kannst?

Wo habe ich denn sowas geschrieben???
Sagtmal, ließt Ihr mal richtig die Beiträge?
Die Lib die ich nutze hat Funktionen, die über SPI die Register auslesen 
und den Inhalt zurückgeben. Diese Funktionen haben mir Werte 
zurückgegeben, und auch mal keine, wenn ich den CS untebrochen hatte 
(hatte mir auch eine Breakout Platine für den MCP25625 gebaut)...ergo 
funktioniert die SPI Kommunikation.
Das einizge was ich noch nicht gemacht habe ist, das ich "noch" nicht 
selbst direkt auf die Register zugegriffen habe.
#3966366
Lesenswert?

Du schriebst, dass die Lib die Zugriffe durchführt und suggerierst mit 
deiner Aussage

> Wie schon oben geschrieben, ich muss mal auf den MCP25625 direkt per SPI
> zugreifen. Das mache ich noch.

dass es dir bisher nicht möglich ist, aus deiner Applikation heraus auf 
die Register zuzugreifen.

Wo also schreibst Du, dass Du weißt, dass die Daten auch richtig vom MCP 
interpretiert wurden? Dafür wäre ein Rücklesen notwendig.

Um deine Aussagen als sicher oder unsicher einzustufen, wäre es auch 
wichtig zu wissen, wie du zu deiner Erkenntnis gekommen bist.
(z.B. beschreibst du deinen SPI Test erst in deiner letzten Aussage)


> char Buffer[1];
> itoa(error,Buffer,10);

Müßte der Buffer nicht 4 Zeichen groß sein? (0..255 und '\0').
Ich wäre mir unsicher, welches Bit im error register nun eigentlich 
wirklich gesetzt ist. Und dein Stack dürfte auch durcheinander sein(?).

> In den jeweiligen error Registern sind bits gesetzt. Das konnte ich noch
> auslesen.
> Der tx hat bit 7 und rx keins bei der ersten Platine.
> Rx zeigt einen Überlauf des Empfang Buffers an und tx kein Fehler Bit
> bei der zweiten.
> Das ist merkwürdig.

> error = can_read_error_register().tx
Das EFLG Register gibt es nicht getrennt nach TX und RX.
Insofern erscheint mir deine Interpretation fehlerhaft.
1
can_error_register_t mcp2515_read_error_register(void)
2
{
3
  can_error_register_t error;
4
  
5
  error.tx = mcp2515_read_register(TEC);
6
  error.rx = mcp2515_read_register(REC);
7
  
8
  return error;
9
}

Dein Sender ist im Error Passive oder möglicherweise im Busoff. Der 
Counter läuft dann nicht weiter.
#3966389
Lesenswert?

Ja ok..evtl. etwas unglücklich formuliert.
1
if (can_init(BITRATE_125_KBPS))
2
    lcd_printlcc(2,1,"CAN geht");
3
    
4
  else
5
    lcd_printlcc(2,1,"CAN geht net");

Der Aufruf der can_init bekommt ein bool aus dieser Funktion hier 
zurück:
1
#if ((BUILD_FOR_MCP2515 + BUILD_FOR_AT90CAN + BUILD_FOR_SJA1000) <= 1)
2
  #if (BUILD_FOR_MCP2515 == 1)
3

4
    #define mcp2515_init(...)          can_init(__VA_ARGS__)


1
bool mcp2515_init(uint8_t bitrate)
2
{
3
  if (bitrate >= 8)
4
    return false;
5
  
6
  SET(MCP2515_CS);
7
  SET_OUTPUT(MCP2515_CS);
8
  
9
  // Aktivieren der Pins fuer das SPI Interface
10
  RESET(P_SCK);
11
  RESET(P_MOSI);
12
  RESET(P_MISO);
13
  
14
  SET_OUTPUT(P_SCK);
15
  SET_OUTPUT(P_MOSI);
16
  SET_INPUT(P_MISO);
17
  
18
  // SPI Einstellung setzen
19
  mcp2515_spi_init();
20
  
21
  // MCP2515 per Software Reset zuruecksetzten,
22
  // danach ist er automatisch im Konfigurations Modus
23
  RESET(MCP2515_CS);
24
  spi_putc(SPI_RESET);
25
  
26
  _delay_ms(1);
27
  
28
  SET(MCP2515_CS);
29
  
30
  // ein bisschen warten bis der MCP2515 sich neu gestartet hat
31
  _delay_ms(10);
32
  
33
  // CNF1..3 Register laden (Bittiming)
34
  RESET(MCP2515_CS);
35
  spi_putc(SPI_WRITE);
36
  spi_putc(CNF3);
37
  for (uint8_t i=0; i<3 ;i++ ) {
38
    spi_putc(pgm_read_byte(&_mcp2515_cnf[bitrate][i]));
39
  }
40
  // aktivieren/deaktivieren der Interrupts
41
  spi_putc(MCP2515_INTERRUPTS);
42
  SET(MCP2515_CS);
43
  
44
  // TXnRTS Bits als Inputs schalten
45
  mcp2515_write_register(TXRTSCTRL, 0);
46
  
47
  #if defined(MCP2515_INT)
48
    SET_INPUT(MCP2515_INT);
49
    SET(MCP2515_INT);
50
  #endif
51
  
52
  #ifdef RXnBF_FUNKTION
53
    SET_INPUT(MCP2515_RX0BF);
54
    SET_INPUT(MCP2515_RX1BF);
55
    
56
    SET(MCP2515_RX0BF);
57
    SET(MCP2515_RX1BF);
58
    
59
    // Aktivieren der Pin-Funktionen fuer RX0BF und RX1BF
60
    mcp2515_write_register(BFPCTRL, (1<<B0BFE)|(1<<B1BFE)|(1<<B0BFM)|(1<<B1BFM));
61
  #else
62
    #ifdef MCP2515_TRANSCEIVER_SLEEP
63
      // activate the pin RX1BF as GPIO which is connected 
64
      // to RS of MCP2551 and set it to 0
65
      mcp2515_write_register(BFPCTRL, (1<<B1BFE));
66
    #else
67
      // Deaktivieren der Pins RXnBF Pins (High Impedance State)
68
      mcp2515_write_register(BFPCTRL, 0);
69
    #endif
70
  #endif
71
  
72
  // Testen ob das auf die beschreibenen Register zugegriffen werden kann
73
  // (=> ist der Chip ueberhaupt ansprechbar?)
74
  bool error = false;
75
  if (mcp2515_read_register(CNF2) != pgm_read_byte(&_mcp2515_cnf[bitrate][1])) {
76
    error = true;
77
  }
78
  
79
  // Device zurueck in den normalen Modus versetzten
80
  // und aktivieren/deaktivieren des Clkout-Pins
81
  mcp2515_write_register(CANCTRL, CLKOUT_PRESCALER_);
82
  
83
  if (error) {
84
    return false;
85
  }
86
  else
87
  {
88
    while ((mcp2515_read_register(CANSTAT) & 0xe0) != 0) {
89
      // warten bis der neue Modus uebernommen wurde
90
    }
91
    
92
    return true;
93
  }
94
}

Die SPI Funktionen werde ich jetzt nicht reintun.

Und wenn ich von dieser Funktion einen true bekomme, dann kann ich doch 
davon ausgehen, das die SPI Kommunikation funktioniert?!?!
#3966443
Lesenswert?

1
if (mcp2515_read_register(CNF2) != pgm_read_byte(&_mcp2515_cnf[bitrate][1])) {

dürfte als SPI Test passen.

Die Reset-Behandlung finde ich etwas unglücklich. Aber wird schon 
passen.

Nun sollte aber auch deinerseits Zugriffe der Art:
mcp2515_read_register(EFLG)
möglich sein.

Ich nehme an, dass dieses Passive anzeigt, was bedeutet, dass dein 
zweites Board nicht mithört oder der Abschlusswiderstand fehlt. (Ja, du 
schriebst, er ist aktiv.)

Senden beide Boards die gleichen Daten? Wenn es genau die gleichen Daten 
sind, ist es kein Problem. Wenn Du jedoch die gleiche CAN ID mit 
unterschiedlichen Datenbytes nutzt, weil du zum Testen variiert hast, 
geht dies schief.
#3966474
Lesenswert?

Steffen Rose schrieb:
> if (mcp2515_read_register(CNF2) !=
> pgm_read_byte(&_mcp2515_cnf[bitrate][1])) {
>
> dürfte als SPI Test passen.
Eben :-)

>
> Die Reset-Behandlung finde ich etwas unglücklich. Aber wird schon
> passen.
Sehe ich genauso...
>
> Nun sollte aber auch deinerseits Zugriffe der Art:
> mcp2515_read_register(EFLG)
> möglich sein.
Ja, sollten Sie. Aber ich will die LIB komplett weglassen und mit 
eigenen Funktionen per SPI die Register auslesen...Das mache ich mit den 
neuen Platinen(Habe ja das Platinen Layout ein wenig optimiert) Wenn ich 
Morgen  wieder zuhause bin, dann ist der Logikanalyzer auch schon 
bestimmt da, und ich kann besser analysieren. nur so ist es derzeit nur 
ein rumgestochere.
>
> Ich nehme an, dass dieses Passive anzeigt, was bedeutet, dass dein
> zweites Board nicht mithört oder der Abschlusswiderstand fehlt. (Ja, du
> schriebst, er ist aktiv.)
>
> Senden beide Boards die gleichen Daten? Wenn es genau die gleichen Daten
> sind, ist es kein Problem. Wenn Du jedoch die gleiche CAN ID mit
> unterschiedlichen Datenbytes nutzt, weil du zum Testen variiert hast,
> geht dies schief.
Mit CAN1 schicke ich eine Nachricht an CAN2, der empfängt diese,
inkrementiert die ID und schickt sie zurück an CAN1, der wiederum tut
das gleiche....CAN1 kann die Message nicht schicken, bzw CAN2 erhält
diese nicht. Das weiß ich im Moment garnicht, und darin liegt mein 
Problem. CAN2 zeigt mir einen überlauf des Buffers an...Ich tippe hier 
darauf, das der Interrupt nicht ausgelöst wird... Wie gesagt, ich 
stochere gerade nur rum...Wenn der Analyser da ist, dann weiß ich mehr
#3966503
Lesenswert?

Ich gehe davon aus, dass CAN1 und CAN2 zwei deiner Boards sind und dass 
Du entsprechend deiner Aussage das Programm modifiziert hast.

Desweiteren zur Erinnerung:
can_read_error_register().rx
ist der Error counter, nicht das EFLG. Den Buffer Overflow würdest Du 
aber im EFLG sehen. Diese Erkenntnis ist falsch, wenn du die angegebene 
Funktion genutzt hast.
#3966515
Lesenswert?

Steffen Rose schrieb:
> Desweiteren zur Erinnerung:
> can_read_error_register().rx
> ist der Error counter, nicht das EFLG. Den Buffer Overflow würdest Du
> aber im EFLG sehen. Diese Erkenntnis ist falsch, wenn du die angegebene
> Funktion genutzt hast.

Stimmt! Ich hatte zwischendurch aber auch mal das EFLG gelesen.. Wie 
gesagt, anscheinend habe ich mich unglücklich ausgedrückt.
Danke für Deine Hilfe.

Wenn ich die neue Platine geätzt, gebohrt, durchnietet und bestückt 
habe, werde ich nochmal testen und hier die Ergebnise berichten.
#3983485
Lesenswert?

CAN-L sieht mir aber auch nicht so ganz richtig aus.

Miß erstmal nur ein Board statisch durch.

CAN-TX sollte auf High stehen (rezessiv).
Damit dann CAN-H und CAN-L rezessive sein.
Daraus folgt dann, dass an CAN-RX auch ein High anliegt.

Um den Transceiver zu testen lege ich als nächstes von außen per CAN 
Analyzer ein Signal an und prüfe CAN-RX.
(So kann mir keiner Einreden, meine Software hätte einen Fehler.)
#3983643
Lesenswert?

Das ist doch zum Mäusemelken mit dem MCP25625, so langsam aber sicher 
fliegen die Platinen gleich aus dem Fenster.
Habe nochmal folgende Sachen überprüft:
- SPI funktioniert
- INT funktioniert
- Der MCP25625 ist sauber beschaltet. TX geht auch an TXCan und RX an 
RXCan
- Der Quarz schwingt
- Der Abschlußwiderstand ist auch richtig beschaltet
- VDD, VIO und VDDA werden sauber mit 5V versorgt (Abblockkerkos sind 
dran)
- Beide Platinen haben den selben Masse Bezugspunkt
- CANL an CANL, und CANH an CANH angeschloßen
- Im Fehlerregister sind keine Fehler vermerkt
- Reset ist mit einem PULL-UP hochgezogen


Ich bin mir ziemlich sicher, das ich etwas ziemlich offensichtliches 
übersehe.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren