ComputerScience & Embedded/NUCLEO & CAN Tranceiver
CAN frame formats / Bus Arbitration
leecrossun
2025. 3. 1. 20:10
Arbitration field
CAN 메시지 유형 (Frame Types)
- 데이터 프레임(Data Frame): 일반적으로 가장 많이 사용되는 메시지 유형으로, CAN 노드가 다른 노드에 메시지를 전송할 때 사용된다.
- 원격 프레임(Remote Frame): 특정 노드에서 다른 노드에 데이터를 요청할 때 사용된다.
- 에러 프레임(Error Frame): CAN 프로토콜의 신호 규칙 위반이나 오류 발생 시 컨트롤러가 자동으로 전송하는 프레임이다.
- 오버로드 프레임(Overload Frame): 버스가 과부하 상태일 때 컨트롤러가 자동으로 전송하는 프레임이다.
데이터 프레임과 원격 프레임은 애플리케이션에서 자주 사용
에러 프레임과 오버로드 프레임은 컨트롤러가 자동으로 관리
데이터 프레임(Data Frame)
- CAN 노드가 다른 노드로 메시지를 전송할 때 사용하는 기본적인 프레임 형식
- 브로드캐스트 방식으로 메시지를 전달
- 데이터 필드 최대 크기: 8바이트
- 프레임 내부에는 여러 필드가 포함됨 (예: 페이로드, 길이 필드, CRC 필드 등)
데이터 프레임 구조
- Start of Frame (SOF): 프레임의 시작을 알리는 첫 번째 지배(dominant) 비트.
- Arbitration Field: 우선순위를 결정하는 필드로, 11비트 식별자(identifier)와 1비트 RTR(Request Remote) 비트로 구성됨.
- Control Field: 데이터 길이 등을 정의하는 필드.
- Data Field: 최대 8바이트의 데이터를 포함하는 페이로드 필드.
- CRC Field: 오류 검출을 위한 CRC 코드가 포함된 필드 (컨트롤러가 자동 계산).
- ACK Field: 수신 노드가 프레임을 정상적으로 수신했는지 확인하는 필드. 정상적으로 수신되면 지배 상태(dominant)로 설정됨.
- End of Frame (EOF): 프레임 종료를 나타내는 7개의 열성(recessive) 상태 비트.
- Interframe Space: 프레임 간 간격을 유지하는 3개의 열성(recessive) 비트.
Arbitration Field
- Identifier (식별자, 11비트): 메시지의 우선순위를 결정하는 값. 값이 작을수록 우선순위가 높음.
- RTR (Request Remote) 비트: 원격 프레임 요청 여부를 나타내는 비트. 데이터 프레임에서는 항상 지배(dominant) 상태
Standard CAN vs. Extended CAN
Bosch에서 발표한 CAN 2.0은 두 가지 유형이 있음: 2.0A(표준 CAN), 2.0B(확장 CAN)
2.0A(표준 CAN)
- 11비트 식별자 사용
- 2.0A 기반 컨트롤러는 표준 프레임만 송수신 가능
2.0B (확장 CAN)
- 29비트 식별자 사용 (11비트 + 추가 18비트)
- 2.0B 기반 컨트롤러는 표준 및 확장 프레임 모두 송수신 가능
- 기존 2.0A 컨트롤러와 하위 호환 가능
차이점
- 식별자 길이: 표준 CAN(11비트) vs. 확장 CAN(29비트)
- 확장 프레임에는 추가 18비트 식별자 필드 존재
- 표준과 확장 프레임을 구분하는 IDE 비트
- IDE 비트 dominant → 표준 프레임
- IDE 비트 recessive → 확장 프레임
Arbitration 필드
- 11비트 식별자 + 1비트 RTR 비트(총 12비트)
- 여러 노드가 동시에 버스를 사용할 경우 메시지 우선순위를 결정
ACK, RTR, DLC, CRC
- RTR (Remote Transmission Request) 비트
- 데이터 프레임(Data Frame)에서는 항상 dominant(0)
- 원격 프레임(Remote Frame)에서는 recessive(1)
- 원격 프레임(Remote Frame): 특정 노드가 다른 노드에게 데이터를 요청하는 메시지 (데이터 필드 없음)
- 기타 필드 설명
- DLC (Data Length Code): 데이터 필드 크기 지정 (최대 8바이트)
- CRC (Cyclic Redundancy Check): 송수신 데이터 무결성 검사 (15비트 체크섬)
- As soon as CAN receiver starts receiving a frame it also calculates the CRC and then it matches with the CRC sent by the transmitter
- if CRC match is successful then receiving node make bus state as dominant exactly at the ack slot which indicates the transmitter that at least one node received the frame correctly. If transmitter sees recessive state of the bus at ack slot, then it understands that it’s an error and retransmits the message.
- ACK (Acknowledgment) 비트:
- 수신 노드가 정상적으로 데이터를 받았을 경우, dominant(0)로 설정 (ACK)
- 송신 노드는 ACK 비트가 recessive(1)일 경우 재전송 (NAC)
- CAN 버스에 송신 노드만 존재하면, ACK 응답이 없어 계속 재전송됨
- It is worth noting that the presence of an acknowledgement bit on the bus does not mean that any of the intended devices has received the message.
- It just means that one or more nodes on the bus has received it correctly and transmitter concludes that message sent successfully.
- If transmitter sees recessive state at the ACK slot, then it retransmits the message until it sees dominant state. That’s the reason when there is only one node on the bus, transmitter keep sending the same message since no one is there to ack it.
- ACK 필드는 2비트로 구성
- ACK 비트: 정상 수신 여부
- ACK 구분자(ACK delimiter): 항상 recessive(1)
- ACK 비트의 한계
- CAN 네트워크에 하나 이상의 노드만 존재하면 송신자는 ACK 응답을 받을 수 있음
- ACK는 단순히 CAN 메시지가 데이터 링크 계층 규칙을 위반하지 않았음을 확인할 뿐
- 특정 수신 노드가 데이터를 실제로 받았는지, 요청된 작업을 수행했는지는 보장되지 않음
EOF, IFS and SOF
End of Frame (EOF) & Inter Frame Spacing (IFS)
- End of Frame (EOF): 메시지의 끝을 나타내며 7개의 연속된 recessive 비트로 구성됨
- Inter Frame Spacing (IFS): EOF 이후 3개의 recessive 비트로 구성되며, 다음 메시지가 전송되기 전 반드시 포함되어야 함
- 즉, 총 10개의 recessive(1) 비트가 지나야 버스가 Idle 상태가 됨
Idle 상태 & 노드의 전송 조건
- 노드는 버스가 Idle 상태인지 확인한 후에만 데이터 전송 가능
- 버스가 Idle 상태가 되면 노드는 SOF을 전송하며 메시지를 시작
Start of Frame (SOF) 역할
- SOF는 단일 dominant 비트로, 메시지의 시작을 알림
- SOF가 등장하면 모든 노드가 이를 감지하고 CAN Bus 타이밍을 재동기화
- 즉, SOF는 Idle 상태 이후 첫 번째 dominant 비트로 메시지의 시작을 의미함
SOF의 중요성
- 노드들은 긴 recessive(1) 상태를 듣고 버스가 Idle임을 확인
- 첫 번째 dominant 비트를 감지하면 SOF로 인식하고 송·수신을 준비
- CAN 네트워크에서 모든 노드가 동기화되는 기준점 역할
예제: 두 개의 노드 (Node A & Node B)
- Node A가 메시지를 전송하려 할 때, 버스가 Idle 상태인지 확인.
- Idle 상태가 확인되면 SOF(0) 비트를 보내며 프레임 시작
- Node B는 dominant 비트를 감지하고 SOF임을 인식하여 메시지 수신을 준비
- 이를 통해 CAN 네트워크의 모든 노드는 동기화된 상태에서 통신을 진행할 수 있음
⇒ EOF(7비트) → IFS(3비트) → Idle → SOF(1비트) → 메시지 전송 순서로 진행
Remote frame
- Remote frame은 다른 노드에 데이터를 요청하거나 정보를 요청하는 데 사용
- 노드 A가 arbitration field 를 123으로 설정한 Remote frame을 전송 → 노드 B는 arbitration field 가 같은 데이터 프레임으로 응답
- 즉, Remote frame은 요청 및 응답 형태의 통신을 구현하는 데 사용
데이터 프레임과의 구별
- 이 메시지는 경합 필드에 recessive RTR 비트가 설정되어 Remote frame임을 명확히 표시
- 데이터가 없음 (요청 메시지이기 때문)
CAN Bus Arbitration
- CSMA (Carrier-sense Multiple Access): 각 노드는 메시지를 보내기 전에 버스가 비어있는지 확인
- 충돌 감지 및 우선순위 기반 경합 해결: 메시지의 우선순위는 식별자 필드에 미리 설정
- CD+AMP (Collision Detection + Arbitration on Message Priority): 각 메시지는 비트 단위 경합을 통해 우선순위가 높은 메시지가 버스 접근을 우선
- 우선순위: 낮은 식별자 번호일수록 우선순위가 높음
- SOF (Start of Frame) 비트 전송 후, 각 노드는 자신의 식별자 비트를 전송
- Recessive 상태로 시작한 후, dominant 비트를 전송
- NODE-2가 recessive 비트를 보내면, 다른 두 노드 (NODE-1, NODE-3)가 dominant 비트 전송
- 이로 인해 NODE-2는 경합에서 탈락하고, Listen Only Mode로 전환
- NODE-1과 NODE-3이 남아 경합을 계속하며, 결국 NODE-3이 우선순위가 더 높아 경합에서 승리
경합 승리 조건 정리
- Dominant 비트가 Recessive 비트를 항상 우선시
- 식별자 값이 낮은 메시지가 우선순위가 높고, 버스를 장기간 점유
- 이 과정은 자동으로 CAN 컨트롤러에서 처리
반응형