[네트워크 및 통신] CAN

모옹·2023년 12월 4일
0

네트워크 및 통신

목록 보기
1/2

CAN 통신 (Controller Area Network)

  • 차량 내에서 호스트 컴퓨터 없이 마이크로 컨트롤러나 장치들이 서로 통신하기 위해 설계된 표준 통신 규격
  • non-host bus 방식의 message-oriented 프로토콜
  • OBD-II (차량 진단용 통신 표준의 5대 프로토콜) 中 1
  • 높은 신뢰성 고온, 충격, 노이즈 같은 외부 요인에 강함
  • 반이중 통신 방식 (Half Duplex) ⇒ 짧은 메시지 교환하는 고속 응용 시스템 적합
연도내용
1983Bosch 사 개발 착수
1986SAE(Society of Automotive Engineers) 에서 공식적 발표
1987Bosch 사 출시
1991Bosch 사 CAN 2.0 발표
1992Mercedes-Benz 사 최초 CAN 적용 차량 생산
2011CAN FD 프로토콜 개발 착수
2015ISO 11898-1 (Classical CAN and CAN FD) 발표

non-host bus 방식

  • 통신 회선을 Master 장치가 관장하여 전반적인 통신을 제어하는 것이 아닌 회선망에 연결된 모든 단말 장치가 통신 회선을 점유하고 데이터 송신을 수행하는 방식
  • 통신 회선에 실려진 데이터는 회선망에 연결된 모든 단말 장치에 Broadcast

message-oriented 프로토콜

message oriented protocolstream oriented protocol
예시UDPTCP
속도전송 속도 빠름전송 속도 느림
응용데이터 손실보다 속도 중요 → 오디오, 비디오 전송에 적합속도보다 데이터 손실이 중요 → 이메일 시스템에 적합
송신 형태message라고 불리는 연속되지 않은 패킷의 형태로 송신됨데이터가 특정 구조 없이 송신됨
연결데이터가 셋팅 없이 전송 connectionless연결지향적 connection oriented
신뢰성신뢰 불가능한 전송신뢰 가능한 전송
재전송재전송 X손실 데이터 자동적으로 재전송
overheadLOW overheadHIGH overhead

OBD-II (On-Board Diagnostics II)

  • OBD (On-Board Diagnostics) 차의 상태를 진단하고 결과를 알려주는 장치, 발전하여 OBD-II라는 표준 진단 시스템으로 진화
  • 차량의 배출가스 진단과 고장 정보를 하나의 기기로 모든 차량에서 검색할 수 있고, 안전 및 샤시의 고장 정보 확인과 검색이 가능하여 자동차의 소유자와 수리 기술자가 고장을 더 빨리 파악하고 접근하게 함

데이터 전송

1. 우성(dominant) 비트와 열성(recessive) 비트

  • 우성(dominant) 비트 : 논리 비트 값 0 , 전기 신호 값 LOW
  • 열성(recessive) 비트 : 논리 비트 값 1 , 전기 신호 값 HIGH

2. 프레임 충돌 관리

  • 실시간 우선순위 기반
  • 우성 비트가 경쟁에서 우위
  • 낮은 CAN ID(우성 비트가 많은)를 가진 프레임이 지연 없이 먼저 전송
  • 높은 CAN ID를 갖는 프레임은 우성 메시지의 전송 후 6비트 전송 시간을 추가로 기다린 후 자동 재전송
  • 예시 (프레임이 11비트 ID를 갖는 CAN 네트워크)

프레임 충돌 예시

  1. 노드 ID 15(00000001111)와 16(00000010000)이 동작, 두 노드가 동시에 메시지 전송 상황
  2. 시작 비트(Start bit) 전송 후, 10번 비트부터 5번 비트까지 충돌 없이 전송 (bit 같아서)
  3. 4번 비트 전송 시, 노드 16은 1 (열성 비트) 전송하고, 노드 15는 0 (우성 비트) 전송 ⇒ “충돌”
  4. 노드 15 (경쟁에서 이긴 노드)는 다음 비트 계속 전송
  5. 노드 16 (경쟁에서 진 노드)은 1 전송했으나, 0을 네트워크에서 읽어서 충돌 감지 ⇒ 나머지 메시지 전송 X

3. 전송 속도

  • 40m 이하 반경에서 1Mbps까지 전송
  • 500m 이하 반경에서 125kbps까지 전송
  • CAN FD 표준 - 노드 ID 전송 후의 데이터 부분을 노드 ID 전송 속도의 10배 가량 전송 가능

프레임 구조

베이스 프레임 형식

베이스 프레임

  • CANHCAHL 신호는 차동 방식
  • 논리 0 : CANL 0V / 논리 1 : CANL 2.5V
  • dominant, 우성 상태 (CANH - CANL ≥ 0.9V) ⇒ CANL 0V 논리 0
  • recessive, 열성 상태 (CANH - CANL < 0.5V) ⇒ CANL 중간 전압 (VCC/2) 논리 1

차동 방식 (differential-mode signal)

  • 차동 모드 (Differential Mode) 두 신호의 차이로써 나타나는 신호 형태
  • 차동 모드 신호 전송 방식 (Differential signaling) 서로 반대되는 극성을 갖는 2개의 도선을 이용한 전송 방식, 주로 차 신호에 의해 정보를 전송하는 방식을 일컬음 차동 방식.PNG
  • 차 신호 Vdiff=VA(t)VB(t)V_{diff} = V_A(t) - V_B(t)
  • 합 신호 Vcomm=VA(t)+VB(t)2V_{comm} = \frac{V_A(t) + V_B(t)}{2}
  • 개별 신호
    • VA=Vcomm(t)+12Vdiff(t)V_A = V_{comm}(t) + \frac{1}{2}V_{diff}(t)
    • VB=Vcomm(t)12Vdiff(t)V_B = V_{comm}(t) - \frac{1}{2}V_{diff}(t)
  • 특징
    • 전기적 잡음/왜곡 영향 감소
    • 최대 전압 스윙 증가
    • 간단한 바이어스 구성 및 높은 선형성
    • 대략 2배의 소자 필요, 공급 DC 전력 증가

코드 예시

// CAN Protocol in STM32
// 송신

// Header와 data 변수 선언
CAN_TxHeaderTypeDef   TxHeader; // header
uint8_t               TxData[8]; // 전송된 data
uint32_t              TxMailbox; // mailbox

// header 설정
TxHeader.IDE = CAN_ID_STD; // STD : standard ID
TxHeader.StdId = 0x446; // identifier, 최대 11 bit 크기
TxHeader.RTR = CAN_RTR_DATA; // 데이터 frame 전송
TxHeader.DLC = 2; // 2 bytes 길이의 데이터 전송

// data 설정
// 2 bytes 지정
TxData[0] = 50;  
TxData[1] = 0xAA;

// transmit
if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK)
{
   Error_Handler ();
}

// 송신된 message를 받아야 하는지 아닌지 filter를 통하여 구분
// filter configuration
CAN_FilterTypeDef canfilterconfig;

canfilterconfig.FilterActivation = CAN_FILTER_ENABLE; // filter 사용할건지 아닌지
canfilterconfig.FilterBank = 18;  // which filter bank to use from the assigned ones
canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; // FIFO 0과 FIFO 1 결정
canfilterconfig.FilterIdHigh = 0x446<<5;
canfilterconfig.FilterIdLow = 0;
canfilterconfig.FilterMaskIdHigh = 0x446<<5;
canfilterconfig.FilterMaskIdLow = 0x0000;
canfilterconfig.FilterMode = CAN_FILTERMODE_IDMASK; // MASK_MODE/LIST_MODE 중 결정
canfilterconfig.FilterScale = CAN_FILTERSCALE_32BIT; // 32bit/16bit filter register 결정
canfilterconfig.SlaveStartFilterBank = 20;  // how many filters to assign to the CAN1 (master can)

HAL_CAN_ConfigFilter(&hcan1, &canfilterconfig);
// CAN Protocol in STM32
// 수신

if (HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)
{
  Error_Handler();
}

// Header와 data 변수 선언
CAN_RxHeaderTypeDef   RxHeader; // header
uint8_t               RxData[8]; // data

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) // 수신 기다림
{
  if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)
  {
    Error_Handler();
  }

  if ((RxHeader.StdId == 0x103))
  {
	  datacheck = 1;
  }
}

// 수신된 데이터 확인
if (datacheck)
{
 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}

참조

CAN 버스

차동 모드

실무 회로설계에서 CAN 통신 회로 설계법

http://koreascience.or.kr/article/CFKO201014258944475.pdf

Differentiate between Message oriented & Stream oriented communications.

온보드 진단기

How to use CAN Protocol in STM32 » ControllersTech

고속 응용 프로그램 개발

0개의 댓글

관련 채용 정보