12
SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr 작성 이메일 전화 PAGE [email protected] 02-2026-5140 - 1 - ◈ 개정 내역 버전 개정 내역 일자 0.1.0 첫 번째 릴리즈 2011/08/29 ◈ 사용된 Tool 버전 Tool Version IAR EWARM Kickstart Edition 5 또는 이후 버전 ◈ 참고 문서 번호 회사명 문서명 1 STMicroelectronics RM0008 STM32 Reference manual 2 IAR Systems EWARM_IDEGuide.ENU.pdf 3 4 5 ◈ 소개 STM32PeripheralBxCAN에 대한 이해를 돕기 위해 작성되었습니다. ◈ 지원 디바이스 STM32F103/105/107 BxCAN을 내장한 STM32 MCU ◈ 시작하기에 앞서CAN 통신에 대한 기초 지식은 있다는 가정하에 설명을 진행 합니다.

SAEMICHIPS STM32 Basic Extended CAN

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 1 -

◈ 개정 내역 

버전  개정 내역  일자 

0.1.0  첫 번째 릴리즈  2011/08/29 

     

     

     

     

     

     

 

◈ 사용된 Tool 버전 

Tool  Version 

IAR EWARM Kickstart Edition  5 또는 이후 버전 

   

   

 

◈ 참고 문서 

번호  회사명  문서명 

1  STMicroelectronics  RM0008 STM32 Reference manual 

2  IAR Systems  EWARM_IDEGuide.ENU.pdf 

3     

4     

5     

 

◈ 소개  

STM32의 Peripheral중 BxCAN에 대한 이해를 돕기 위해 작성되었습니다.  

 

◈ 지원 디바이스  

STM32F103/105/107 BxCAN을 내장한 STM32 MCU 

 

 

 

◈ 시작하기에 앞서… 

CAN 통신에 대한 기초 지식은 있다는 가정하에 설명을 진행 합니다. 

 

 

 

Page 2: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 2 -

bxCAN  

1. bxCAN 특징 

RM0008 문서에 자세히 나와있으나 정리 하자면, 

※ CAN 2.0A/B 지원 

※ 최대 1M bps 전송 속도 

※ Time triggered communication 지원 

※ 세개의 Tx Mail box 

※ 전송 우선순위 설정 가능 

※ Time stamp 기능 

※ 두 개의 Rx FIFO 

※ ID List / ID Range Filter 설정 

단점으로는 STM32 Connectivity Line을 제외한 F1 시리즈 STM32들은 USB와 CAN을 동시에 사용하지 

못합니다. 이유는 데이터 송/수신에 사용되는 512바이트 RAM을 USB와 CAN이 공유하기 때문이라고 합

니다. CAN과 USB를 동시에 사용해야 한다면 STM32F105/7이나 F2 시리즈의 STM32를 사용하시기 바랍

니다. 

 

2. bxCAN Block diagram 

 

블록은 위 그림에 나타낸 바와 같이 Control/Status/Configuration부,  Tx  Mailbox부, Rx FIFO부, 

Filter 부로 나누어 집니다. 

Page 3: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 3 -

STM32F Connectivity Line 디바이스들의 경우 CAN Slave가 추가되어 있으며 Filter와 MAC만 공유하고 

다른 부분은 따로 가지고 있습니다. 그리고 Filter 개수도 다른 디바이스에 비해 2배로 가지고 있습니다. 

 

3. CAN Bit timing 설정 

예제 프로젝트에서는 STM32의 SYSCLK을 72Mhz, CAN Clock 36Mhz 에서 CAN 통신 속도 1Mhz 일 경우로 

설정 되어 있습니다. STM32의 bxCAN은 APB1으로부터 Clock을 공급 받으므로 CAN에 공급되는 Clock 주

파수는 36Mhz입니다. 

 

CAN BIT TIME 

  1Tq         1‐8Tq            1‐8Tq                  1‐8Tq 

 

 

                      TSEG1                           TSEG2 

 

                                         Sampling point 

 

아래 사이트를 참조 하면 Bit Time설정에 도움이 되리라 생각 됩니다.  

http://www.kvaser.com/en/support/bit‐timing‐calculator.html 

 

4. CAN Message 전송 

CAN  Message를  전송하는  방법은  생각보다  간단합니다.    CAN  TSR(Transmit  status  register)의 

TME(Transmit Mailbox Empty) bit를 확인해서 비어있는 Mailbox를 찾은 다음 비어 있는 Mailbox에 

ID,  Frame  type,  DLC 및 데이터를 셋팅하고  TX  mailbox  id  regster의  TXRQ(Transmit  Mailbox 

Request) bit를 SET하면 설정된 Message가 전송 됩니다.  

예제 프로젝트의 can_drv.c 파일의  can_tx_msg 함수를 참조 바랍니다. 

 

Phase segment1 Prop Segment Sync  Phase segment2 

Page 4: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 4 -

  CAN TX STATE MACHINE 

※ 전송 우선순위 : 

bxCAN은 세 개의 Tx Mailbox를 가지고 있으며 전송의 우선 순위를 ID로 할지 아니면 Tx를 요청한 

순서대로  전송할지를  선택  할  수  있습니다.  CAN  MCR(Master  control  register)레지스터의 

TXFP(Tx Fifo priority)비트가 1이면 전송을 요청한 순서로 Message가 전송되며 0이면 ID가 낮은 

순서로 Message가 전송 됩니다. 이 비트는 전송을 요청한 순서로 나가도록 예제 프로그램에서는 설

정되어 있습니다. 대부분의 애플리케이션에서 보내는 메시지가 Pending되는 일은 없을 것입니다. 

 

※ 전송 중지  

Mailbox0의  Message 전송을 중지하려면 TSR의 ABRQ0비트를 SET 합니다. Pending이나 Scheduled 

상태면 즉시 전송이 중지되며 Transmit 상태인 동안에는 두 가지 경우로 나누어 집니다. 만약 전송

이 성공하면 Mailbox는  TXOK비트를 SET으로 하고 Empty상태로 되며 전송에 실패하면 전송은 중지

되고 Scheduled상태에서 Empty상태로 되며 TXOK비트는 RESET됩니다.  

 

※ 자동 재전송 

MCR레지스터의 NART(No automatic retransmission)비트가 0이면 CAN Hardware는 Message전송이 

성공 할 때까지 재 전송을 시도하게 됩니다. Time triggered communication option이 아니면 자

동 재전송 모드를 선택해야 합니다. 

 

5. CAN Filter 설정  

CAN은 Message를 ID단위로 수신을 할지 아니면 버릴지를 Hardware적으로 결정을 합니다. 이 판단의 기

준이 되는 것이 Filter인데요. Filter설정에 따라서 CAN Network에 돌아다니는 메시지를 받을지 버릴지

를 결정 합니다. 

bxCAN의 Filter는 두 개의 32비트 레지스터로 이루어져 있으며 네 가지로 셋팅 할 수 있습니다.  

아래의 그림은 Filter설정을 그림으로 나타낸 것입니다. 

 

Page 5: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 5 -

그리고 각 Filter마다 두 개의 Receive FIFO중 하나를 선택해서 Filter를 통과한 Message를 선택된 

FIFO로 보낼 수 있습니다. 

CAN RDTR(Receive FIFO mailbox data length control and time stamp register)의 Filter match 

index field에 현재 FIFO에 수신된 Message의 Filter match index가 들어갑니다. 

 

※ ID List mode ( ID Filtering mode ) 

Filter  bank  register에  ID  List가 들어가며 이  ID  List와 동일한  ID를 갖는  Message는 이 

Filter를 통과해서 Rx FIFO에 들어 갑니다. 

 

 

 

예제 소스에서 16 bit ID list mode로 Filter를 setting하는 부분 입니다. 

 

const  t_can_filter_init   can_filter0 = 

{  /* FMI 0~3 */ 

  0, // Filter number 

  kCanFM_16bitIdList,// e_filt_mode 

  kCanFA_FIFO0, // kCanFA_FIFO0 or kCanFA_FIFO1 

  kMake16bitIdListValue(0x111, kFrameTypeData, 0x112, kFrameTypeData),  

  kMake16bitIdListValue(0x113, kFrameTypeData, 0x114, kFrameTypeData) 

}; 

위와 같이 설정하면 0x111, 0x112, 0x113, 0x114 ID가 Filter0을 통과할 수 있습니다. 

 

※ ID Mask mode ( Range filtering mode ) 

예를 들어 0x300 ~ 0x30F의 Message를 수신하고자 할 때 사용 하는 모드 입니다. 즉 특정 범위의 

Message를 모두 수신하고 싶을 때 사용합니다. 

 

 

Page 6: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 6 -

 

 

예제 소스에서 16 bit ID mask mode로 Filter를 setting하는 부분 입니다. 

const  t_can_filter_init   can_filter4 = 

{  /* FMI 0~1 */ 

  // ID 0x61x , 0x510 ~ 0x51F까지 메시지 수신 

  // ID 0x71x , 0x520 ~ 0x52F까지 메시지 수신  /* FMI 28~29 */ 

  4, // Filter number 

  kCanFM_16bitIdMask, 

  kCanFA_FIFO1, 

  kMake16bitIdMaskValue(0x510, 0x7F0, kFrameTypeData), 

  kMake16bitIdMaskValue(0x520, 0x7F0, kFrameTypeData) 

}; 

ID와 Filter를 설정하는 방법은 아래와 같습니다. 

ID    0x510    0101,0001,0000 

Mask  0x7F0    0111,1111,0000 Mask bit가 1이면 Must match, 0이면 Don’t care이므로 

 

위의 적색 화살표를 기준으로 왼쪽은 mask bit가 1이므로 ID 0x51부분과 일치해야 하며 오른쪽은 

mask bit가 0이므로 ID부분의 하위 4개의 비트와는 무관하게 Filter를 통과 합니다. 이렇게 해서 

0x510~0x51F까지의 ID를 가진 Message가 Filter를 통과하게 됩니다. 이 모드를 사용하면 하나의 

필터로  11비트  ID 모두를 수신할 수도 있습니다. 그러나 이렇게  Range  filtering을 사용하면 

Message가 수신될 때 Software에서 ID를 모두 확인해서 Message버퍼에 저장해야 하기 때문에 CPU

로드가 발생합니다. 수신할 ID가 많아서 Filter가 모자랄 경우가 아니면 사용하는 것을 권장하지 않

습니다. 

 

※ Filter match Index 

각 FIFO의 RDTR에는 Filter match index field가 있습니다. 이는 수신된 Message가 어떤 filter

를 통과했는지를 나타내주는 Index 입니다. 

Filter의  mode에 따라서  Filter에 번호가 붙게 되는데 아래 그림과 같습니다. 아래 그림에서 

Filter bank는 Filter Register번호이며 Filter Num이 FMI Field에 들어가는 index 번호 입니다. 

Message가 수신되면 ID를 비교하지 않고 FMI를 확인해서 Message 버퍼에 저장할 수 있어서 ID를 비

교하는 것보다 빠릅니다. 

Page 7: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 7 -

 

예제 프로젝트에서는 FIFO0는 ID List모드로 설정되는 필터를 할당 했으며 FIFO1에는 ID Mask 모드

로 설정되는 필터를 할당 했습니다. 그러나 꼭 그럴 필요는 없으며 위 그림과 같이 혼합해서 할당해

도 문제는 없습니다.  

 

※ Filter start bank 

STM32F105/7 디바이스와 같이 CAN이 2개인 디바이스에 해당 됩니다. 

Filter start bank에 Filter Register number가 들어가야 하며 이 번호 이후의 필터는 CAN2에 할

당됩니다. Reset value는 14이므로 변경을 하지 않으면 14번~27번까지의 Filter가 CAN2에 할당 됩

니다. 

 

6. CAN Message 수신 

Filter설정을 잘 했다면 Network에 돌아다니는 Message를 수신하는 방법은 쉽습니다. 수신 인터럽트를 

활성화 해 놓으면 돌아다니는 Message가 Filter를 통과하고 자동으로 FIFO에 ID, DLC등의 데이터가 저

장 된 후 인터럽트가 발생 합니다.. 그러므로 수신 인터럽트가 발생하면 어떤 FIFO가 Interrupt를 발생

시켰는지 확인 후 FIFO에 저장된 Message data를 가져오면 됩니다. CAN Rx 인터럽트는 FIFO0, FIFO1각

각 할당 되어 있습니다. 

 

먼저 RX state machine을 살펴 보겠습니다.  

Page 8: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 8 -

 

위 state machine에서 Valid message는 Filter를 통과한 message 입니다. 

Receive FIFO0, 1에는 각각 3개의 Mailbox를 가지고 있습니다.  

 

PENDING : EMPTY상태에서 Message가 Filter를 통과하면 RFxR(x=0 or 1) register의 FMP field가 하

나씩 증가하며  PENDING상태가 됩니다.Mailbox의  Message를 저장하고  RFxR의  RFOMx(Release  FIFOx 

Output  Mailbox) 비트를  Set하면  FMP  field가 하나씩 감소 합니다. 수신된  Message모두 저장하고 

mailbox를 모두 Release시키면  EMPTY상태가 됩니다. 

 

OVERRUN  :  Mailbox를  release하지  않고  4번째  Message가  수신되면  Overrun상태(Receive  FIFOx 

Register의 FOVRx bit가 Set됨)가 됩니다. Overrun 상태에서 계속 Message가 수신되면 MCR(Master 

Control Register)register 의 RFLM 비트의 상태에 따라 두 가지로 동작합니다.  

RFLM = 0 : 4번째 수신된 Message를 Overwrite합니다. 

RFLM = 1 : 4번째 수신된 Message를 버립니다. 세 번째까지 받은 메시지 유지 합니다. 

 

※ CAN Rx Interrupt 

Interrupt Enable/Disable은 IER(Interrupt Enable Register)의 Enable bit를 통해서 할 수 있습니

다. 

FIFO mailbox에 Message가 수신되었을 때 Interrupt가 발생되게 하려면 FMPIEx 비트를 SET하면 됩니

Page 9: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 9 -

다. 그리고 소프트웨어에서 void CAN1_RX0_IRQHandler(void) 함수를 추가하고 코딩을 하면 됩니다. 자

세한 내용은 예제 프로젝트를 참조 하세요. 

 

예제 프로젝트 

※ 프로젝트 폴더 구조 및 설명 

예제 프로젝트에는 Data frame/Remote frame에 대한 예제 및 ID List/ID Mask에 대한 Tx/Rx예제

가 있습니다. 예제 프로젝트에서는 Remote frame을 수신하면 그에 해당하는 자신의 Message를 Data 

frame으로 보냅니다. – 소스 코드에 대한 설명은 주석으로 대체 합니다. 

 

프로젝트의 압축파일을 풀면 아래의 그림과 같은 트리로 구성되어 있음을 확인 할 수 있습니다. 

 

Application : CAN Test 소스 파일 및 프로젝트 파일 등이 있습니다. 

BootLoader : USART통신으로 펌웨어를 업그레이드 할 수 있는 부트로더 프로젝트 폴더입니다. 

EWARMv5.4 : EWARM ver5.4용 Workspace파일이 있는 폴더 입니다. 

EWARMv6.1 : EWARM ver6.1용 Workspace파일이 있는 폴더 입니다. 

Libraries : STMicroelectronics에서 제공하는 라이브러리 파일이 있는 폴더 입니다. 

Uploader_win : Windows 응용 프로그램이 있는 폴더입니다. 

Utility : STM32 C 소스 파일이 있는 폴더 입니다. 

 

본 예제 프로젝트는 2가지 방법으로 테스트를 할 수 있습니다. 첫째 두 개의 STM3210B_EVAL 보드 또

는 STM3210E_EVAL보드를 사용하는 방법과 하나의 STM3210C_EVAL를 사용하는 방법이 있습니다.  

 

※ 두 개의 STM3210E_EVAL 보드 또는 STM3210B_EVAL 보드를 사용하는 방법 

1) [ STM32_CSP_CAN v1.x ]\EWARMv5.4 폴더에서 bl_can_app_ewarm v5.4.eww을 엽니다. 

Page 10: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 10 -

 

2) Configuration drop down메뉴에서 STM32F10X_MD 또는 STM32F10X_MD_NOBOOT를 선택 합니다. 

차이는  부트로더를  사용  여부  이며  CAN테스트에서는  Bootloader는  상관이  없으므로 

STM32F10X_MD_NOBOOT를 선택하십시오. 

 

3) 둘 중의 하나의 타켓 보드에 J‐LINK나 ST‐LINK를 사용해서 펌웨어를 업로드 합니다. 

4) [ STM32_CSP_CAN v1.x ]\EWARMv6.1 폴더에서 boot_can_appl_ewarm_project.eww Workspace

파일을 엽니다. 

 

5) Configuration drop down메뉴에서 STM32F10X_MD_HD_NoBL을 선택 한 후 프로젝트를 빌드하고 

다른 하나의 보드에 펌웨어를 업로드 합니다. 디버깅 상태에서 통신이 잘 되는지 Watch창을 통해

서 st_can1_rx_msg0 , st_can1_rx_msg1을 확인 합니다.  

 

※ STM3210C_EVAL보드를 사용해서 CAN1,CAN2로 서로 통신하는 방법 

1) [ STM32_CSP_CAN v1.x ]\EWARMv6.1 폴더에서 boot_can_appl_ewarm_project.eww Workspace

Page 11: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 11 -

파일을 엽니다. 

 

2) Configuration drop down메뉴에서 STM32F10X_CL_NoBL을 선택 합니다. 

3) 프로젝트를  빌드하고  펌웨어를  업로드  한  후  디버그  상태에서  Watch창을  통해서 

st_can1_rx_msg0 , st_can1_rx_msg1을 확인 합니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Page 12: SAEMICHIPS STM32 Basic Extended CAN

SAEMICHIPS STM32 Basic Extended CAN www.saemichips.co.kr

작성 이메일 전화 PAGE

[email protected] 02-2026-5140 - 12 -

※ 1라인으로 Transceiver없이 통신하기 

STM32의 GPIO pin mode중에 Alternate Function open drain mode덕분에 1라인 CAN통신이 가능합

니다. 타 회사의 MCU도 Open drain설정이 있으면 될 것으로 생각 됩니다. 

 

일반적으로 CAN통신에는 SN65HVD230과 같은 CAN Transceiver가 필요 합니다만 Board내에서 MCU끼

리 통신 한다거나 비교적 노이즈가 없는 환경에서 가까운 거리의 통신이라면 Transceiver가 없어도 

CAN  통신이  가능  합니다.  CAN  Transceiver를  사용하는  경우라면  CAN  Tx  pin은  Alternate 

Function push‐pull로 설정을 합니다만, 1라인 통신을 위해서는 Alternate Function open drain

으로 설정하고 아래의 그림과 같이 MCU끼리 연결을 하면 통신이 가능합니다… 

 

 

                             3.3V 

 680 

       ……     

   STM32_1                 STM32_2           Other CAN MCU 1         Other CAN MCU n 

Tx와 Rx사이의 연결저항은 100K옴 정도를 사용. CAN BUS LINE의 Pull‐up저항은 거리가 멀수록 작아야

하나 GPIO Pin의 구동 전류도 생각해야 하므로 실험을 통해서 에러가 나지 않는 범위 내에서 정하면 됩

니다.