Louie NRT Story

[강의] STM32F4 - CAN 통신 본문

전기차충전기

[강의] STM32F4 - CAN 통신

hyeok0724.kim@gmail.com 2020. 12. 13. 16:28
반응형

작성일: 21년 1월 10일

 

수정일: 21년 6월 1일

 - STM32 CAN 통신 설정 내용 추가

 

Index

1. CAN 통신 설명

2. CAN 통신 설정

3. 프로그래밍

 

1. CAN 통신 설명

- 캔통신은 여러대의 장치와 두개의 선만으로 통신가능하며 에러처리까지 가능함

- CAN HIGH CAN LOW로 CAN BUS에 연결만 하면 됨

- 차동신호로 하므로 GND가 없으며 외부 노이즈에 강함

- CAN HIGH CAN LOW가 전기적신호가 STM 전기적 신호가 달라서 Transceiver를 설치해여야함

- 비동기식은 클럭없이 통신하는 방식

- 멀티마스터는 마스터는 통신을 관장하는 장치인데 누구나 마스터가 될 수 있음

- UART, I2C, SPI 같은 경우 Baud Rate로써 초당 하나의 Symbol(Start Bit, Data bits, Stop Bit, Parity 등)을 보낼 수 있는 개수를 설정하도록 하지만 CAN은 1Bit 전송 속도를 설정하도록 함.

- CAN은 ID Filter와 통신속도만 정하면 됨

- 통신 설로의 인피던스를 맞추기 위해 종단저항(120옴) 이 들어가야함

- 캔버스가 길이가 짧고 디바이스가 많지 않으면 종단저항 필요 없음

- CAN의 ID는 디바이스의 ID가 아니라 Message의 ID 임을 잘 인지해야함

- CAN 2.0 A는 Standard ID가 11bits 이며 CAN 2.0 B는 Extend ID가 29bits 로 구성되어 있음

- Extend ID가 29 BIt로 구성되어 있음을 확인 할 수 있음

 

 

- 참고로 UART는 두개의 선이 있고 GND가 다르면 GND도 맞춰져야함. 그래서 GND 선을 추가 할수도 있음

- 캔은 차동신호로 통신하기 때문에 GND 필요 없음. 

- 한 메시지의 프레임당 데이터는 최대 8바이트 이며 8바이트가 받아지면 한번 인터럽트가 발생됨

- 타임퀀텀 단위로 통신 설정함. 최대 1Mbps로 가능함

- 메시지의 필터설정을 통해 mask모드와 list 모드로 가능함

 

2. CAN 통신 설정

- 25 / 100Mhz = 500ns 로 설정함

- 퀀타 bit 설정에 속함

- Time Triggered Communication: 보내는 시간이 포함됨
- Automatic Bus-Off Management: 버스에 Error 메시지 계속 보내면 CAN 버스에서 장치 연동 끊어버림
- Automatic Wake-Up Mode: Sleep 모드 사용 할 경우 사용
- No-Automatic Retransmission: 보내는것 실패했을 경우 다시 보낼지 설정

- 데이터가 RX0에 들어오게 되면 인터럽트 발생함.

- Message ID에 따라 RX0에 저장할지 RX1에 저장할지 설정할 수 있음

 

3. 프로그래밍

- can.c 파일에 변수들 선언함.

- can.h 파일에서 다른 파일에서 사용할 수 있도록 extern으로 선언해줌

- TxHeader 정보를 확인함

- IDE가 "CAN_ID_STD"이면 Std_Id 이고 "CAN_ID_EXT"이면 Ext_Id를 사용한다는 뜻임(CAN_ID_STD=0x00, CAN_ID_EXT=0x04)

- RTR이 0이면 Data Frame을 의미하며 1이면 Remote Frame을 의미함

- DLC는 Data Frame의 크기인데 8로 설정하면 됨

- TransmitGlobalTime은 데이터에 시간정보를 적을때 사용함.

 

 

- main.c에서 변수들에 대한 필터 관련해서 설정을 해줌

FilterFIFO0Assignment: 데이터가 수신 되었을때 어디에 저장할것인가 판단
FilterBank: Filter Mask와 Filter ID를 하나의 쌍으로 했을때 여러개의 쌍중 어떤것을 쓸지 판단함
FilterMode: Mask 모드와 List 모드 선택
FIlterScale: 16bit 필터 스케일과 32bit 필터 스케일이 있음
- 16bit 필터 스케일이면 Filter ID High와 Filter Mask Low가 하나의 쌍, Filter ID Low와 Filter Mask Low가 하나의 쌍임
- 32bit 필터 스케일은 Filter ID High가 16bit Filter ID Low가 16bit 담당하며 Filter Mask High와 Filter Mask Low가 16bit 씩 담당함
FilterActivation: 필터를 사용여부를 판단함

- ActivateNotification은 FIFO0에 Pending 된 데이터가 있다면 인터럽트를 발생시켜라 라는 듯임

- main.c에서 데이터 수신했을때에 대한 인터럽트 설정함

 

- HAL_CAN_Start 를 통하여 CAN 통신을 시작함.

- STM 에는 MailBox라는 것이 존재하는데 그곳에 데이터를 채워주면 데이터를 보내줌

- HAL_CAN_GetTxMailboxesFreeLevel 함수를 통하여 비어있는 MailBox를 찾음

- HAL_CAN_AddTxMessge 를 통하여 MailBox에 데이터를 채워넣는 역할을 함.

 

Reference:

www.youtube.com/watch?v=T65WpTyv8Po&feature=youtu.be

m.blog.naver.com/suresofttech/220793847337

 

CAN (Controller Area Network) 통신 소개 및 동작 방법

​안녕하세요.이번에 소개할 내용은 ‘CAN(Controller Area Network) 통신 소개 및 동작 방법’을 주...

blog.naver.com

 

반응형
Comments