|
보 고 일 자 |
2015.05.26(화) |
책임자 |
김 영 준 |
확 인 |
|
CAN 통신
<기술문서>
SunmoonBit 29기
김영준
목차
1) CAN 통신이란?
2) CAN 물리 계층
3) CAN 통신 방법
4) 핵심 예제 소스
1) CAN 통신이란?
l CAN (Controller Area Network)은 1985년 Bosch사에서 차량 네트워크용으로 최초로 개발되었습니다.
l CAN은 여러 개의 CAN 디바이스가 서로 통신할 수 있는 경제적이며 안정적인 네트워크를 제공한다.
l ECU가 시스템 내 각 디바이스마다 아날로그 및 디지털 입력을 갖는 것이 아니라 단일의 CAN 인터페이스만 보유한다.
l 우선 순위가 있으므로 두 개의 노드가 동시에 메시지를 전송할 경우, 우선순위가 높은 메시지가 먼저 전송되고 낮은 우선 순위의 메시지는 전송이 연기된다.
l CAN은 차량용으로 개발되었으므로 가장 보편적인 어플리케이션은 in-vehicle 전자 네트워킹 이다.
l CAN은 항공기 상태센서, 네비게이션 시스템, 조종실 내 리서치 PC 등 항공기 어플리케이션에도 적용될 뿐만 아니라 데이터 분석에서부터 엔진 컨트롤 시스템에 이르는 다양한 우주 항공 어플리케이션에서도 CAN 버스가 사용됩니다.
2) CAN 물리 계층
l High-Speed CAN
- 현재까지 가장 보편적으로 사용되는 계층이다. 고속 CAN 네트워크는 두 개의 와이어로 실행되며 최대 1Mb/s 전송속도로 통신을 진행합니다. 고속 CAN의 다른 명칭으로는 CAN C와 iso 11898-2가 이다. 일반적인 고속 CAN 디바이스에는 ABS, 엔진 컨트롤 모듈 그리고 방출 시스템 등이 있다.
l 저속/내고장 CAN 하드위어
- 저속/내고장 CAN 네트워크 또한 두 개의 와이어로 실행되며, 최대 125kb/s 속도로 디바이스와 통신하며, 내고장 기능이 있는 트랜시버를 제공합니다. 저속/내고장 CAN 디바이스는 CAN 디바이스는 CAN B 및 ISO 11898-3으로도 알려져 있습니다. 자동차에서의 일반적인 저속/내고장 기기에는 안락장치가 있습니다. 차량의 문을 열고 닫을 때의 강도를 고려하여 차량의 문을 통과해ㅑㅇ 하는 와이어는 저속/내고장 이다.
l 단일 와이어 CAN 하드웨어
- 단일 와이어 CAN 인터페이스는 최고 33.3 kb/s (고속 모드에서는 88.3 kb/s) 속도로 디바이스와 통신합니다. 단일 와이어 CAN의 다른 명칭은 SAE-J2411, CAN A 및 GMLAN입니다. 차량 내 일반적인 단일 와이어 디바이스는 고성능을 요구하지 않습니다. 일반적인 어플리케이션에는 좌석과 거울 조정기 등의 안락 장치가 있습니다.
l 소프트웨어 선택가능한 CAN 하드웨어
- 내쇼날인스트루먼트의 CAN 하드웨어 제품을 이용하면 소프트웨어 선택가능한 CAN 인터페이스를 구성할 수 있으므로 모든 온보드 트랜시버 (고속, 저속/내고장 또는 단일 와이어 CAN)를 사용할 수 있습니다. 다중 트랜시버 하드웨어는 통신 표준의 통합이 요구되는 어플리케이션에 있어 최상의 솔루션을 제공합니다. 소프트웨어 선택가능한 CAN 하드웨어를 사용하면, 사용자 고유의 외부 CAN 트랜시버를 선택할 수 있습니다.
3) 통신 방법
CAN은 피어 투 피어 (peer-to-peer) 네트워크입니다. 다시 말하면, 개별 노드가 CAN 버스에서 데이터를 읽거나 쓰기 위해 액세스할
때 컨트롤하는 마스터가 없습니다. CAN 노드가 데이터 전송 준비 완료되면, 버스의 준비 여부를 확인하고 그 후 CAN 프레임을 네트워크에 작성합니다. 전송되는 CAN 프레임은 전송 노드나 수신 노드 중 어느 쪽의 주소도
포함하고 있지 않습니다. 대신, 고유한 중재 ID가 네트워크에서 프레임을 분류합니다. CAN 네트워크 상의 모든
노드는 CAN 프레임을 수신하며, 전송되는 프레임의 중재 ID에 따라 네트워크 상의 각 CAN 노드는 프레임 수용 여부를 결정합니다.
다중 노드가 동시에 메시지를 CAN 버스로 전송하려는 경우 최우선 순위를 가진 노드 (가장 낮은
중재 ID)가 자동적으로 버스에 액세스됩니다. 최저 우선
순위를 가진 노드는 버스가 사용 가능할 때까지 반드시 대기해야 합니다. 이러한 방식으로 CAN 네트워크를 실행하면 CAN 노드 사이에 결정성있는 통신을 구현할
수 있습니다.
<출처 : 위키백과(CAN)>
4) 핵심 예제 소소
unsigned char stmp[135][8] = {
{0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00},
{0x02, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00}
};
INT32U canId = 0x000;
void loop()
{
for(int i = 0; i<135 ; i++)
{
CAN.sendMsgBuf(0x7DF, 0, 8, stmp[i]); //0x7DF & 0x7E0
if(CAN_MSGAVAIL == CAN.checkReceive())
{
CAN.readMsgBuf(&len, buf);
for(int i = 0; i<len; i++)
{
Serial.print(buf[i]);Serial.print("\t");
}
Serial.println();
canId = CAN.getCanId();
if(canId<16)
{
BTSerial.print('0');
}
if(canId == 0x7E8 && 0x7E9){
BTSerial.print(canId, HEX); BTSerial.print('>');
Serial.print(canId, HEX); Serial.print('>');
for(int i = 0; i<len; i++)
{
if (buf[i]<16)
{
BTSerial.print('0');
Serial.print('0');
}
BTSerial.print(buf[i],HEX);
Serial.print(buf[i],HEX);
if (i<len-1)
{
BTSerial.print(":");
Serial.print(":");
}
}