๋ณธ ํ๋ก์ ํธ์์๋ STM32์ ๋ด์ฅ๋์ด์๋ bxCAN์ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ STM32F103VET6 MCU ๊ฐ CAN ํต์ ์ ์ฃผ๊ณ ๋ฐ๋ ์ก์์ ํ ์คํธ๋ฅผ ์งํํ์์ผ๋ฉฐ ์ด๋ฅผ PC ํฐ๋ฏธ๋ ์ฐฝ์ ๋์ด์ ํ์ธํด๋ณด๋ ๊ณผ์ ์ ๋ํ๋ ๋๋ค.
์ฐธ๊ณ ๋ก STM32 Connectivity Line์ ์ ์ธํ F1 ์๋ฆฌ์ฆ STM32๋ค์ ๋ฐ์ดํฐ ์ก์์ ์ ์ฌ์ฉ๋๋ 512byte RAM์ USB์ CAN์ด ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ USB์ CAN์ ๋์์ ์ฌ์ฉํ์ง ๋ชปํฉ๋๋ค.
๋ฐ๋ผ์ CAN๊ณผ USB๋ฅผ ๋์์ ์ฌ์ฉํด์ผ ํ๋ค๋ฉด STM32F105/7์ด๋ F2 ์๋ฆฌ์ฆ ๋ฑ ๋ค๋ฅธ ์๋ฆฌ์ฆ์ STM32๋ฅผ ์ฌ์ฉํ์๊ธธ ๋ฐ๋๋๋ค.
ํด๋น ํ๋ก์ ํธ๋ CAN ํต์ ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ดํด์ CAN ํต์ ์ ์ํ ๊ธฐ๋ณธ์ ์ธ ์ค์ ๋ฒ์ ๋ํ ํ์ต์ด ํ์ํฉ๋๋ค.
์๋ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ํ์ตํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
CAN/CAN-FD ํต์ ์ ์์ธํ ์ด๋ก ์ ์๊ฐ์ 8bit AVR MCU์์์ CAN ํต์ ์ ์ํ ๋ ์ง์คํฐ ์ค์ ๋ฒ์ ๋ค๋ค์ค๋๋ค. [์ด๋ก ๋ถ๋ถ ๋งค์ฐ ์ถ์ฒ]
- Microchip Technology - Korean YouTube
CAN ํต์ ์ ์ด๋ก ์ ์๊ฐ์ 32bit STM32F4 MCU์์์ CAN ํต์ ์ ์ํ ์ค์ ๋ฒ์ ๋ค๋ค์ค๋๋ค.
- Wonyeob Chris Park YouTube
- [HAL, CubeMX, TrueSTUDIO๋ฅผ ์ด์ฉํ STM32F4 ์์ฑ ๊ฐ์ ๊ฐ์ข] 13-1๊ฐ. CAN ํต์ ๊ฐ๋
- [HAL, CubeMX, TrueSTUDIO๋ฅผ ์ด์ฉํ STM32F4 ์์ฑ ๊ฐ์ ๊ฐ์ข] 13-2๊ฐ. CAN ์ค์ ๋ฐ ์ก์ ์ฝ๋ ์์ฑ
- [HAL, CubeMX, TrueSTUDIO๋ฅผ ์ด์ฉํ STM32F4 ์์ฑ ๊ฐ์ ๊ฐ์ข] 13-3๊ฐ. CAN ํํฐ MASK ID ์ค์ ๋ฐ ์์ ์ฝ๋ ์์ฑ (์)
CAN ํต์ ์ ์ด๋ก ์ ์๊ฐ์ 2bit STM32F0 MCU์์์ CAN ํต์ ์ ์ํ ๋ ์ง์คํฐ ์ค์ ๋ฒ์ ๋ค๋ค์ค๋๋ค.
- Joon-Lab ๊ธฐ์ ๋ธ๋ก๊ทธ
- STM32CubeIDE 1.6.0
- STM32CubeMX
- Tera Term
- STM32F103VET6 Custom Development Board
-
- ์ ๊ณต๋๋ ๊ฐ๋ฐ๋ณด๋ ํ๋ก๋๋ฅผ ํ์ธํด ๋ณธ ๊ฒฐ๊ณผ, ํ๋ก๋์ ํ๊ธฐ๋์ด์๋ ์ปค๋ฅํฐ ๋ฐ ํ ํค๋๋ช
์ด ์ค์ ๋ณด๋์ ์ปค๋ฅํฐ ๋ฐ ํ ํค๋๋ช
๊ณผ ์๋ก ๋ค๋ฅธ ๊ฒ์ ํ์ธํ์์ต๋๋ค. ์ด๋ฅผ ์ฃผ์ํ์๊ณ ํ๋ก๋๋ฅผ ๋ณด์๊ธธ ๋ฐ๋๋๋ค.
- ์ ๊ณต๋๋ ๊ฐ๋ฐ๋ณด๋ ํ๋ก๋๋ฅผ ํ์ธํด ๋ณธ ๊ฒฐ๊ณผ, ํ๋ก๋์ ํ๊ธฐ๋์ด์๋ ์ปค๋ฅํฐ ๋ฐ ํ ํค๋๋ช
์ด ์ค์ ๋ณด๋์ ์ปค๋ฅํฐ ๋ฐ ํ ํค๋๋ช
๊ณผ ์๋ก ๋ค๋ฅธ ๊ฒ์ ํ์ธํ์์ต๋๋ค. ์ด๋ฅผ ์ฃผ์ํ์๊ณ ํ๋ก๋๋ฅผ ๋ณด์๊ธธ ๋ฐ๋๋๋ค.
- SN65HVD230 CAN Board
-
๐ ํด๋น ํธ๋์๋ฒ ๋ชจ๋ ๋ฐ์ดํฐ์ํธ ๋ฐ ํ๋ก๋
- ์ฌ์ฉํ CAN ํธ๋์๋ฒ ๋ชจ๋์๋ ์ข ๋จ์ ํญ 120ฮฉ์ด ์ค์ฅ๋์ด ์์ผ๋ฏ๋ก ๋ฐ๋ก ์ข ๋จ์ ํญ์ ๊ตฌ์ฑํ์ฌ ํ๋ก๋ฅผ ์ค๊ณํ์ง ์์๋ ๋ฉ๋๋ค.
- CAN ํต์ ์ Baud Rate๋ฅผ ์ค์ ํ ๋๋ 1 bit๋ฅผ ์ ์กํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ค์ ํด์ผํจ.
- Baud Rate = 500kbps ์ผ๋ก ์ค์ ํ๊ธฐ ์ํ ๊ณผ์ .
- Baud Rate๋ ์ด๋น 500k bit์ด๋ฏ๋ก 1bit ๋น 2us๊ฐ ์์.
- STM32F103VET6์ CAN์ APB1 ํ๋ฆฌํ๋ด ํด๋ญ ๋ฒ์ค์ ๋ฌ๋ ค์์.
- APB1์ด 36MHz ์ผ ๋, ์ด์ ๋ฐ๋ผ Prescaler๋ฅผ 9 ๋ก ์ค์ ํจ. ์ฆ, 9/36MHz = 0.25us.
- 0.25us ๋จ์๊ฐ 1๊ฐ์ ํ์ํํ (TQ : Time Quantum (plural: Quanta)) ์๊ฐ ๋จ์๊ฐ ๋จ.
- 1 Bit Time์ 8๊ฐ์ TQ๋ฅผ ๋ฐฐ์นํ๋ฉด 0.25us x 8 = 2us๊ฐ ๋จ.
- ์ฆ, 1 Bit Time์ 8๊ฐ์ TQ๋ฅผ ๋ฐฐ์นํ๋๋ก ์ค์ ํจ.
- ์ฌ๊ธฐ๊น์ง ํต์ ์๋ 500kbps๊ฐ ๊ฒฐ์ ๋จ.
- 8๊ฐ์ TQ๋ฅผ SYNC_SEG, BIT SEGMENT 1 (BS1), BIT SEGMENT 2 (BS2) ์ ๊ฐ๊ฐ ๋๋ ์ ๋ฐฐ์ .
- SYNC_SEG๋ 1TQ๋ก ๊ณ ์ .
- ๋๋จธ์ง 7๊ฐ์ TQ๋ฅผ BS1๊ณผ BS2์ ๊ฐ๊ฐ ๋ฐฐ์ ํด์ผํจ.
- ๋จผ์ SAMPLE POINT๋ฅผ 75%๋ก ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ , SAMPLE POINT๋ ๋ค์๊ณผ ๊ฐ์ ๊ณต์์ผ๋ก ์ ํด์ง.
- Sample Point = (SYNC_SEG + BS1) / Total TQ
- ๋ฐ๋ผ์ ์์ ๊ณต์์ ์ด์ฉํ๋ฉด 75/100 = (1 + BS1) / 8 ์ด๋ฏ๋ก ์ด๋ฅผ BS1์ ๋ํ์ฌ ํ๋ฉด BS1=5, ์ ์ ๋ก BS2=2
- ๊ทธ๋ฌ๋ฏ๋ก SYNC_SEG = 1, BS1 = 5, BS = 2์ TQ๋ฅผ ๋ฐฐ์ ๋ฐ๊ฒ ๋จ.
- ์ด์ ํจ๊ป SJW (Re-Synchroniztion Jump Width) ๋ 1๋ก ์ค์
- ์ฌ๊ธฐ๊น์ง TQ ๋ฐฐ์น์ ๋ฐ๋ฅธ Sample Point๊ฐ ๊ฒฐ์ ๋๊ณ 1 Bit Time์ด ์์ฑ๋จ.
- STM32F103VET6์ bxCAN (Basic Extended CAN) ์ CAN์ 2.0A์ B ๋ ๋ค ์ง์ํจ.
- ์ฆ, CAN 2.0B ๋ฒ์ ์ด๋ฏ๋ก ํ์ํธํ ๋๋ฌธ์ 2.0A๋ ์ง์์ด ๊ฐ๋ฅ.
- ๋ณธ ํ๋ก์ ํธ์์๋ 11 bit Standard ID, 16 bit Filter Scale, Filter ID Mask ๋ชจ๋๋ฅผ ์ฌ์ฉํจ.
- ๋ณธ ํ๋ก์ ํธ์์์ ๋ชจ๋ ๋๋ฐ์ด์ค๋ ๋ง์คํฐ ๋ชจ๋๋ก ์๋ํจ.
- Filter๋ฅผ ๊ฑฐ์ณ ์์ ๋ ๋ฉ์ธ์ง๋ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํด FIFO0์ ์ฌ์ฉํจ.
- CAN ํต์ ์ ์ํ Filter ์ ๋ณด๋ค์ Bank 0๋ฒ์ ์ ์ฅ๋๋ฉฐ ํ๋์ Bank๋ง ์ฌ์ฉํจ.
- CAN ํต์ ์ ์์ ๋ถ๋ถ์ ํด๋ง๋ฐฉ์์ด ์๋ ์ธํฐ๋ฝํธ ๋ฐฉ์์ ์ฑํํ์์.
- CAN ํต์ ์ ์ก์ ๋ถ๋ถ์ Data Field ํฌ๊ธฐ๋ 8byte๋ก ์ค์ ํจ.
๐
โข PC6 (LED2), PC7 (LED1)์ ๊ฐ๋ฐ ๋ณด๋ ๋ด์ ์ฐ๊ฒฐ๋ 2๊ฐ์ LED Pin์ ์๋ฏธํฉ๋๋ค.
๐
-
๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํํ ํ ์คํธ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
- stm32f103vet6_fsmc_can_test โ src โ ap โ ap.c โ void apMCU1CanTest(void){...}
- stm32f103vet6_fsmc_can_test โ src โ ap โ ap.c โ void apMCU2CanTest(void){...}
- stm32f103vet6_fsmc_can_test โ src โ ap โ ap.c โ void apMCU1CanTest(void){...}
-
apMCU1CanTest()
ํจ์์apMCU2CanTest()
ํจ์๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ ํ๊ฒ MCU์ ๋ค์ด๋ก๋ํ์ฌ CAN ํต์ ์ ํ ์คํธ ํด๋ณผ ์ ์์ต๋๋ค. -
ap.c
ํจ์์์ ์ ๊ณตํ๋ ํ ์คํธ ์ธ์ ๋ค์ํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฉํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ ํ
์คํธ ํจ์๋ฅผ ๋น๋ํ๊ณ ์คํ์ํค๊ธฐ ์ํด์๋
stm32f103vet6_fsmc_can_test โ src โ main.c
์์ ๋น๋ ์ํฌ ํ ์คํธ ํจ์์ ์ฃผ์์ ํด์ ํด์ผํฉ๋๋ค.
#include "main.h"
int main(void)
{
hwInit();
apInit();
// apBoardLedTest();
// apUartTest();
apMCU1CanTest(); //0x7F3
// apMCU2CanTest(); //0x7F6
return 0;
}
- Filter ์ค์ ์ผ๋ก ์ธํด MCU 2์์๋ 0x104, 0x10C ID๋ฅผ ๊ฐ์ง๋ ๋ฉ์ธ์ง๋ฅผ ์์ ํ์ง ์๊ณ 0x100, 0x108 ID๋ฅผ ๊ฐ์ง๋ ๋ฉ์ธ์ง๋ง ์์ ํจ.
- MCU 1์์๋ MCU 2๊ฐ ๊ฐ์ง ์ ์๋ 0x100, 0x108 ID์ ๋ฉ์ธ์ง๋ฅผ ๋ชจ๋ ์์ ํ ์ ์์.
- Data Field๋ 8 byte๋ก ์ค์ ๋จ.
- ๋ง์ง๋ง 7 bits๋ End Frame ์๋ฏธ.
- Data Frame ํฌ๋ฉง
ํ๋ก์ ํธ๋ฅผ ๋น๋ํ ๋๋ ๋ค์ ๊ฒฝ๋ก์ ์๋ ํด๋๋ฅผ ๋น๋ ๋ฐ ๋๋ฒ๊ทธ ํญ๋ชฉ์์ ์ ์ธํด์ผ ์ ์์ ์ผ๋ก ํ๋ก์ ํธ๊ฐ ๋น๋๋ฉ๋๋ค.
stm32f411ceu6_fw_module โ src โ lib โ Core