'CAN 통신 소스'에 해당되는 글 1건

  1. 2009.06.14 TMS320F2812 CAN Remote Frame 구현 (2)
Studyhard/DSP2009.06.14 20:29
크리에이티브 커먼즈 라이선스
Creative Commons License
CAN 통신은 각각 ID 를 갖고 있어, 손쉽게 통신이 가능한, 그리고 튼튼한(노이즈에 강한) 통신이다. 
자동차 전장 부분에서 쓰이는 통신이므로, 노이즈 부분에서는 믿을 만하다고 할 수 있겠다.

1:1 통신 부터 1:多, 多:多 까지 무리없이 수행할 수 있는 것이 장점이다.

통신 우선 순위는 각각 ID가 수치적으로 낮은 (ex: 000000 >> 000001) 것이 우선권을 갖게 된다.

그러나 대학원 프로젝트를 진행 중, 막상 CAN 통신을 하는 중에 문제점이 발견 되었다.
현재 프로젝트에서 캔 통신의 아이디는

Master : ID 0
Slave   : ID 1, ID 3, ID 5 

위와 같이 각기 구성 되어 있는데, Slave에서 동시다발적으로 Master에게 데이터를 캔통신으로 넘기면, 
Master에서는 ID가 낮은 Slave의 데이터만 받는 현상이 발생되었다. 

그래서, CAN통신을 살펴보니 Remote Frame 이라는 부분이 있었다. 

Remote frame은 Data를 받기를 원하는 Master Node에서 해당 ID의 Slave에 Remote Frame을 보내게 되면, 
해당 ID가 일치하는 Slave에서 Master Node 에게 Data Frame을 보내주는 것이다.

즉, Master에서 원하는 Slave의 데이타를 마음대로 어느 때나 가져올 수 있다는 것이다. 

아래는 Remote Frame으로 TMS320F2812를 이용해 코딩한 소스이다.

 Remoteframe 송신측(Data를 받는 쪽) RemoteFrame  수신측(Data를 보내는 쪽) 
 //Can Module Initialize
 //Mailbox 2 Initialize
 ECanaMboxes.MBOX2.MDH.all = 0x00000000;
 ECanaMboxes.MBOX2.MDL.all = 0x00000000;

 //MSGID Set, IDE=1, Ext Identifier
 ECanaMboxes.MBOX2.MSGID.all = 0x8AAAAA02;

 //Mailbox 2 Enable
 ECanaRegs.CANME.bit.ME2 = 1;

 //RTR bit Set 
 ECanaMboxes.MBOX2.MSGCTRL.bit.RTR = 1;

 //DLC = 8 bit 
 ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;

 //Mailbox 2 Receive Set
 ECanaRegs.CANMD.bit.MD2 = 1;

 //Can Module Initialize
 //MSGID Set, IDE=1, AAM=1, Ext Identifier
 ECanaMboxes.MBOX2.MSGID.all = 0xAAAAAA02;  

 //Mailbox 2 Transmit Set
 ECanaRegs.CANMD.bit.MD2 = 0;

 //Mailbox 2 Enable
 ECanaRegs.CANME.bit.ME2 = 1;

 // DLC = 8bit
 ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;

 //Mailbox 2 Initialize
 ECanaMboxes.MBOX2.MDL.all = 0;
 ECanaMboxes.MBOX2.MDH.all = 0;

 //Clear TA Set
 ECanaRegs.CANTA.bit.TA2 =1;

 //Remote Frame Send
 //Mailbox 2 Reset
 ECanaRegs.CANME.bit.ME2 = 0;
 ECanaMboxes.MBOX2.MSGCTRL.bit.RTR = 1;
 ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
 ECanaRegs.CANME.bit.ME2 = 1;

 //Send Remote Frame
 ECanaShadow.CANTRS.all = 0; 
 ECanaShadow.CANTRS.bit.TRS2 = 1;
 ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;

 //Read MailBox
 rd0.l = ECanaMboxes.MBOX2.MDL.all;
 rd1.l = ECanaMboxes.MBOX2.MDH.all; 

 //Mailbox Data Update
 ECanaMboxes.MBOX2.MDL.all = rd2.l;
 ECanaMboxes.MBOX2.MDH.all = rd3.l;
 


여기서 중요한 것은 RemoteFrame 송신측에서 RTR과 DLC부분을 Reset 시켜 준다는 부분이다. 
저 부분을 뺀다면, RemoteFrame이 한번밖에 송신이 되지 않는 걸 확인 할 수 있었다. 

첫 칸에 있는 CAN Module Initialize 부분은 초기 셋팅 설정하는 부분이고
두번 째 칸에 있는 부분만 함수화 하여, 요청과 응답 부분으로 쓰면 될 것이다.





저작자 표시 비영리 변경 금지
신고
Posted by 리얼한놈

티스토리 툴바