사용 MCU: Nucleo-STM32F103RB
사용 IDE: STM32CubeIDE
차량 내에서 호스트 컴퓨터 없이 마이크로 콘트롤러나 장치들이 서로 통신하기 위해 설계된 통신 규격
1993년에 처음 ISO 11898 국제 표준으로 제정
non-host bus
방식의 message-oriented
프로토콜OBD-II
(차량 진단용 통신 표준의 5대 프로토콜) 中 1높은 신뢰성
고온, 충격, 노이즈 같은 외부 요인에 강함반이중 통신 방식 (Half Duplex)
⇒ 짧은 메시지 교환하는 고속 응용 시스템 적합모든 단말 장치
가 통신 회선을 점유
하고 데이터 송신
을 수행하는 방식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개의 도선을 이용한 전송 방식, 주로 차 신호
에 의해 정보를 전송하는 방식을 일컬음 차 신호
합 신호
개별 신호
ISO 11898:2003 표준에서 Standard 11bit 식별자를 사용하여 125kbps ~ 1Mbps의 통신 속도를 제공합니다.
이 표준은 나중에 Extended 29bit 식별자로 수정되었습니다.
Standard 11bit: 2^11, 2048개의 메세지 식별자
Extended 29bit: 2^29, 536,870,912개의 메세지 식별자
Standard CAN: 11-bit 식별자 Bit Fields
SOF | 11-bit | Identifier | RTR | IDE | r0 | DLC | 0~8 bytes Data | CRC | ACK | EOF | IFS |
---|---|---|---|---|---|---|---|---|---|---|---|
프레임의 시작 비트 | 메세지의 우선순위를 설정하는 11bit 식별자, 값이 낮을수록 우선 순위가 높다 | 다른 노드로부터 정보가 필요할 때 정의 | 다른 노드로부터 정보가 필요할 때 정의. (Data Frame: 0, Remote Frame:1) | CAN 식별자 타입 정의 (Standard: 0, Extended: 1) | Reserved bit | 송신하는 데이터의 byte 수로 4bit | 송신 데이터로 최대 8byte | 16bit checksum (15bit + 1bit 구분기호), 오류 감지를 위한 비트 | 프레임 끝 | interframe space: 7bit |
Extended CAN: 29-bit 식별자 Bit Fields
SOF 11-bit
Identifier SRR IDE 18-bit
Identifier RTR r1 r0 DLC 0~8 bytes Data CRC ACK EOF IFS
SRR(substitute remote request): Extension format의 자리를 표시
IDE(identifier extension): 더 많은 식별자 비트가 뒤따른다는 것을 나타냄
r1: Reserved bit
CAN 통신을 하기 위해서는 MCU에 CAN 핀이 있더라도 별도의 Transceiver를 달아주어야 합니다.
그 이유는 CAN 통신은 CANH와 CANL 라인으로 차동 신호로 통신을 하는데
MCU의 신호를 차동신호로, 차동 신호를 MCU가 받아들일 수 있는 디지털 신호로 변환시켜주는 역할을 하기 때문입니다. 또 정전기(ESD)같은 왜란에 의해 Transceiver가 데미지를 입어 MCU가 손상되는 것을 막아주는 역할이 될 수 있습니다.
SN65HVD230 : STM용 CAN모듈로, 120옴 임피던스 저항이 추가된 모듈이며 최대 1Mbps까지 사용 가능
또 CANH와 CANL 양 종단에 120옴 정도의 저항을 달아주어야 합니다(거리가 가까우면 달아주지 않아도 괜찮다고 하기도 하는것 같습니다.) 120옴을 달아주어야 하는 이유는 신호 왜곡을 보호하기 위한 임피던스 매칭을 위해 ISO 11898 표준으로 정의했기 때문입니다.
STM32의 CAN제어 핀은 USB D+, D-핀과 공용으로 쓰기 때문에 USB를 사용한다면 다른핀으로 맵핑해야 된다.
다행이 remap기능이 있어 (PA11, PA12), (PB8, BP9), (PD0, PD1)에 할당이 가능하다.
PB8 : CAN_RX
PB9 : CAN_TX
> 예제코드
AFIO->MAPR &= 0xFFFF9FFF; // reset CAN remap
AFIO->MAPR |= 0x00004000; // set CAN remap, use PB8, PB9
HCLK 클럭을 64로 설정했을 때, APB1의 클럭 = 32MHz
HCLK
- STM32 마이크로컨트롤러의 시스템 클럭
- 다른 클럭 신호들의 기본 클럭 속도를 결정
- 시스템 성능과 전력 소비에 매우 중요한 역할
APB1
- STM32 마이크로컨트롤러의 주변기기 버스에서 사용되는 클럭
- 다양한 주변장치들과 통신할 때 사용
- STM32 마이크로컨트롤러는 보통 2개의 주변기기 버스를 가지며, APB1 클럭은 그 중 하나
- 주로 낮은 속도의 주변기기들을 위해 사용 ex) UART, SPI, I2C, CAN
Can을 활성화 하고 각 파라미터에 대해 알아보겠습니다.
Time Quanta in Bit Segment는 CAN(Controller Area Network) 프로토콜에서 사용되는 개념 중 하나입니다.
Prescaler
통신의 속도를 설정, (1/APB1 Prescaler = Time Quantum, 1/42M 16 = 380ns)
Bit Time
전체 비트 전송 시간을 의미, Tbit로 표기
Time Quanta
여러 구간(segment)로 나누어지는 Bit time의 길이
Synchronization Segment(Sync_Seg)
1 Time Quantum 길이, 다양한 버스 노드를 동기화에 사용
Propagation Time Segment(Prop_Seg)
CAN 네트워크 내에서 물리적 지연 시간을 보상에 사용
Phase Buffer Segment 1(Phase_Seg1)
에지 위상 오류를 보상하는 데 사용
Phase Buffer Segment 2(Phase_Seg2)
에지 위상 오류를 보상하는 데 사용
Bit Time은
Sync Segment
,Propagation Segment
,Phase Segment 1
,Phase Segment 2
,SJW(Synchronization Jump Width)
구간으로 나뉘어진다.
Time Quanta in Bit Segment의 길이는 Bit Time에서의 데이터 전송 구간에 대한 시간을 결정
Time Quanta in Bit Segment는 CAN 프로토콜의 송수신 속도를 결정하는 중요한 요소 중 하나이며, 이 값은 CAN 컨트롤러의 설정 값에 따라 결정된다.
CAN Bit Time Calculation (can-wiki.info)
사용MCU = ST Microelectronics bxCAN
Rate = APB1의 32 입력
Sample-Point 입력: 50~90%, (CANopen와 DeviceNet에서는 일반적으로 87.5%, ARINC 825에서는 75% 사용)
SJW = 1
Baud Rate : IDE상에서 Time Quanta in Bit Segment 값을 적당히 조절하며 적당한 값이 나오는 것으로 채택했다.
NVIC에서 CAN interrupt 체크
참조
https://nexp.tistory.com/578
https://jeonhj.tistory.com/47