안녕하세요 제가 can통신 소스를 짜고 있습니다
수신단을 만들고 있는데요
수많은 ID를 가진 데이타들이 연속적으로 들어올 때 다른 ID를 가진 데이타들은 필터링해버리고
제가 원하는 ID를 가진 데이타만 받으려고 합니다 기본적으로 emax에서 준 소프트웨어를 이용하고 있는데요
void can_rx_set(char obj, unsigned long id, char ide, unsigned char dlc, unsigned long idmask, unsigned char rtrIdemask)
{
CANPAGE = obj<<4; // set MOb numberCANSTMOB = 0x00; // clear status
if(ide== STD) // standard
{
CANIDT1= (unsigned char)(id>>3);
CANIDT2= (unsigned char)(id<<5);CANIDM1= (unsigned char)(idmask>>3);
CANIDM2= (unsigned char)(idmask<<5);
CANIDM4=0;CANCDMOB &= ~0x10; // clear IDE =0, standard 11 bits
usart1_transmit_string("\rRx Standard Set\n");
}
else // extended
{
CANIDT1= (unsigned char)(id>>21);
CANIDT2= (unsigned char)(id>>13);
CANIDT3= (unsigned char)(id>>5);
CANIDT4= (unsigned char)(id<<3);CANIDM1= (unsigned char)(idmask>>21);
CANIDM2= (unsigned char)(idmask>>13);
CANIDM3= (unsigned char)(idmask>>5);
CANIDM4= (unsigned char)(idmask<<3);CANCDMOB |= 0x10; // set IDE =1, extended 29 bits
usart1_transmit_string("\rRx Extended Set\n");
}
CANCDMOB |= (dlc & 0x0f); // set data lengthCANIDM4 |= (unsigned char)(rtrIdemask & 0x07);
// CANIDM4 &= ~0x04; // RTRMSK= 1/0 enable comparison (Data receive)
// CANIDM4 &= ~0x02; // recommended
// CANIDM4 &= ~0x01; // IDEMSK= 1/0 enable comparison (IDE receive)CANCDMOB |= 0x80; // receive enable
}
여기서
can_rx_set(3, 0x7DF, EXT, 8, 0x00000000, 0x00); 로하면 모든 mod에서 오는 모든 ID를 가진 데이타들이 받아지더군요
저기서
can_rx_set(3, 0x7DF, EXT, 8, 0x1fffffff, 0x05); 로하면 0x7DF의 ID만 가진 데이터만 받아진다고 하는데 아에 아무것도 안받아지네요
뭐가 잘못됬는지 소스상으로 뭐가 잘못된건지 ㅜㅜ 아시는분 계시면 가르쳐주세요~
-
주석 처리 된 부분에서 CANIDM4 &= ~0x01; 이 부분을 활성화 시키세요
IDMSK 비트가 0으로 되어있어야 마스크가 동작합니다. -
0x7DF라면 자동차쪽 같은데 굳이 확장 ID를 사용하지 않아도 될텐데요...
-
자동차쪽도 확장 ID를 사용하긴 하는데...
CAN 2.0B 사용으로... -
모두 갑변감사합니다~ ㅜㅜ
'CAN/OBD-II' 카테고리의 다른 글
차량용 CAN , KWP-2000 에 대한 보쉬의 PT 자료 (1) | 2010.11.03 |
---|---|
개발용 AT90CAN128 CPU 보드 (1) | 2010.10.04 |
투싼IX 의 CAN 신호 추출 (13) | 2010.09.30 |
전압분배 계산기 (0) | 2010.09.29 |
AT90CAN128 Filtering Check Tool (0) | 2010.09.29 |