CAN: Senden mit AT90CAN128

Gast #558037
Lesenswert?

Hallo,

ich studiere im Moment dir Doku zum AT90CAN128. Was sich mit dabei 
einfach nicht erschließen will, ist, wie ich den CAN-Kontroller dazu 
veranlassen kann, ein bestimmtes MOb zu senden bzw. welche Registerbits 
dafür zuständig sind.
Könt ihr mit mal auf die Sprünge helfen?

TIA,
Harald
Gast #558270
Lesenswert?

Hi,

das hatte ich bereits gefunden. Was mit bei dem Ganzen allerdings noch 
nicht so richtig klar wurde, ist eben, welche Aktion genau denn nun das 
Senden eines Frames veranlasst (D.h., welches Bit wo gesetzt wird etc.(. 
Da werden irgendwelche MAkros und Funktionen aufgerufen, die ich 
teilweise auch nicht vollständig zurückverfolgen kann.

Gruß,
Harald
#558451
Lesenswert?

Hi,

also ich geh jetzt mal von C aus, da gehts eigentlich ganz einfach... 
data[ i ] ist ein Array in einer Struct wo meine Datenbytes drin stehen, 
also auch nichts Hexerisches... .-)

Wo genau ist den dein Problem?

1
// Datenbytes in die Mailbox stecken
2
for( unsigned char i = 0; i < 8; i++ ){
3
   CANMSG = pmsg->data[ i ];
4
}
5
  
6
// CAN Frame verschicken
7
CANCDMOB |= ( 1 << CONMOB0 );
8
  
9
// Warten bis Frame verschickt ist
10
while( !( CANSTMOB & ( 1 << TXOK ) ) );
11
  
12
// TX Falg zurücksetzten
13
CANSTMOB &= ~( 1 << TXOK );

Das wars eigentlich, genauere Erläuterungen zu den einzelnen Bits stehen 
im Datenblat... zu finden bei atmel.com... :-) fg

Gruß Micha,
Gast #558934
Lesenswert?

Hallo Micha,

vielen Dank für Deine Antwort. Hilft schon mal weiter.

> Wo genau ist den dein Problem?

Vermutlich durchblicke ich dei Zugriffsmechanismen
auf die einzelnen MOb-Pages noch nicht ganz.

<code>

// Datenbytes in die Mailbox stecken
for( unsigned char i = 0; i < 8; i++ ){
   CANMSG = pmsg->data[ i ];
}

</code>

Ich verstehe das jetzt folgendermaßen:
Das AINC-Bit in CANPAGE wurde auf 0 gesetzt;
daher schaltet der Controller nach jedem Schreibzugriff
CANMSG auf das nächste Byte in der MOb-Page.
Am Ende habe ich in der Page also ein Set aus 8
Nutzdatenbytes abgelegt. Habe ich das so richtig
verstanden?

Frage: Wodurch werden die Daten einem der 15 MObs
nub zugeordnet?

<code>

// CAN Frame verschicken
CANCDMOB |= ( 1 << CONMOB0 );

</code>

Hallelujah! Genau das wollte ich die ganze Zeit wissen:
Wenn also die Steuerbits in CANCDMOB entsprechend gesetzt
werden, dann leitet das die physikalische Datenübertragung ein.
Aber auch hier wieder die Frage: Wie wird festgelegt,
von welchem MOb das Telegramm abstammen soll?

<code>

// Warten bis Frame verschickt ist
while( !( CANSTMOB & ( 1 << TXOK ) ) );

// TX Falg zurücksetzten
CANSTMOB &= ~( 1 << TXOK );

</code>

Das ist dann soweit klar.
Besten Dank!

Gruß,
Harald
Gast #558960
Lesenswert?

Die MOBs musst Du in einer speziellen Reihenfolge beschreiben.

Glaub IDs, Masken Datefeld und dann zum Schluss das Register mit dem CAN
DLC. Wenn Du das beschreibst und dort wird glaub auch festgelegt, ob es 
ein RX oder TX MOB ist, dann wird automatisch ein Bit gesetzt glaub in 
MOBCON
oder CONMOB oder so ähnlich (Ist ne Weile her bei mir).

Ist das Bit in dem Connect Register gesetzt, dann sendet der CAN Teil 
das Mob automatisch bei der nächsten Gelegenheit! (Glaub auch solange, 
bis ein ACK
kommt)

Achtung ein Warnhinweis: Der DLC kann nur einmal festgelget werden, da 
beim
Überschreiben das MOB automatisch aktiviert wird! (siehe Datenblatt)
Das passiert jedes Mal wenn Du das Register mit dem DLC beschreibst.

(bin ich mal drüber gestolpert)
#559119
Lesenswert?

Harald, ich sags mal so...

Ich brauchte auch eine "kleine Weile" bis mir die CAN-Engine so wirklich 
geheuer war... :-)

Zumal, als ich mit dem CAN128 eingestiegen bis, hatte ich damals noch 
ein silicon-release mit fehlern und das Datenblatt hatte noch 
preliminary Status...

Einige Zeit, Revisions und Errata's später hat dann auch die CAN-Engine 
funktioniert und das Datenblatt war auf heutigem Stand... .-

Aber falls du nun noch hilfe brauchst, bescheid geben!

Gruß Micha,

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