Skip to content

steppenhj/multi-mcu-can

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

48 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) ๋กœ CAN ๋ฒ„์Šค์— ์ฐธ์—ฌํ•˜๋ฉฐ, SPI ์ œ์–ด๋„ ์ด ํ”„๋กœ์ ํŠธ์˜ ํ•™์Šต ๋ฒ”์œ„์— ํฌํ•จ๋œ๋‹ค.

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

ํ˜„์žฌ ๋ฒ”์œ„: Phase 0โ€“2 (STM32 โ†” STM32 2๋…ธ๋“œ CAN). Raspberry Pi 5 ๊ฒŒ์ดํŠธ์›จ์ด ๋…ธ๋“œ๋Š” Phase 3 ์ดํ›„๋กœ ์—ฐ๊ธฐ๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ ๋ณด๋ฅ˜ ์ƒํƒœ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ Phase 3 โ€” ๋ณด๋ฅ˜ ์‚ฌ์œ  ์ฐธ์กฐ.

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

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


๋ณ„๋„ Repo๋ฅผ ๋งŒ๋“  ์ด์œ 

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

์ด ์ €์žฅ์†Œ๋Š” ์ฒ˜์Œ์— ๋น ๋œจ๋ ธ๋˜ ๊ทœ์œจ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค: ๋‹ค์Œ ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ํ˜„์žฌ ๋ ˆ์ด์–ด๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฒ€์ฆํ•œ๋‹ค.


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

์ด ์ €์žฅ์†Œ์˜ ๋ชจ๋“  Phase์—์„œ ํƒ€ํ˜‘ ๋ถˆ๊ฐ€๋Šฅํ•œ 3๊ฐ€์ง€ ๊ทœ์น™.

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

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

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

Phase 0๋ฅผ ๋ณ„๋„๋กœ ๋‘๋Š” ์ด์œ 

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

Phase 2์—์„œ ํŠธ๋žœ์‹œ๋ฒ„ ์„ ํƒ์˜ ์ค‘์š”์„ฑ (F446RE)

Phase 2์—์„œ F446RE ์ธก์˜ ์ƒˆ ๋ณ€์ˆ˜๋Š” "๋ฌผ๋ฆฌ ๋ ˆ์ด์–ด" ๋‹จ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค. STM32(3.3V ๋กœ์ง)์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” 5V ์ „์šฉ ํŠธ๋žœ์‹œ๋ฒ„(MCP2551, TJA1050)๋ฅผ F446RE์— ์ง๊ฒฐํ•˜๋ฉด VIH ๋งˆ์ง„ ๋ถ€์กฑ์œผ๋กœ ์ธํ•œ ๊ฐ„ํ—์  ์†ก์‹  ์‹คํŒจ๋ผ๋Š” ๋‘ ๋ฒˆ์งธ ๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค. ์ด ์ €์žฅ์†Œ๋Š” F446RE์— 3.3V ๋„ค์ดํ‹ฐ๋ธŒ ํŠธ๋žœ์‹œ๋ฒ„์ธ SN65HVD230์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž์„ธํ•œ ํšŒ๊ณ ๋Š” docs/lesson_learned.md์˜ "์‚ฌ์ „ ํšŒํ”ผ" ์„น์…˜ ์ฐธ์กฐ.

F411RE ์ธก์€ ๋‹ค๋ฅธ ์ด์œ ๋กœ ๋‹ค๋ฅด๋‹ค. F411RE์—๋Š” bxCAN ํŽ˜๋ฆฌํผ๋Ÿด ์ž์ฒด๊ฐ€ ์—†์œผ๋ฏ€๋กœ, TXD/RXD ์ง๊ฒฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. F411RE๋Š” SPI๋ฅผ ํ†ตํ•ด MCP2515๋ฅผ ์ œ์–ดํ•˜๊ณ , MCP2515 ๋ชจ๋“ˆ์— ๋‚ด์žฅ๋œ TJA1050์ด CAN ๋ฒ„์Šค์™€ ์—ฐ๊ฒฐ๋œ๋‹ค. SPI MISO ์„ (5V โ†’ 3.3V)์€ F411RE์˜ 5V ๋‚ด์„ฑ ํ•€(PB14)์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

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

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

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

๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์€ (1) RPi ์ „์šฉ CAN HAT (~25,000์›, ๊ฐ€์žฅ ์•ˆ์ „), (2) ๋กœ์ง ๋ ˆ๋ฒจ ์ปจ๋ฒ„ํ„ฐ ์ถ”๊ฐ€, (3) 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 = ๋†’์€ ์šฐ์„ ์ˆœ์œ„ (CAN์˜ ์ž์—ฐ์  ์ค‘์žฌ). ํ•˜ํŠธ๋น„ํŠธ๋Š” ๋ชจ๋“  ๊ฒƒ๋ณด๋‹ค ์šฐ์„ ํ•˜์—ฌ, ๋ฒ„์Šค๊ฐ€ ํ˜ผ์žกํ•ด๋„ ๋…ธ๋“œ ์ƒ์กด ์›๊ฒฉ ์ธก์ •์ด ์ง€์—ฐ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•œ๋‹ค.

์ „์ฒด ๋ฉ”์‹œ์ง€ ์‚ฌ์ „: 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 ํด๋”๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋นŒ๋“œ ๊ฐ€๋Šฅํ•˜๋‹ค. Phase 2๊ฐ€ ๊ณ ์žฅ๋‚˜๋„, Phase 1์€ ์—ฌ์ „ํžˆ ํ”Œ๋ž˜์‹œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Phase 3 ์ดํ›„ (RPi5 ํ†ตํ•ฉ) ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๋ณด๋ฅ˜ ์ƒํƒœ์ด๋ฉฐ, Phase 2 ์™„๋ฃŒ ํ›„ ํ˜ธํ™˜์„ฑ ๊ฒฐ์ •๊ณผ ํ•จ๊ป˜ ์ถ”๊ฐ€๋  ์˜ˆ์ •์ด๋‹ค.


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

๊ตฌ์„ฑ ์š”์†Œ ๋ถ€ํ’ˆ ์—ญํ• 
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 ๋„ค์ดํ‹ฐ๋ธŒ ํŠธ๋žœ์‹œ๋ฒ„๋‹ค.

์™œ 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 TXD ์ž…๋ ฅ์˜ VIH โ‰ˆ 2.1V. F411RE ์ถœ๋ ฅ 3.3V๊ฐ€ ์ถฉ๋ถ„ํžˆ HIGH๋กœ ์ธ์‹๋จ
MCP2515 โ†’ F411RE (MISO) 5V โ†’ 3.3V MCU PB14๋Š” STM32F411RE ๋ฐ์ดํ„ฐ์‹œํŠธ Table 11์—์„œ FT(Five-volt Tolerant) ํ•€์œผ๋กœ ๋ถ„๋ฅ˜. 5V ์‹ ํ˜ธ๋ฅผ ์ง์ ‘ ์ˆ˜์‹  ๊ฐ€๋Šฅ

RPi5์™€ ๋‹ค๋ฅธ ์ด์œ : RPi5 GPIO๋Š” 5V ๋‚ด์„ฑ์ด ์—†๋‹ค. ๋™์ผํ•œ MCP2515 ๋ชจ๋“ˆ(MISO 5V)์„ RPi5์— ์ง๊ฒฐํ•˜๋ฉด GPIO ์†์ƒ ์œ„ํ—˜์ด ์žˆ์–ด Phase 3๋ฅผ ๋ณด๋ฅ˜ํ•œ ์›์ธ ์ค‘ ํ•˜๋‚˜๋‹ค โ€” lesson_learned.md ์‚ฌ์ „ ํšŒํ”ผ 1 ์ฐธ์กฐ.

์ด ์ €์žฅ์†Œ์—์„œ๋Š” ๋ฐฐํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ถ€๋ชจ ํ”„๋กœ์ ํŠธ์˜ ์‚ฌ๊ณ ๋Š” ๋ฐฐํ„ฐ๋ฆฌ ๋ฐฐ์„ ๊ณผ ๊ด€๋ จ์ด ์žˆ์—ˆ๋‹ค. ์ด ์ €์žฅ์†Œ๋Š” USB ์ „์›๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

Phase 3 ์ดํ›„ (RPi5 ํ†ตํ•ฉ) โ€” MCP2515 + TJA1050 ๋ชจ๋“ˆ์„ RPi5์— ์ง๊ฒฐํ•˜๋ฉด MISO 5V ์ถœ๋ ฅ์ด 3.3V ์ „์šฉ GPIO๋ฅผ ์†์ƒ์‹œํ‚ฌ ์œ„ํ—˜์ด ์žˆ๋‹ค. RPi5 ์—ฐ๊ฒฐ ๋ฐฉ์‹์€ Phase 2 ์™„๋ฃŒ ํ›„ ๋ณ„๋„ ๊ฒฐ์ •ํ•œ๋‹ค.

์ „์ฒด BOM ๋ฐ ๋ฐฐ์„ : docs/specs/hardware.md.


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

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

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

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

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

# ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ๊ฐ ๋ณด๋“œ์˜ 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


๋กœ๋“œ๋งต (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

No releases published

Packages

 
 
 

Contributors

Languages