can 통신 - aquagirl.tistory.comaquagirl.tistory.com/attachment/gk040000000000.pdf · 1....
TRANSCRIPT
CAN 통신
2008년 4월 2일에이스트로닉스㈜
양은숙
목차
CAN통신이란CAN통신 특징CAN통신 규격CAN통신 응용범위AT90CAN128의 특징AT90CAN128의 회로 구조CAN Controller의 구조AT90CAN128의 CAN RegisterSource 예제
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
건설용 중장비 차량 및 열차
산업자동화: 제어기와 센서,
액츄에이터 사이 데이터 통신
서로 다른 지능 모듈들을 연결
의료장비, 건물자동화
AVR 8-bit MicrocontrollerFLASH : 128k bytesEEPROM : 4k bytesSRAM : 4k bytes최대 64k bytes의 외부 메모리 공간JTAG(IEEE 1149.1호환) InterfaceCAN Controller 2.0A & 2.0B 내장15개의MOB를 가짐8 채널, 10bit SAR ADC2.7 ~ 5.0V에서 동작Maximum Frequency : 8MHz(2.7V), 16MHz(4.5V)
5. AT90CAN128 특징
7. CAN Controller 구조
8. CAN Register - CANGCON
ABRQ (Abort Request)1 : 모든 MOb disabled ⇒ 통신 전면 중단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 backTEST (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 Re-synchronization을 위한 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],can_msg.data[2],can_msg.data[3],can_msg.data[4],can_msg.data[5],can_msg.data[6],can_msg.data[7],can_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--;
}