Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

62 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

multi-mcu-can: CAN 2.0 ๋‹ค์ค‘ MCU ๋ถ„์‚ฐ ํ†ต์‹ 

C STM32 Raspberry Pi CAN SPI

STM32 ๋ณด๋“œ ๋‘ ๊ฐœ๋กœ CAN 2.0 ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์„ ๊ณต๋ถ€ํ•œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๋ชจํ„ฐ๋„ ์„€์‹œ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋ฒ„์Šค์™€ ํ”„๋กœํ† ์ฝœ, ๊ทธ๋ฆฌ๊ณ  ๋ถ„์‚ฐ๋œ MCU๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ํ†ต์‹ ์‹œํ‚ค๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋‹ค๋ค˜์Šต๋‹ˆ๋‹ค. F411RE๋Š” bxCAN ํŽ˜๋ฆฌํผ๋Ÿด์ด ์—†์–ด์„œ SPI๋กœ MCP2515๋ฅผ ๋ถ™์—ฌ ๋ฒ„์Šค์— ์ฐธ์—ฌ์‹œ์ผฐ๊ณ , ๊ทธ SPI ์ œ์–ด๊นŒ์ง€๊ฐ€ ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.

์›๋ž˜ Neuro-Drive์˜ Phase 6์ด์—ˆ๋Š”๋ฐ, ์•ก์ถ”์—์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๊ฑท์–ด๋‚ด๊ณ  CAN ํ†ต์‹ ๋งŒ ๋ณด๊ธฐ ์œ„ํ•ด ๋”ฐ๋กœ ๋–ผ์–ด๋ƒˆ์Šต๋‹ˆ๋‹ค.

ํŽŒ์›จ์–ด๋Š” STM32CubeIDE์—์„œ ์ž‘์„ฑยท๋นŒ๋“œยท๋””๋ฒ„๊น…ํ•˜๊ณ , ๊ฒ€์ฆ์ด ๋๋‚œ .ioc์™€ ํ•ต์‹ฌ ์†Œ์Šค(main.c, can.c ๋“ฑ)๋งŒ ์—ฌ๊ธฐ์— ๋ณต์‚ฌํ•ด์„œ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ(.md)๋Š” ์—ฌ๊ธฐ์„œ ์ง์ ‘ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ์ด repo๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ CubeIDE์—์„œ ๊ฒ€์ฆํ•œ ํŽŒ์›จ์–ด ์Šค๋ƒ…์ƒท + ๋ฌธ์„œ ๋ณด๊ด€์†Œ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ”์œ„๋Š” Phase 0โ€“2 (STM32 โ†” STM32 2๋…ธ๋“œ CAN)์ž…๋‹ˆ๋‹ค. Raspberry Pi 5 ๊ฒŒ์ดํŠธ์›จ์ด ๋…ธ๋“œ(Phase 3)๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ๋ณด๋ฅ˜ ์ค‘์ž…๋‹ˆ๋‹ค. ์‚ฌ์œ ๋Š” ์•„๋ž˜ Phase 3 โ€” ๋ณด๋ฅ˜ ์‚ฌ์œ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… Phase 2 ์–‘๋ฐฉํ–ฅ CAN ํ†ต์‹  ๊ฒ€์ฆ ์™„๋ฃŒ โ€” F446RE(native bxCAN) โ†” F411RE(MCP2515 SPI)๋ฅผ ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ CAN ๋ฒ„์Šค์—์„œ 500 kbps ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ์˜ ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ๋™๊ธฐ ์ˆ˜์‹ (peer_rx == self_tx)ํ•˜๊ณ  ์—๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋Š” 0์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋™์ž‘ ์˜์ƒยท๊ฒฐ๊ณผ ๋กœ๊ทธ๋Š” ์•„๋ž˜ ์‹œ์ž‘ํ•˜๊ธฐ โ†’ Phase 2์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Phase 2 ๋ฐฐ์„  โ€” ์ขŒ: F411RE+MCP2515, ์šฐ: F446RE+SN65HVD230

Phase 2 ๋ฐฐ์„  ์™„๋ฃŒ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์ขŒ์ธก์ด F411RE + MCP2515(SPI CAN), ์šฐ์ธก์ด F446RE + SN65HVD230(3.3V ํŠธ๋žœ์‹œ๋ฒ„)์ด๊ณ , ์ค‘์•™ ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ๊ฐ€ CAN_H / CAN_L / GND ๊ณตํ†ต ํ—ˆ๋ธŒ์ž…๋‹ˆ๋‹ค.


์™œ ๋”ฐ๋กœ repo๋ฅผ ํŒ ๋‚˜

๋ถ€๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ F446RE๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋‹ค๊ฐ€ ํ•˜๋“œ์›จ์–ด ์‚ฌ๊ณ ๊ฐ€ ๋‚ฌ์Šต๋‹ˆ๋‹ค. ์„œ๋ณด๊ฐ€ ์Šคํ†จ๋๊ณ , GND ์ ํผ ์„ ์— ๋ถˆ์ด ๋ถ™์—ˆ๊ณ , L298N ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์„œ๋ณด์™€ ํ•จ๊ป˜ ๋ง๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์œ„ ๋ ˆ์ด์–ด๋ฅผ ๋ฐ”๊ฟ”๋†“๊ณ ๋„ ์ „์— ์ž˜ ๋Œ๋˜ ํ•˜๋“œ์›จ์–ด๋Š” ๊ทธ๋Œ€๋กœ ๋ฉ€์ฉกํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ ๊ฒŒ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋•Œ ๋น ๋œจ๋ ธ๋˜ ๊ทœ์œจ ํ•˜๋‚˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ด repo๋ฅผ ๋‹ค์‹œ ์งฐ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ ˆ์ด์–ด๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์ „์— ์ง€๊ธˆ ๋ ˆ์ด์–ด๋ฅผ ๋จผ์ € ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.


์šด์˜ ์›์น™

๋ชจ๋“  Phase์— ๊ณตํ†ต์œผ๋กœ ์ง€ํ‚ค๋Š” ๊ทœ์น™ ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  1. ์ฝ”๋“œ๋ฅผ ์˜์‹ฌํ•˜๊ธฐ ์ „์— ์ „์›๊ณผ GND๋ถ€ํ„ฐ ๋ด…๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ๋ฏธํ„ฐ๋กœ ํ™•์ธํ•˜๋Š” ๊ฑด 30์ดˆ์ง€๋งŒ, ๋ณด๋“œ๊ฐ€ ํƒ€๋ฉด ๊ทธ๋‚ ์น˜ ์ž‘์—…์ด ๋‚ ์•„๊ฐ‘๋‹ˆ๋‹ค.
  2. ๊ธฐ๋Œ€ํ•œ ๋™์ž‘ ์—†์ด ์ด์ƒํ•œ ์†Œ๋ฆฌ๋‚˜ ์—ด์ด ๋‚˜๋ฉด ๋ฐ”๋กœ ์ „์›์„ ๋Š์Šต๋‹ˆ๋‹ค. ์›์ธ์„ ์ฐพ๊ธฐ ์ „์—” ๋‹ค์‹œ ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šคํ†จ๋œ ๋ชจํ„ฐ๋Š” ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์กฐ์šฉํ•ฉ๋‹ˆ๋‹ค.
  3. ํ•œ ๋ฒˆ์— ๋ ˆ์ด์–ด ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์Šค๊ฐ€ ์ƒˆ ๊ฒƒ์ด๋ฉด ํŽŒ์›จ์–ด๋Š” ๊ฒ€์ฆ๋œ ๊ฒƒ์„ ์“ฐ๊ณ , ํŽŒ์›จ์–ด๊ฐ€ ์ƒˆ ๊ฒƒ์ด๋ฉด ๋ฒ„์Šค๋Š” ์ด๋ฏธ ๊ฒ€์ฆ๋ผ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜

CAN 2.0 ๋ฒ„์Šค ํ•˜๋‚˜์— ๋…ธ๋“œ ๋‘˜, 500 kbps, ์–‘์ชฝ ๋ฌผ๋ฆฌ์  ๋๋‹จ์— 120ฮฉ ์ข…๋‹จ ์ €ํ•ญ์„ ๋‘ก๋‹ˆ๋‹ค.

Phase 2 ๋ชฉํ‘œ ํ† ํด๋กœ์ง€

           [120ฮฉ]                              [120ฮฉ]
              โ”‚                                  โ”‚
  CAN_H โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
  CAN_L โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
              โ”‚                                  โ”‚
       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ”‚ SN65HVD230  โ”‚                    โ”‚   TJA1050   โ”‚
       โ”‚  (3.3V xcvr)โ”‚                    โ”‚(๋ชจ๋“ˆ ๋‚ด์žฅ)  โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         TXD/RXD                            CAN TX/RX
              โ”‚                                  โ”‚
       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ”‚   F446RE    โ”‚                    โ”‚   MCP2515   โ”‚
       โ”‚   bxCAN     โ”‚                    โ”‚(SPI CAN ctrlโ”‚
       โ”‚  PA11/PA12  โ”‚                    โ”‚  ์™ธ๋ถ€ IC)   โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                            SCK/MOSI/MISO/CS
                                                  โ”‚
                                          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”
                                          โ”‚   F411RE    โ”‚
                                          โ”‚   SPI2      โ”‚
                                          โ”‚ PB13/14/15  โ”‚
                                          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๋…ธ๋“œ ์—ญํ• ์€ ์•„์ง ์•ก์ถ”์—์ดํ„ฐ๊ฐ€ ์—†์–ด์„œ ์ž๋ฆฌ๋งŒ ์žก์•„๋’€์Šต๋‹ˆ๋‹ค.

  • F446RE โ€” ๋‚˜์ค‘์— MotorECU ์ž๋ฆฌ. bxCAN + SN65HVD230(3.3V ๋„ค์ดํ‹ฐ๋ธŒ ํŠธ๋žœ์‹œ๋ฒ„).
  • F411RE โ€” ๋‚˜์ค‘์— SensorECU ์ž๋ฆฌ. MCP2515(SPI CAN ์ปจํŠธ๋กค๋Ÿฌ) + TJA1050(๋ชจ๋“ˆ ๋‚ด์žฅ ํŠธ๋žœ์‹œ๋ฒ„).

Phase ๊ณ„ํš

๊ฐ Phase๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋นŒ๋“œ๋˜๊ณ  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋˜๋Š” ์‚ฐ์ถœ๋ฌผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋’ค Phase๊ฐ€ ๊นจ์ ธ๋„ ์•ž Phase๋Š” ๋Œ์•„๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ”์œ„ (Phase 0โ€“2)

Phase ๋ชฉํ‘œ ๊ฒ€์ฆ ๋ฐฉ๋ฒ• ๋…ธ๋“œ ์ˆ˜
0 ์ „์› & GND ๊ฒ€์ฆ, ๊ธฐ๋ณธ ๋™์ž‘ ํ™•์ธ ๋ฉ€ํ‹ฐ๋ฏธํ„ฐ ์ธก์ •๊ฐ’ ๊ธฐ๋ก, ๊ฐ ๋ณด๋“œ์—์„œ "alive" UART ์ถœ๋ ฅ 2๊ฐœ ๋…๋ฆฝ
1 F446RE bxCAN ๋ฃจํ”„๋ฐฑ / F411RE MCP2515(SPI) ๋ฃจํ”„๋ฐฑ TX/RX ์นด์šดํ„ฐ๊ฐ€ UART์—์„œ ๋™๊ธฐ ์ฆ๊ฐ€ 1 (๊ฐ๊ฐ)
2 F446RE โ†” F411RE 2๋…ธ๋“œ CAN ์–‘ ๋…ธ๋“œ ํ•˜ํŠธ๋น„ํŠธ(0x010, 0x011) ์ƒํ˜ธ ์ˆ˜์‹ , ์นด์šดํ„ฐ ๋™๊ธฐ ์ฆ๊ฐ€ 2

Phase 0๋ฅผ ๋”ฐ๋กœ ๋–ผ์–ด ๋‘” ๊ฒƒ์€, ์œ„ ์‚ฌ๊ณ ๊ฐ€ ์•„๋ฌด๋„ ์•ˆ ๋ณด๋˜ ๋ ˆ์ด์–ด๋ฅผ ํƒ€๊ณ  ๋ฒˆ์กŒ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณด๋“œ๊ฐ€ ๊นจ๋—ํ•˜๊ฒŒ ์ „์›์ด ๋“ค์–ด์˜ค๊ณ , GND๊ฐ€ ์—ฐ์†์ด๊ณ , ๋ฒ„์Šค์— ๋ถ™์ด๊ธฐ ์ „์— UART๋กœ "alive"๊ฐ€ ์ฐํžˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ธฐ ์ „์—” Phase 1์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณด๋ฅ˜ (Phase 3 ์ดํ›„)

Phase ๋ชฉํ‘œ ์ƒํƒœ
3 RPi5 (SocketCAN) ๊ฒŒ์ดํŠธ์›จ์ด ๋…ธ๋“œ ์ถ”๊ฐ€ ๋ณด๋ฅ˜ โ€” ํ˜ธํ™˜์„ฑ ์†”๋ฃจ์…˜ ๊ฒฐ์ • ํ•„์š”
4 ์ฃผ๊ธฐ์  + ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง€ ์Šค์ผ€์ค„๋ง, ์šฐ์„ ์ˆœ์œ„ ์ฒ˜๋ฆฌ Phase 3 ์ดํ›„
5 ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ, ๋ฒ„์Šค ์˜คํ”„ ๋ณต๊ตฌ, ์ง„๋‹จ ๊ตํ™˜ (UDS ์Šคํƒ€์ผ) Phase 3 ์ดํ›„

Phase 3 โ€” ๋ณด๋ฅ˜ ์‚ฌ์œ 

์›๋ž˜๋Š” RPi5๋ฅผ MCP2515 + TJA1050 ๋ชจ๋“ˆ๋กœ SPI๋ฅผ ํ†ตํ•ด ๋ฒ„์Šค์— ๋ถ™์ด๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๋‘ ๊ฐ€์ง€๊ฐ€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค.

  1. TJA1050 ํŠธ๋žœ์‹œ๋ฒ„๊ฐ€ 5V ์ „์šฉ์ด๊ณ , ๋ชจ๋“ˆ ๊ตฌ์กฐ์ƒ MCP2515 ์ปจํŠธ๋กค๋Ÿฌ๋„ 5V๋กœ ๊ณต๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ทธ๋Ÿฌ๋ฉด MCP2515์˜ SPI ์ถœ๋ ฅ์ด 5V ๋กœ์ง์ด ๋˜๋Š”๋ฐ, RPi5 GPIO๋Š” 3.3V ์ „์šฉ์ด๋ผ ์ง๊ฒฐํ•˜๋ฉด ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ด์ „์— ์ด๊ฒƒ์œผ๋กœ RPi5 8GB ํ•œ ๋Œ€๋ฅผ ๋‚ ๋ ธ์Šต๋‹ˆ๋‹ค โ€” docs/lesson_learned.md ์‚ฌ๊ณ  1.)

ํ•ด๊ฒฐ์ฑ…์€ RPi ์ „์šฉ CAN HAT(~25,000์›, ์ œ์ผ ์•ˆ์ „), ๋กœ์ง ๋ ˆ๋ฒจ ์ปจ๋ฒ„ํ„ฐ, MCP2515 ๋ชจ๋“ˆ SMD ๋ฆฌ์›Œํฌ ์ •๋„๊ฐ€ ์žˆ๋Š”๋ฐ, Phase 2๊ฐ€ ๋๋‚˜๊ณ  ๋‹ค์‹œ ๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šด์˜ ์›์น™ #3์— ์–ด๊ธ‹๋‚˜๋Š” ์‹œ์ ์—์„œ ๋ฌด๋ฆฌํ•˜๊ฒŒ ๊ฒฐ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


CAN ID ํ• ๋‹น

์ง„๋‹จ ID๋Š” ์ž๋™์ฐจ ํ‘œ์ค€(UDS / ISO-15765) ๊ด€๋ก€๋ฅผ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ”์œ„ (Phase 0โ€“2)

ID ์†ก์‹ ์ž ๋ชฉ์  ์ฃผ๊ธฐ ์šฐ์„ ์ˆœ์œ„
0x010 F446RE ํ•˜ํŠธ๋น„ํŠธ (alive ์นด์šดํ„ฐ, ๊ฒฐํ•จ ํ”Œ๋ž˜๊ทธ) 100ms ๋†’์Œ
0x011 F411RE ํ•˜ํŠธ๋น„ํŠธ 100ms ๋†’์Œ
0x100 F446RE ์ƒํƒœ (์•ก์ถ”์—์ดํ„ฐ ๋ฐ์ดํ„ฐ ์ž๋ฆฌ) 50ms ์ค‘๊ฐ„
0x200 F411RE ์„ผ์„œ ๋ฐ์ดํ„ฐ (์ž๋ฆฌ) 50ms ์ค‘๊ฐ„

๋ณด๋ฅ˜ (Phase 3 ์ดํ›„, RPi ๋„์ž… ์‹œ)

ID ์†ก์‹ ์ž ๋ชฉ์  ์ฃผ๊ธฐ
0x7E0 RPi ์ง„๋‹จ ์š”์ฒญ (๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ) ์ด๋ฒคํŠธ
0x7E8 F446RE ์ง„๋‹จ ์‘๋‹ต ์ด๋ฒคํŠธ
0x7E9 F411RE ์ง„๋‹จ ์‘๋‹ต ์ด๋ฒคํŠธ

CAN์€ ๋‚ฎ์€ ID๊ฐ€ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋กœ ์ค‘์žฌ๋ฉ๋‹ˆ๋‹ค. ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ์ œ์ผ ๋‚ฎ์€ ID์— ๋‘ฌ์„œ, ๋ฒ„์Šค๊ฐ€ ๋ถ๋ฒผ๋„ ๋…ธ๋“œ ์ƒ์กด ์‹ ํ˜ธ๊ฐ€ ๋ฐ€๋ฆฌ์ง€ ์•Š๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ๋ฉ”์‹œ์ง€ ์‚ฌ์ „์€ docs/specs/can_protocol.md์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ €์žฅ์†Œ ๊ตฌ์กฐ

multi-mcu-can/
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ lesson_learned.md          # ๋ถ€๋ชจ ํ”„๋กœ์ ํŠธ ์‚ฌ๊ณ  ํšŒ๊ณ  + ์‚ฌ์ „ ํšŒํ”ผ ์‚ฌ๋ก€
โ”‚   โ”œโ”€โ”€ workflow.md                # ํฌ๋กœ์Šค ํ”Œ๋žซํผ(Ubuntu/Windows) ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ
โ”‚   โ”œโ”€โ”€ phases/
โ”‚   โ”‚   โ”œโ”€โ”€ phase0/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ checklist.md       # ์ „์›/GND ๊ฒ€์ฆ ์ ˆ์ฐจ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ ioc_f446re.md      # F446RE Phase 0 CubeMX ์„ค์ •
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ioc_f411re.md      # F411RE Phase 0 CubeMX ์„ค์ •
โ”‚   โ”‚   โ””โ”€โ”€ phase1/
โ”‚   โ”‚       โ”œโ”€โ”€ checklist_f446re.md  # F446RE bxCAN ๋ฃจํ”„๋ฐฑ ์ ˆ์ฐจ + ์™„๋ฃŒ ๊ธฐ๋ก
โ”‚   โ”‚       โ”œโ”€โ”€ ioc_f446re.md        # F446RE Phase 1 CubeMX ์„ค์ •
โ”‚   โ”‚       โ””โ”€โ”€ checklist_f411re.md  # F411RE MCP2515 SPI ๋ฃจํ”„๋ฐฑ + CubeMX ์„ค์ •
โ”‚   โ””โ”€โ”€ specs/
โ”‚       โ”œโ”€โ”€ can_protocol.md        # ์ „์ฒด ๋ฉ”์‹œ์ง€ ์‚ฌ์ „, DLC, ๋ฐ”์ดํŠธ ์ˆœ์„œ
โ”‚       โ””โ”€โ”€ hardware.md            # ํ™œ์„ฑ BOM + ๋ณด๋ฅ˜ ๋ถ€ํ’ˆ
โ”œโ”€โ”€ firmware/
โ”‚   โ”œโ”€โ”€ f446re_node/
โ”‚   โ”‚   โ”œโ”€โ”€ phase0_alive/          # LED ์ ๋ฉธ + UART "alive" (์™„๋ฃŒ)
โ”‚   โ”‚   โ””โ”€โ”€ phase1_loopback/       # bxCAN ๋‚ด๋ถ€ ๋ฃจํ”„๋ฐฑ (์™„๋ฃŒ)
โ”‚   โ””โ”€โ”€ f411re_node/
โ”‚       โ”œโ”€โ”€ phase0_alive/          # LED ์ ๋ฉธ + UART "alive" (์™„๋ฃŒ)
โ”‚       โ””โ”€โ”€ phase1_loopback/       # MCP2515 SPI ๋ฃจํ”„๋ฐฑ (์™„๋ฃŒ)
โ””โ”€โ”€ rpi/                           # Phase 3 ์ดํ›„ (ํ˜„์žฌ ๋ณด๋ฅ˜)

Phase 2๊ฐ€ ๊นจ์ ธ๋„ Phase 1์€ ๊ทธ๋Œ€๋กœ ํ”Œ๋ž˜์‹œํ•ด์„œ ๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ•˜๋“œ์›จ์–ด

๊ตฌ์„ฑ ์š”์†Œ ๋ถ€ํ’ˆ ์—ญํ• 
MCU 1 STM32 NUCLEO-F446RE bxCAN ๋…ธ๋“œ 1, ๋ฏธ๋ž˜ MotorECU
MCU 2 STM32 NUCLEO-F411RE MCP2515(SPI) ๋…ธ๋“œ 2, ๋ฏธ๋ž˜ SensorECU
F446RE ํŠธ๋žœ์‹œ๋ฒ„ SN65HVD230 ๋ชจ๋“ˆ 3.3V ๋„ค์ดํ‹ฐ๋ธŒ ์ฐจ๋™ ๋ฌผ๋ฆฌ ๋ ˆ์ด์–ด
F411RE CAN ์ปจํŠธ๋กค๋Ÿฌ + ํŠธ๋žœ์‹œ๋ฒ„ MCP2515 + TJA1050 ๋ชจ๋“ˆ SPI CAN ์ปจํŠธ๋กค๋Ÿฌ + 5V ํŠธ๋žœ์‹œ๋ฒ„(๋ชจ๋“ˆ ๋‚ด์žฅ)
์ข…๋‹จ ์ €ํ•ญ 120ฮฉ ร— 2 ๋ฒ„์Šค ์–‘์ชฝ ๋ฌผ๋ฆฌ์  ๋๋‹จ
์ „์› USB๋งŒ (๋ฒค์น˜ ์ „์›, ๋ฐฐํ„ฐ๋ฆฌ ์—†์Œ) Phase 0โ€“2 ๋ชจ๋‘ ๋ฐ์Šคํฌ ์ „์›

F446RE์— SN65HVD230์„ ์“ด ์ด์œ : F446RE๋Š” 3.3V ๋กœ์ง MCU์ž…๋‹ˆ๋‹ค. 5V ์ „์šฉ ํŠธ๋žœ์‹œ๋ฒ„(MCP2551, TJA1050)๋ฅผ ์ง๊ฒฐํ•˜๋ฉด TXD ์ž…๋ ฅ์˜ VIH ์ž„๊ณ„๊ฐ’(~3.5V)์„ 3.3V ์ถœ๋ ฅ์ด ๋„˜์ง€ ๋ชปํ•ด ๊ฐ„ํ—์ ์œผ๋กœ ์†ก์‹ ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. SN65HVD230์€ 3.3V ๋„ค์ดํ‹ฐ๋ธŒ๋ผ ์ด ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Phase 2์—์„œ F446RE ์ธก์— ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋ฌผ๋ฆฌ ๋ ˆ์ด์–ด ํ•˜๋‚˜๋กœ ๋ฌถ๊ธฐ ์œ„ํ•œ ์„ ํƒ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

F411RE์— MCP2515๋ฅผ ์“ด ์ด์œ : F411RE์—๋Š” bxCAN์ด ์—†์Šต๋‹ˆ๋‹ค. MCP2515๊ฐ€ SPI๋กœ ์ œ์–ดํ•˜๋Š” ์™ธ๋ถ€ CAN ์ปจํŠธ๋กค๋Ÿฌ๋ผ, F411RE๊ฐ€ CAN์— ์ฐธ์—ฌํ•  ์œ ์ผํ•œ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์— ๋‚ด์žฅ๋œ TJA1050(5V)์€ CAN ๋ฒ„์Šค ์ชฝ์—๋งŒ ๋ถ™๊ณ , SPI MISO ์„ (5V โ†’ F411RE)์€ PB14์˜ 5V ๋‚ด์„ฑ์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.

F411RE(3.3V) โ†” MCP2515(5V) ์ „์•• ํ˜ธํ™˜์„ฑ

MCP2515 ๋ชจ๋“ˆ์€ 5V๋กœ ๊ณต๊ธ‰ํ•˜์ง€๋งŒ F411RE(3.3V)์™€ ๋ ˆ๋ฒจ ์ปจ๋ฒ„ํ„ฐ ์—†์ด ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋ฐฉํ–ฅ๋ณ„๋กœ ์ด์œ ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์‹ ํ˜ธ ๋ฐฉํ–ฅ ์ „์•• ๋™์ž‘ ์ด์œ 
F411RE โ†’ MCP2515 (MOSI, SCK, CS) 3.3V โ†’ 5V ๋ชจ๋“ˆ MCP2515 ์ž…๋ ฅ VIH โ‰ˆ 2.1V. F411RE์˜ 3.3V ์ถœ๋ ฅ์ด๋ฉด ์ถฉ๋ถ„ํžˆ HIGH๋กœ ์ธ์‹
MCP2515 โ†’ F411RE (MISO) 5V โ†’ 3.3V MCU PB14๋Š” F411RE ๋ฐ์ดํ„ฐ์‹œํŠธ Table 11์—์„œ FT(5V ๋‚ด์„ฑ) ํ•€. 5V๋ฅผ ์ง์ ‘ ๋ฐ›์•„๋„ ๋จ

๊ฐ™์€ ๋ชจ๋“ˆ์„ RPi5์— ์ง๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด ์ด MISO 5V ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. RPi5 GPIO๋Š” 5V ๋‚ด์„ฑ์ด ์—†์–ด์„œ Phase 3๋ฅผ ๋ณด๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ชจ ํ”„๋กœ์ ํŠธ ์‚ฌ๊ณ ๊ฐ€ ๋ฐฐํ„ฐ๋ฆฌ ๋ฐฐ์„ ๊ณผ ์–ฝํ˜€ ์žˆ์–ด์„œ, ์ด repo๋Š” ๋ฐฐํ„ฐ๋ฆฌ ์—†์ด USB ์ „์›๋งŒ ์”๋‹ˆ๋‹ค.

์ „์ฒด BOM ๋ฐ ๋ฐฐ์„ ์€ docs/specs/hardware.md์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์‹œ์ž‘ํ•˜๊ธฐ

์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ

  • STM32CubeIDE
  • ํ˜ธ์ŠคํŠธ PC์˜ UART ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ (CubeIDE ๋‚ด์žฅ ๋˜๋Š” PuTTY/screen ๋“ฑ)

Phase 0 โ€” ์ดˆ๊ธฐ ์‹œ๋™

# ๊ฐ ๋ณด๋“œ์— phase0_alive ํŽŒ์›จ์–ด ํ”Œ๋ž˜์‹œ:
#   - LED 1Hz ์ ๋ฉธ
#   - UART๋กœ "[F446RE] alive, t=12345ms" 0.5์ดˆ๋งˆ๋‹ค ์ถœ๋ ฅ (F411RE๋„ ๋™์ผ ํŒจํ„ด)
# ๋‹ค์Œ ๋‹จ๊ณ„ ์ „์— ๊ฐ ๋ณด๋“œ UART ์ถœ๋ ฅ์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์ธ

๋ฉ€ํ‹ฐ๋ฏธํ„ฐ/์—ฐ์†์„ฑ ์ ˆ์ฐจ: docs/phases/phase0/checklist.md F446RE CubeMX ์„ค์ •: docs/phases/phase0/ioc_f446re.md F411RE CubeMX ์„ค์ •: docs/phases/phase0/ioc_f411re.md

Phase 1 โ€” ๊ฐ ๋…ธ๋“œ CAN ๋ฃจํ”„๋ฐฑ ๊ฒ€์ฆ

# F446RE: phase1_loopback ํ”Œ๋ž˜์‹œ โ†’ UART์—์„œ tx/rx ์นด์šดํ„ฐ ๋™๊ธฐ ์ฆ๊ฐ€ (์™„๋ฃŒ)
# F411RE: phase1_loopback ํ”Œ๋ž˜์‹œ (MCP2515 SPI ๋ฃจํ”„๋ฐฑ)
#   ๋ฐฐ์„ : F411RE SPI2(PB13/14/15) โ†” MCP2515 ๋ชจ๋“ˆ + PB6=CS
#   UART์—์„œ "init OK (CANSTAT=0x40)" ํ›„ tx/rx ์นด์šดํ„ฐ ๋™๊ธฐ ์ฆ๊ฐ€ ํ™•์ธ

F446RE ์ ˆ์ฐจ: docs/phases/phase1/checklist_f446re.md F411RE ์ ˆ์ฐจ: docs/phases/phase1/checklist_f411re.md

F411RE + MCP2515 ๋ฐฐ์„  ์—ฐ์†์„ฑ ํ™•์ธ

F411RE Phase 1 UART ์ถœ๋ ฅ โ€” init OK, tx==rx ๋™๊ธฐ ์ฆ๊ฐ€

Phase 2 โ€” 2๋…ธ๋“œ CAN ํ†ต์‹ 

# ์–‘์ชฝ ๋ณด๋“œ์— phase2_two_node ํŽŒ์›จ์–ด ํ”Œ๋ž˜์‹œ
# ๋ฐฐ์„ : F446RE PA11/PA12 โ†” SN65HVD230 โ†” CAN ๋ฒ„์Šค โ†” TJA1050 โ†” MCP2515 โ†” F411RE SPI2(PB13/14/15)
# ๊ณตํ†ต GND ํ•„์ˆ˜ (phase0/checklist.md Step 2)
# ๊ฐ ๋…ธ๋“œ UART์—์„œ ์ƒ๋Œ€ ํ•˜ํŠธ๋น„ํŠธ ์ˆ˜์‹  ์นด์šดํ„ฐ๊ฐ€ ๋™๊ธฐ ์ฆ๊ฐ€ํ•˜๋Š”์ง€ ํ™•์ธ

Phase 2 ๋ฐฐ์„  ์ ˆ์ฐจ: docs/phases/phase2/checklist.md

๊ฒฐ๊ณผ โ€” ์–‘๋ฐฉํ–ฅ 500 kbps ํ†ต์‹  ๊ฒ€์ฆ ์™„๋ฃŒ. ๋‘ ๋…ธ๋“œ๊ฐ€ ๋ฌผ๋ฆฌ CAN ๋ฒ„์Šค๋ฅผ ํ†ตํ•ด ์„œ๋กœ์˜ ํ•˜ํŠธ๋น„ํŠธ(F446RE 0x010 โ†” F411RE 0x011)๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉฐ, ์–‘์ชฝ peer_rx๊ฐ€ self_tx์™€ ๋™๊ธฐ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. F446RE err=0x0, F411RE eflg=0x00 (์—๋Ÿฌ ํ”Œ๋ž˜๊ทธ ์—†์Œ)์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

[F411RE] init OK (CANSTAT=0x00)
[F411RE] self_tx=479 peer_rx=478 eflg=0x00 t=47900ms
[F446RE] CAN start: state=2 err=0x0
[F446RE] self_tx=10  peer_rx=11  err=0x0  t=1000ms

F411RE๋Š” CANSTAT=0x00(Normal ๋ชจ๋“œ ์ง„์ž…), F446RE๋Š” state=2(HAL_CAN_STATE_READY)๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

Phase 2 ๋ฐฐ์„  ํด๋กœ์ฆˆ์—… โ€” F411RE+MCP2515, F446RE+SN65HVD230, ๋ธŒ๋ ˆ๋“œ๋ณด๋“œ CAN ๋ฒ„์Šค ํ—ˆ๋ธŒ

Phase 2 ์ „์ฒด ์…‹์—… โ€” ์–‘์ชฝ ๋…ธ๋“œ UART ์ถœ๋ ฅ์„ ๋…ธํŠธ๋ถ ๋‘ ํ„ฐ๋ฏธ๋„์—์„œ ๋™์‹œ ๊ด€์ฐฐ

์‹ค์‹œ๊ฐ„ ๋™์ž‘ ์˜์ƒ:

Phase2_CAN.mp4

์˜์ƒ์ด ์žฌ์ƒ๋˜์ง€ ์•Š์œผ๋ฉด docs/assets/captures/Phase2_CAN.mp4์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋กœ๋“œ๋งต (Phase 2 ์ดํ›„)

2๋…ธ๋“œ ๋ฒ„์Šค๊ฐ€ ์ถฉ๋ถ„ํžˆ ์•ˆ์ •๋œ ๋‹ค์Œ ์ƒ๊ฐํ•˜๋Š” ํ™•์žฅ์ž…๋‹ˆ๋‹ค.

  • Phase 3: RPi5 ๊ฒŒ์ดํŠธ์›จ์ด ๋…ธ๋“œ ์ถ”๊ฐ€ (CAN HAT / USB-CAN ์–ด๋Œ‘ํ„ฐ / ๋กœ์ง ๋ ˆ๋ฒจ ์ปจ๋ฒ„ํ„ฐ ์ค‘ ํƒ)
  • Phase 4: ์ฃผ๊ธฐ์  + ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง€ ์Šค์ผ€์ค„๋ง, ์šฐ์„ ์ˆœ์œ„ ์ฒ˜๋ฆฌ
  • Phase 5: ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ, ๋ฒ„์Šค ์˜คํ”„ ๋ณต๊ตฌ, ์ง„๋‹จ ๊ตํ™˜ (UDS ์Šคํƒ€์ผ)
  • CAN-FD ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (F446RE๋Š” ๋˜์ง€๋งŒ F411RE๋Š” ์•ˆ ๋จ โ€” ๋…ธ๋“œ ๊ต์ฒด ํ•„์š”)
  • ISO-TP (ISO-15765-2)๋กœ 8๋ฐ”์ดํŠธ ๋„˜๋Š” ์ง„๋‹จ ํŽ˜์ด๋กœ๋“œ ๋ถ„ํ• 
  • UDS ์„œ๋น„์Šค ๊ตฌํ˜„ (DTC ์ฝ๊ธฐ, ECU ์ดˆ๊ธฐํ™”, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธ์…˜)
  • ์•ก์ถ”์—์ดํ„ฐ ๋ ˆ์ด์–ด ๋‹ค์‹œ ์˜ฌ๋ ค์„œ ๋ถ€๋ชจ Neuro-Drive ์„€์‹œ์™€ ์žฌํ†ตํ•ฉ

์ž‘์„ฑ์ž

๋ฐ•ํ•ด์ง„ (Haejin Park) ๊ฒฝ๋ถ๋Œ€ํ•™๊ต

About

CAN 2.0 multi-MCU communication study with STM32F446RE, STM32F411RE, and Raspberry Pi 5

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages