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
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
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(unsignedchari=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,
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
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)
hallo,
die message objects sind "ge-shadowed" (arme deutsche sprache)
auswahl mittels des CANPAGE-registers. also vorher setzen, dann hast du
zugriff auf eben das MOb.
hth,
bye kosmo
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,