CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

CAN Filters - what am I missing?

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
seidleroni



Joined: 08 Sep 2008
Posts: 21

View user's profile Send private message

CAN Filters - what am I missing?
PostPosted: Wed Nov 26, 2008 10:48 am     Reply with quote

I am trying to enable CAN filters in my code, but using the "can_enable_filter()" function gives me a "Undefined identifier" error in my compiler. What gives?

Also, I tried without that function call and using a filter code below and it never filters:
Code:

canMask =    0x100FF000;   
   canFilter = 0x10011000;
   
   
   can_set_id(RX0MASK, canMask, CAN_USE_EXTENDED_ID);  //set mask 0
   can_set_id(RX0FILTER0, canFilter, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 0
   can_set_id(RX0FILTER1, canFilter, CAN_USE_EXTENDED_ID);  //set filter 1 of mask 0

   can_set_id(RX1MASK, canMask, CAN_USE_EXTENDED_ID);  //set mask 1
   can_set_id(RX1FILTER2, canFilter, CAN_USE_EXTENDED_ID);  //set filter 0 of mask 1
   can_set_id(RX1FILTER3, canFilter, CAN_USE_EXTENDED_ID);  //set filter 1 of mask 1
   can_set_id(RX1FILTER4, canFilter, CAN_USE_EXTENDED_ID);  //set filter 2 of mask 1
   can_set_id(RX1FILTER5, canFilter, CAN_USE_EXTENDED_ID);  //set filter 3 of mask 1


Any help?
newguy



Joined: 24 Jun 2004
Posts: 1903

View user's profile Send private message

PostPosted: Wed Nov 26, 2008 11:26 am     Reply with quote

I have a multiprocessor product and the different processors all communicate via CAN. I based my code on the CCS example code, but I use the CAN RX interrupts. This is the way I set things up:

Code:
// for locations (# shifts)
#define FROM         25
#define DEST         21
#define PURP         18
#define MULTI_STEP   14

#define SENDER_MASK  0x1e000000
#define RECIP_MASK   0x01e00000
#define PURP_MASK    0x001c0000
#define STEP_MASK    0x0003c000
#define MESSAGE_MASK 0x00003fff

// for the from/to addressing
#define TOUCH     1
#define MEMORY    2
#define PROC   3
#define MASTER    4
#define DIS_PROC  5
#define AUX1      6
#define AUX2      7
#define DEBUG     8
#define ALL       9

// for the message purpose
#define STORE     0
#define FETCH     1
#define CONT      2
#define INFO      3
#define ACK       4
#define NACK      5
#define F_MULTI   6
#define MULTI_END 7

// "master" init:
void can_init(void) {
   can_set_mode(CAN_OP_CONFIG);   //must be in config mode before params can be set
   can_set_baud();

   RXB0CON=0;
   RXB0CON.rxm=CAN_RX_VALID;
   RXB0CON.rxb0dben=CAN_USE_RX_DOUBLE_BUFFER;
   RXB1CON=RXB0CON;

   CIOCON.endrhi=CAN_ENABLE_DRIVE_HIGH;
   CIOCON.cancap=CAN_ENABLE_CAN_CAPTURE;

   can_set_id(RX0MASK, RECIP_MASK, CAN_USE_EXTENDED_ID);  // set mask 0 to only examine recipient field
   can_set_id(RX0FILTER0, MASTER << DEST, CAN_USE_EXTENDED_ID);  // set filter 0 of mask 0 to respond to messages addressed to the master
   can_set_id(RX0FILTER1, 0, CAN_USE_EXTENDED_ID);  // don't use filter 1
   // use rx 1 for everything else
   can_set_id(RX1MASK, RECIP_MASK, CAN_USE_EXTENDED_ID);  // set mask 1 to only examine recipient field
   can_set_id(RX1FILTER2, ALL << DEST, CAN_USE_EXTENDED_ID);  // set filter 2 of mask 1 to respond to broadcast messages only
   can_set_id(RX1FILTER3, 0, CAN_USE_EXTENDED_ID);  // don't use filter 3
   can_set_id(RX1FILTER4, 0, CAN_USE_EXTENDED_ID);  // don't use filter 4
   can_set_id(RX1FILTER5, 0, CAN_USE_EXTENDED_ID);  // don't use filter 5

   set_tris_b((*0xF93 & 0xFB ) | 0x08);   //b3 is out, b2 is in

   can_set_mode(CAN_OP_NORMAL);
}

// example of CAN rx code - triggered by CAN RX0 interrupt elsewhere
void process_message0(void) { // for messages addressed directly to master
   int8 sender;
   int8 purpose;
   int8 step_number;
   int16 message_id;
   int8 i, j, k;

   get_0_data(rx_id, &in_data0[0], rx_len, rxstat0);

   sender = (rx_id & SENDER_MASK) >> FROM;
   purpose = (rx_id & PURP_MASK) >> PURP;
   step_number = (rx_id & STEP_MASK) >> MULTI_STEP;
   message_id = (rx_id & MESSAGE_MASK);

   // put code here to sort through what was actually sent, based on the message_id
}


By setting things up in this manner, sending & receiving messages is very easy. Just put a list of CAN messages in a header file. To transmit something, just "build" the transmit id like this:

Code:
transmit_id = (MASTER << FROM) | (MEMORY << DEST) | (FETCH << PURP) | RETRIEVE_SERNUM;

can_putd(transmit_id, out_data, 1, 3, tx_ext, 0);


The filters take care of retrieving only messages addressed to that processor or broadcast messages and they work very well. I should point out that message_id is an int16 and transmit_id is an int32.
seidleroni



Joined: 08 Sep 2008
Posts: 21

View user's profile Send private message

PostPosted: Wed Nov 26, 2008 11:54 am     Reply with quote

In my code, the filter is letting everything through, regardless of the ID that it is getting. My mask is 0x100FF000 and my filter is 0x10011000. If my ID is 0x10044000, the message is getting through even though it shouldnt. Why is that happening? Am I missing something?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Nov 26, 2008 12:11 pm     Reply with quote

In your previous thread on CAN bus problems, you said:
http://www.ccsinfo.com/forum/viewtopic.php?t=36814
Quote:
RXB0CON.rxm = CAN_RX_ALL; //added line to make receive interrupts work


The can-18f4580.h file says that constant is equal to 3 (0b11):
Code:
enum CAN_RX_MODE {CAN_RX_ALL=3, CAN_RX_EXT=2, CAN_RX_STD=1, CAN_RX_VALID=0};

The 18F4685 data sheet says:
Quote:

REGISTER 23-13: RXB0CON: RECEIVE BUFFER 0 CONTROL REGISTER
11 = Receive all messages (including those with errors); filter criteria is ignored



This is why it's a good idea to keep all posts on a particular topic in
the same thread.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group