일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- raspberry
- 플라스크
- flask
- 전기차충전기
- thread
- dynamodb
- OCPP
- 에버온
- 홈어시스턴트
- lambda
- 전기차
- AWS
- 충전기
- 디자인패턴
- 서버리스
- IOT Core
- 완속충전기
- everon
- STM32
- 펌웨어
- 보안
- 전기차충전
- YMODEM
- Android
- 안드로이드
- 라즈베리파이
- 급속충전기
- 파이썬
- esp8266
- homeassistant
- Today
- Total
Louie NRT Story
[강의] STM32F4 - CAN 통신 본문
작성일: 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
'전기차충전기' 카테고리의 다른 글
[EVERON] 급속 충전기 보드 다운로드 설정 (0) | 2020.12.16 |
---|---|
[EVERON] 급속 충전기 보드 USART (0) | 2020.12.16 |
[강의] STM32F4 - ADC with DMA (0) | 2020.12.11 |
[펌웨어] STM32F4 강의 - EXTI (0) | 2020.12.10 |
[STM32] STM32F4 강의 - TIM 인터럽트 (0) | 2020.12.07 |