오늘날의 자동차는 단순히 이동 수단이 아니라 여러 가지 기능이 있습니다. 이를 구현하기 위해서 자동차에는 내부 통신 규격이 필요한데요, 이 글에서는 LIN에 대해 정리해 보도록 하겠습니다.
특징
LIN(Local Interconnect Network)은 자동차의 단순한 기능을 위한 통신 규격입니다. 그러니까 고성능을 위한 통신은 CAN, 저성능을 위한 통신은 LIN이라고 보시면 되겠습니다.
- 저비용
- 1 Master – multi Slave (최대 15개의 Slave 연결 가능)
- 주로 조명, 창문 컨트롤, 좌석 조절기 등의 낮은 성능 지원 (CAN은 엔진 제어, 브레이크 시스템 등의 주요 시스템)
- 1-wire의 단순 구조 통신 (CAN은 2-wire)
Application | Specific LIN application examples |
---|---|
Roof | Sensor, light sensor, light control, sun roof |
Steering Wheel | Cruise control, wiper, turning light, climate control, radio |
Seat | Seat position motors, occupant sensors, control panel |
Grille | Grille shutter |
Climate | Small motors, control panel |
Door | Mirror, central ECU, mirror switch, window lift, seat control switch, door lock |
LIN Protocol
LIN 통신은 크게 두 가지 Frame으로 구성되어 있습니다. 먼저 Master에서 Frame header를 통해 통신을 시작하면, Slave에서 Frame response를 통해 응답하는 형식입니다. Frame response는 Master에서도 나올 수 있습니다.
Frame Header의 break field를 제외하고, Frame을 이루고 있는 모든 byte field는 Start bit와 Stop bit를 포함해 10-bit로 이루어져 있습니다. 그리고 LSB first, MSB last입니다.
Frame Header (Master)
Frame Header는 크게 3가지 파트로 구분됩니다.
- Sync break: 통신이 시작됨
Master는 LIN 버스에 sync break를 보냄으로써 통신이 시작됨을 알립니다. Slave 들은 sync break를 받고 통신이 가능하도록 준비해야 하므로 13-bit 이상의 긴 시간 동안 LOW 상태를 유지해야 합니다.
- Sync field: Slave들이 Master에 동기화될 수 있도록 싱크 정보 전달
1-wire 통신이기 때문에 클럭이 따로 없습니다. 그래서 Master – Slave 간의 통신이 가능하려면 당연히 통신속도를 맞춰야 합니다. Master에 연결된 Slave들은 Sync field signal(0x55 고정)의 falling edge를 통해 통신속도를 맞춥니다.
- PID filed: 통신 정보 전달
I2C의 address phase나 SPI의 CS(chip select) signal 같이 특정 slave를 지정하는 신호를 사용하는 것이 아니라 PID를 통해 어느 slave가 통신에 참여하는지 지정됩니다. 이러한 설정은 schedule table을 통해 정해지는데 자세한 이야기는 다음에 다시 하도록 하겠습니다.
PID field는 6-bit의 ID와 2-bit의 parity로 이루어져 있습니다. 즉, 사용할 수 있는 ID는 0x0부터 0x3F입니다. 이 중 0x0~0x3B는 일반적인 통신으로 사용되고, 0x3C는 Master Request Frame, 0x3D는 Slave Response Frame으로 사용됩니다.
Parity 계산 방법은 다음과 같습니다.
Frame Response (Master or Slave)
Frame Response는 크게 2가지로 구분됩니다.
- Data field: 데이터 전달, 1번의 Frame에서 최대 8 byte 전송 가능. PID에 따라 1,2,4,8 byte 전송
- Checksum: 오류 확인
Checksum의 오류확인 방법은 받은 Data들을 모두 더하고 carry를 빼는 방식으로 계산합니다.
Checksum은 두 가지가 있는데 classic checksum과 enhanced checksum이 있습니다. Classic checksum은 Data만으로 계산하고 enhanced checksum은 Data와 PID로 checksum 계산을 합니다.
어떤 checksum을 사용할지는 사용자가 정하는 거지만, PID가 0x3C거나 0x3D일 때는 항상 classic checksum을 사용해야 합니다.
Sleep
LIN 통신에서는 통신이 진행되지 않을 때(일반적으로 4초 이상 버스가 비활성 상태이면), 전력 소모를 줄이기 위해 절전모드인 Sleep 상태에 들어갑니다. 그리고 다시 통신이 시작될 때 wake up 신호를 통해 Sleep 상태를 해제시킬 수 있습니다.
Master는 Slave에 go to sleep 커맨드를 통해 sleep 상태로 전환시킬 수 있습니다(2.1 버전 이상). PID가 0x3C일 때, 첫 번째 데이터가 0이고 나머지 데이터가 0xFF면 slave는 sleep 상태로 전환됩니다.
정리하자면 master가 Sleep을 요청하거나 일정 시간 이상 버스가 idle 상태이면 sleep 모드로 들어갑니다.
Wake up
Sleep 모드에 있는 장치가 통신을 시작하기 위해서는 wake up을 통해 절전모드를 해제해야 합니다. Wake up은 Master뿐만 아니라 Slave도 시작할 수 있습니다. Wake up을 하기 위해서는 LIN 버스에 150us 이상의 시간 동안 신호를 보내줘야 합니다. 그리고 버스에 연결된 장치들은 100ms 안에 통신할 준비가 되어야 합니다.
Slave에서 wake up을 요청할 경우 Master는 100~150ms 안에 통신을 시작해야 합니다. 그 말은 Frame header를 전송해야 한다는 건데요, 만약 slave의 wake up 요청 후 150ms 안에 Master가 Frame header를 보내지 않으면 Slave는 다시 wake up 요청을 합니다.
Master가 계속해서 Frame header를 보내지 않으면 Slave는 무한하게 wake up 요청을 합니다. 이때, 3번씩 나누어 요청하고 3번 요청 이후에는 1.5s 이상의 간격이 있어야 합니다.
위의 상황들은 Slave가 Master에 wakeup 신호를 보내는 상황입니다.
Master가 Slave에 wakeup 신호를 보낼 때는 Frame header의 break 신호를 통해 버스에 연결된 Slave 들을 깨울 수 있습니다.