Hallo,
seit Tagen spiele ich mit der Bibliothek zu CAN von Thomas Fuchs für
AT90CAN128. Nun stehe ich vor einer weiteren Herausforderung. Denn ich
bekomme es nicht hin, MObs zu filtern.
Ich verstehe das beschreiben der Masken und IDTs in beiden Funktionen
zusammen nicht!?!
hier kurz die Initialisierung:
// initializes CAN interface
// Funktion zum Initialisieren
bool initCAN( uint8_t bitrate )
{
CAN_DDR |= _BV(CAN_TX);
CAN_DDR &= ~_BV(CAN_RX);
// security check
if (bitrate >= 8) return false;
// number of the MOb
uint8_t mob;
CANGCON |= (1<<SWRES); // reset the CAN controller
CANGCON = 0x00; // reset the general control register (CONFIG
mode)
// reset the interrupt registers
CANSIT2 = 0x00;
CANSIT1 = 0x00;
CANGIT = 0x00;
CANGIE = 0x00;
CANEN1 = 0x00;
CANEN2 = 0x00;
CANIE1 = 0x00;
CANIE2 = 0x00;
// set auto inc to Data Buffer Index (DBI)
CANPAGE &= ~(1<<AINC);
// set all MObs to 0
for (mob = 0; mob < NR_MOBS; mob++)
{
CANPAGE = (mob << 4);
CANIDT1 = 0x00; // reset ID-Tag
CANIDT2 = 0x00;
CANIDT3 = 0x00;
CANIDT4 = 0x00;
CANIDM1 = 0x00; // reset ID-Mask
CANIDM2 = 0x00;
CANIDM3 = 0x00;
CANIDM4 = 0x00;
CANSTMOB = 0x00; // reset MOb status
CANCDMOB = 0x00; // disable MOb
}
// set CAN Bit Timing,(see datasheet page 260)
CANBT1 = pgm_read_byte(&_at90can_cnf[bitrate][0]);
CANBT2 = pgm_read_byte(&_at90can_cnf[bitrate][1]);
CANBT3 = pgm_read_byte(&_at90can_cnf[bitrate][2]);
// set config to MObs 1 and 2
// MOb 1 soll empfangen
// MOb 2 soll senden
for (mob = 1; mob < 3; mob++)
{
CANPAGE = (mob << 4);
CANSTMOB = 0x00; // reset MOb status
switch (mob)
{
case 1:
CANCDMOB = 0x80; // RX
CANIDT1 = 0x00; // set ID-Tag
CANIDT2 = 0x00;
CANIDM1 = 0x00; // set ID-Mask, receive all
CANIDM2 = 0x00;
break;
case 2:
CANIDT1 = 0x00; // set ID-Tag
CANIDT2 = 0x00;
break;
default:
return false;
}
}
// Enable all required interrupts
CANGIE = 0xB0; // ENIT, ENRX, ENTX
CANIE2 = 0x06; // MOb 1, MOb 2 aktivieren
// switch CAN on
CANGCON |= (1<<ENASTB);
// wait for EnableFlag
while (!(CANGSTA & (1<<ENFG)));
return true;
}
und hier in der configRX() werden die Masken und IDTs erneut
beschrieben.
// config the receive mob
void configRX()
{
uint8_t mob;
// receive in this MOb
mob = 1;
CANPAGE = (mob<<4); // rotate 4 bits left
// define the IDTags to get only one ID (Filter)
CANIDT4 = 0;
CANIDT3 = 0;
CANIDT2 = 0;
CANIDT1 = 0;
// define the IDMasks to activate the Tags (Maske)
// 1 means filter, 0 means uncared
CANIDM1 = 0x00; //filter off, don't care
CANIDM2 = 0x00;
// activate receiving messages with 11 bit id´s
CANCDMOB = (1<<CONMOB1);
}
Mein Problem ist, dass ich nicht weiß wie ich beide Funktionen abändern
muss damit ich einzelne MObs mit Filtern belegen kann. Ich habe schon
versucht nur jeweils eine Funktion abzuändern und auch beide Funktionen
gleichzeitig. Alles ohne Erfolg.
Ich hoffe ihr könnt mir erklären, was ich hier nicht ganz zu begreifen
scheine.
Grüße
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.