non-host bus
방식의 message-oriented
프로토콜OBD-II
(차량 진단용 통신 표준의 5대 프로토콜) 中 1높은 신뢰성
고온, 충격, 노이즈 같은 외부 요인에 강함반이중 통신 방식 (Half Duplex)
⇒ 짧은 메시지 교환하는 고속 응용 시스템 적합연도 | 내용 |
---|---|
1983 | Bosch 사 개발 착수 |
1986 | SAE(Society of Automotive Engineers) 에서 공식적 발표 |
1987 | Bosch 사 출시 |
1991 | Bosch 사 CAN 2.0 발표 |
1992 | Mercedes-Benz 사 최초 CAN 적용 차량 생산 |
2011 | CAN FD 프로토콜 개발 착수 |
2015 | ISO 11898-1 (Classical CAN and CAN FD) 발표 |
모든 단말 장치
가 통신 회선을 점유
하고 데이터 송신
을 수행하는 방식Broadcast
message oriented protocol | stream oriented protocol | |
---|---|---|
예시 | UDP | TCP |
속도 | 전송 속도 빠름 | 전송 속도 느림 |
응용 | 데이터 손실보다 속도 중요 → 오디오, 비디오 전송에 적합 | 속도보다 데이터 손실이 중요 → 이메일 시스템에 적합 |
송신 형태 | message라고 불리는 연속되지 않은 패킷의 형태로 송신됨 | 데이터가 특정 구조 없이 송신됨 |
연결 | 데이터가 셋팅 없이 전송 connectionless | 연결지향적 connection oriented |
신뢰성 | 신뢰 불가능한 전송 | 신뢰 가능한 전송 |
재전송 | 재전송 X | 손실 데이터 자동적으로 재전송 |
overhead | LOW overhead | HIGH overhead |
OBD (On-Board Diagnostics)
차의 상태를 진단하고 결과를 알려주는 장치, 발전하여 OBD-II
라는 표준 진단 시스템으로 진화우성(dominant) 비트
: 논리 비트 값 0
, 전기 신호 값 LOW
열성(recessive) 비트
: 논리 비트 값 1
, 전기 신호 값 HIGH
실시간 우선순위 기반
우성 비트
가 경쟁에서 우위낮은 CAN ID
(우성 비트가 많은)를 가진 프레임이 지연 없이 먼저 전송
높은 CAN ID
를 갖는 프레임은 우성 메시지의 전송 후 6비트 전송 시간을 추가로 기다린 후 자동 재전송11비트 ID
를 갖는 CAN 네트워크)1
(열성 비트) 전송하고, 노드 15는 0
(우성 비트) 전송 ⇒ “충돌”(경쟁에서 이긴 노드)
는 다음 비트 계속 전송(경쟁에서 진 노드)
은 1 전송했으나, 0을 네트워크에서 읽어서 충돌 감지
⇒ 나머지 메시지 전송 X40m
이하 반경에서 1Mbps
까지 전송500m
이하 반경에서 125kbps
까지 전송CANH
과 CAHL
신호는 차동 방식
논리 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)
두 신호의 차이로써 나타나는 신호 형태차동 모드 신호 전송 방식 (Differential signaling)
서로 반대되는 극성을 갖는 2개의 도선을 이용한 전송 방식, 주로 차 신호
에 의해 정보를 전송하는 방식을 일컬음 차 신호
합 신호
개별 신호
// 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);
}
http://koreascience.or.kr/article/CFKO201014258944475.pdf
Differentiate between Message oriented & Stream oriented communications.