CAN 통신 2008 년 4 월 2 일에이스트로닉스 양은숙
목차 CAN 통신이란 CAN 통신특징 CAN 통신규격 CAN 통신응용범위 AT90CAN128 의특징 AT90CAN128 의회로구조 CAN Controller 의구조 AT90CAN128 의 CAN Register Source 예제
1. CAN 통신이란 1988년 Bosch와 Intel에서개발된차량용네트워크시스템. 마이크로컨트롤러들간의통신을위해설계된시리얼네트웍통신방식 1993년도에 ISO에서국제표준규격으로제정.
2. CAN 통신특징 2 가닥의꼬임선 (Twist Pair Wire) 으로연결되어반이중통신 (Half Duplex) 방식 주소가아닌 ID(identifier) 에의해메시지의내용뿐만아니라우선순위도결정.
3. CAN 통신규격 CAN 메시지에있는식별자 (ID) 의길이 표준 CAN ( 버전 2.0A) : 11 비트식별자 확장 CAN ( 버전 2.0B) : 29 비트식별자 ISO 규격에따라구분 ISO 11898 : 1Mbps 이상의고속통신가능 ISO 11519 : 125Kbps 까지의통신가능
표준 CAN ( 버전 2.0A)
확장 CAN ( 버전 2.0B)
4. CAN 통신응용범위 일반차량 : ECU 포함전자장치들간의통신및차체 utility 제어 the leading vehicle bus protocol in Europe 건설용중장비차량및열차 산업자동화 : 제어기와센서, 액츄에이터사이데이터통신서로다른지능모듈들을연결 의료장비, 건물자동화
5. AT90CAN128 특징 AVR 8-bit Microcontroller FLASH : 128k bytes EEPROM : 4k bytes SRAM : 4k bytes 최대 64k bytes 의외부메모리공간 JTAG(IEEE 1149.1 호환 ) Interface CAN Controller 2.0A & 2.0B 내장 15 개의 MOB 를가짐 8 채널, 10bit SAR ADC 2.7 ~ 5.0V 에서동작 Maximum Frequency : 8MHz(2.7V), 16MHz(4.5V)
7. CAN Controller 구조
8. CAN Register - CANGCON ABRQ (Abort Request) 1 : 모든 MObdisabled 통신전면중단 OVRQ (Overload Frame Request) 1 : overload frame 전송요청 (1) (90CAN128 은매우바쁠수있다.) TTC (Time Trigger Communication) 1 : TTC mode 에러발생해도, 해당프레임은전송 SYNTTC (Synchronization of TTC) 0 : SOF 에서 TTC timer 동작 sync. 1 : EOF 마지막 bit 에서 TTC timer 동작 sync.
LISTEN (Listening Mode : 수신전용 ) 1 : listening mode hardware loop back TEST (Test Mode) 개발자용아님. 0 으로고정 ENA/STB (Enable/Standby Mode) 0 : standby mode 진입명령 1 : enable mode 진입명령 11 recessive bit 검출후진입 SWRES (Software Reset Request) 1 : CAN controller reset (BOFF Error Active 진입시사용 )
8. CAN Register - CANEN 각 MOb 의사용가능상태를표현 0 : 해당 MOb 가 disable 상태또는송수신완료후대기상태 1 : 해당 MOb 가 enable 상태또는송수신중
8. CAN Register - CANGIE ENIT (Enable All INTs) = 1 INT 가능 (OVRTIM 제외 ) ENBOFF (Enable Bus Off INT) = 1 BOFF INT 가능 ENRX (Enable Receive INT) = 1 Receive INT 가능 ENTX (Enable Transmit INT) = 1 Transmit INT 가능 ENERR (Enable MOb Errors INT) = 1 MOb Errors INT 가능 ENBX (Enable Frame Buffer INT) = 1 Frame Buffer INT 가능 ENERG (Enable General Errors INT) = 1 General Errors INT 가능 ENOVRT (Enable CAN Timer Overrun INT) = 1 OVRTIM INT 가능
8. CAN Register CANIE2/1 1 : 해당 MOb 의 INT 발생가능
8. CAN Register - CANHPMOB HPMOB[3:0] (Highest Priority MOb Number) : INT 발생 MOb 중최고우선순위를갖는 MOb number CGP[3:0] (CAN General Purpose Bits) : CANPAGE register 조합형범용 bit
8. CAN Register CANBT1 BRP (Baud Rate Prescaler) = [0..63]
8. CAN Register CANBT2 SJW (Re-Synchronization Jump Width) : Bit Resynchronization을위한 Bit time 조절폭 = [0:3] Tsjw = Tscl (SJW + 1) = 1~4 TQ PRS (Propagation Time Segment) : input comparator, output driver 에의한 delay 및 propagation delay 보상용 = [0:7] Tprs = Tscl (PRS + 1) = 1~8 TQ
8. CAN Register CANBT3 PHS2 (Phase Segment 2) : Phase edge error 보상에사용 ( 필요에따라 SJW 만큼단축 ) = [0..7] Tphs2 = Tscl (PHS2 + 1) = 1~8 TQ 단, 1 PHS2 PHS1 PHS1 (Phase Segment 1) : Phase edge error 보상에사용 ( 필요에따라 SJW 만큼연장 ) = [0..7] Tphs1 = Tscl (PHS1 + 1) = 1~8 TQ SMP (Sample Point) = 1 3 sampling per bit time = 0 1 sampling per bit time
8. CAN Register CANTCON CAN Timer Prescaler : TclkCANTIM = TclkIO 8 (CANTCON+1)
8. CAN Register CANPAGE MOBNB[3:0] (Mob Number) : MOb number 선택 (0~14) AINC (Auto Increment of the FIFO CAN Data Buffer Index) 0 : auto increment of the index (default value) INDX[2:0] (FIFO CAN Data Buffer Index) : FIFO 내 CAN 데이터의 byte 위치지정
8. CAN Register CANSTMOB DLCW (Data Length Code Warning) : 수신메시지의 DLC 가기대와다를때 TXOK : 송신완료 flag INT 발생가능 확인후 CLEAR! RXOK : 수신완료 flag INT 발생가능 확인후 CLEAR! BERR : Bit Error( 예외는?) INT 발생가능 확인후 CLEAR! SERR : Stuff Error INT 발생가능 확인후 CLEAR! CERR : CRC Error INT 발생가능 확인후 CLEAR! FERR : Form Error INT 발생가능 확인후 CLEAR! AERR : Ack. Error INT 발생가능 확인후 CLEAR!
Boad Rate setting
10. Source 예제 void main(void) { CANGCON=0x02; CANGIE=0xA0; CANEN2=0xFF; CANEN1=0x7F; CANIE2=0xFF; CANIE1=0x7F; CANHPMOB=0x00; CANBT1=0x00; CANBT2=0x0C; CANBT3=0x36; CANTCON=0x00; Boad Rate : 1000K bps 로설정함!
while (1) { if(rx_counter0>0) { uart0_char=getchar(); can_msg.mob=tx_mob; can_msg.id=myid; can_msg.rtr=0; can_msg.dlc=3; can_msg.data[0]='a'; can_msg.data[1]='b'; can_msg.data[2]='c'; can_msg.data[3]='d'; can_msg.data[4]='e'; can_msg.data[5]='f'; can_msg.data[6]='g'; can_msg.data[7]='h'; } printf("%2x r",tx_st_can(can_msg)); } if(can_rx_index>0) { read_rx_message(&can_msg); printf("id:%03x, DLC:%1d, %c%c%c%c%c%c%c%c %d r",can_msg.id,can_msg.dlc,can_msg.data[0],can_msg.data[1],ca n_msg.data[2],can_msg.data[3],can_msg.data[4],can_msg.data[5],can_msg.data[6],can_msg.data[7],c an_rx_index); } };
unsigned char Tx_st_can(can_msg_t msg) { unsigned char i,cancdmob_temp; Can_set_mob(msg.mob); // 사용할 MOB 선정 Can_clear_mob(); //MOB 상태초기화 Can_set_std_id(msg.id); //ID 세팅 (Standard CAN) Can_set_dlc(msg.dlc); //DLC 세팅 //MOb 에데이터기록 for (i=0; i<msg.dlc;i++) { CANMSG = msg.data[i]; } Can_config_tx(); //MOB Set Tx //CANGIE = (1<<7);//CAN_IT_ENABLE; } while(canstmob==0);// 인터럽터가수행되면 CANSTMOB 값이변경된다. cancdmob_temp=canstmob; CANSTMOB=0; return cancdmob_temp;
void read_rx_message(can_msg_t* msg) { U8 data_index; if(can_rx_index==0) return; // 받은데이터가없으면아무짓도안한다 Can_set_mob(can_rx_index-1); Can_get_std_id(msg->id); msg->dlc=can_get_dlc(); msg->rtr=can_get_rtr(); for(data_index=0;data_index<(msg->dlc);data_index++) msg->data[data_index]=canmsg; } Can_config_rx(); // 수신가능한상태로바꾼다 // 데이타필드를초기화시키지않기때문에이후에들어오는데이터가 // 이전의데이터길이보다짧으면나머지는이전값을유지하므로 // 데이터를사용할때는 dlc 까지만사용해야한다 can_rx_index--;