你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

游名:Stm32F3+CA-IS3050 隔离CAN设计参考原理图/PCB图/教程/源...  

[复制链接]
mmuuss586 发布时间:2020-3-12 16:30

基于Stm32F3+CA-IS3050 隔离CAN设计参考原理图/PCB图/教程/源码等开源分享

资料下载见附件的,电脑登入
QQ图片20200312162812.png
一、概述
    控制器区域网络(CAN)物理层收发器芯片采用了高速、高隔离耐压、低环路延时的高性价比的隔离式收发器CA-IS3050,此器件采用片上二氧化硅(SiO2) 电容作为隔离层,在 CAN 协议控制器和物理层总线之间创建一个完全隔离的接口,与隔离电源一起使用,可隔绝噪声和干扰并防止损坏敏感电路。
CA-IS3050 可为 CAN 协议控制器和物理层总线分别提供差分接收和差分发射能力,信号传输速率最高可达 1Mbps。该器件具有限流、过压和接地损耗保护(–40 V至 40 V)以及热关断功能, 可防止输出短路,
共模电压范围为–12 V 至 12 V。CA-IS3050 额定温度范围为–40°C 至 125°C, 提供宽体SOIC-16 封装。
1 R% T* m# @& r* w. H4 }! N
引脚配置和引脚功能描述如下图:
1.png

: {% f2 f. y/ T+ ?

CA-IS3050 datasheet_cn_revision.0(隔离CAN).pdf

下载

1.85 MB, 下载次数: 55

CAN通信例程.zipx.gz

下载

11.37 MB, 下载次数: 183

QBD1044 datasheet 2019-11-4(1).pdf

下载

509.29 KB, 下载次数: 34

基于Stm32F3 CA-IS3050 隔离CAN设计参考原理图PCB图教程源码等开源分享.pdf.pdf

下载

682.4 KB, 下载次数: 54

游名科技产品目录(2020-7-21).pdf

下载

1.05 MB, 下载次数: 14

收藏 5 评论73 发布时间:2020-3-12 16:30

举报

73个回答
mmuuss586 回答时间:2020-3-12 16:46:03
首先是CAN过滤器的配置函数,
' F# C# t7 Y4 x% R& d/***********************CAN通信发送函数***************************/  G+ O$ t8 D# B" Q" C: N' L
void CAN_TxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef * pTxHeader, uint8_t aData[], uint8_t DLC)
5 b5 e( _% f& }2 W4 j! [{  [# U$ O$ b" ]! ~- D
    uint32_t Tx_MailBox;
9 Q# K5 z) K7 ~& n9 y    pTxHeader->DLC    =    DLC;
1 T7 F7 u7 b* D- v8 ~. ^# Q7 }    while(HAL_CAN_AddTxMessage(hcan, pTxHeader, aData, &Tx_MailBox) != HAL_OK)' _* d2 L  B9 J6 G$ t+ k. d( @) w8 C2 E
    {
- i7 W1 \" W/ ]9 k7 {        printf("TxMsg Failed!!");
: O0 J) F1 U2 {& Y% l3 j; m                                HAL_Delay(100);2 \/ c/ ?: x$ U* }
    }4 Z4 `4 Q" g/ ]3 `0 c8 r% `
    printf("\nSend Tx Message Success!!Tx_Mail:%d", Tx_MailBox);  v# m* `/ j1 L; \
3 j, M' @" y/ q) T* q2 b
}
& a6 ?; ?; S! _1 y: ]) ~8 p9 t5 G; J4 D, x: p
void User_CAN1_TxMessage(uint8_t aTxData[], uint8_t DLC)" w9 P9 ?' L: K$ m( d5 V# {1 u
{; c4 G; K; }. u7 G
        CAN_TxMessage(&hcan, &hCAN1_TxHeader, aTxData, DLC);
/ N( ^/ s+ V& e8 M/ P}
) o" p2 p7 h) R4 ?7 s% \( U: b2 o' [. V  }1 M
/*********************** CAN启动测试函数****************************/! \) ]. s# W! i+ X( f* t
void CAN_Configuration(CAN_TxHeaderTypeDef    * pTxHeader,
# ~& r" P( r1 K) L5 f+ t5 j, {7 C                                                                        CAN_FilterTypeDef     * pFilter,
" @& T6 d5 y5 k# Y. l% {                                                                        uint32_t                StdId,
( S4 P3 V* Q3 f3 H, @                                                                        uint32_t                ExtId,
3 g5 e! f% R& B% A4 ?6 l                                                                        uint32_t                IDE,
& Z5 p+ U! a- O! {' \$ d                                                                        uint32_t                RTR, $ k- J5 E) S$ Z& O+ W
                                                                        uint32_t                DLC,
# e5 l* Y  B* P7 P6 E                                                                        uint32_t                IdHigh,
  f3 q$ f3 P7 K" v/ i  z                                                                        uint32_t                IdLow,
7 L) |4 Y( ?" H3 {% y3 A                                                                        uint32_t                MaskIdHigh,
5 N* T# e4 t1 k  ~& `" p( m                                                                        uint32_t                MaskIdLow,
1 @- k4 Q+ _8 R) d: y; v, q$ e# B                                                                        uint32_t           FIFOAssignment,
3 F( b& X; W6 b  l) r8 T+ @                                                                        uint32_t                Bank,9 A+ m& s6 W( T) o. A
                                                                        uint32_t                Mode,; p! y& r" z+ R( J3 \5 g
                                                                        uint32_t                Scale,
0 G& K, q/ h7 V0 i                                                                        uint32_t                Activation,
& M/ Q1 c' F- b* M. P- J                                                                        uint32_t         SlaveStartFilterBank)8 r2 l& z% Q4 ]/ d6 x7 u  j" I
{! P# z, {, l* n' n# [* q
    CAN_TxHeader_Init(pTxHeader, StdId, ExtId, IDE, RTR, DLC);
. b  [* r( `& w4 D- u3 f4 k    3 \" Z4 y) M1 q) i) p. N; I% B' g- n
    CAN_Filter_Init(pFilter, IdHigh, IdLow, MaskIdHigh, MaskIdLow, FIFOAssignment, Bank, Mode, Scale, Activation, SlaveStartFilterBank);+ _+ _2 H; j: E
    HAL_CAN_ConfigFilter(&hcan, pFilter);
0 v/ J) j9 X" [" V, K8 n    5 I. n  h! L6 j+ j- l
    while(HAL_CAN_Start(&hcan) != HAL_OK )3 j4 o; M1 N; v5 U9 H4 \: A
    {
' G. f/ e/ [/ v: C% T        printf("\nCAN_Start Failed!!");% ?+ L& M8 I" L- e
                                HAL_Delay(100);* Z5 f7 ^7 w$ W7 @
    }
6 |$ m( a: n" ~' p8 ]$ c1 d    printf("\nCAN_Start Success!!");
" {' v2 C! i4 d7 h$ m3 s+ T/ r" z& b( y
    HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
. F* \3 d, w3 o! d}) X5 g- }: B* Q! X
mmuuss586 回答时间:2020-3-12 16:45:36
按照公式计算,我们用的是1Mbps的波特率在通信,hcan.Init.Mode用来设置单片机工作模式(普通模式(CAN_MODE_NORMAL)和回环模式(CAN_MODE_LOOPBACK)等)。我们这里设置普通模式; P4 Q8 Y9 L. h; \1 ?- ?
然后添加如下几个功能函数:
1 |1 A: Y: r, o* Pvoid CAN_Filter_Init(CAN_FilterTypeDef * pFilter,- x$ z2 W# U; H# f& ?
                                                                                                        uint32_t IdHigh,6 q# q! w& {6 X) d! g& I8 h" o
                                                                                                        uint32_t IdLow,
- U: A3 |4 q; H, y: k2 u3 Q4 ^                                                                                                        uint32_t MaskIdHigh,
& Z7 ^5 B6 H  h# O+ m                                                                                                        uint32_t MaskIdLow,
) `) K7 @9 E5 X: \. [, {+ I" o                                                                                                        uint32_t FIFOAssignment,
0 U) g7 o( h- z( {- d, [3 Z                                                                                                        uint32_t Bank,. Y( L' L4 @- |5 m
                                                                                                        uint32_t Mode,: I8 H/ [2 o9 ~+ }! u1 s; ~: \
                                                                                                        uint32_t Scale,
; f" V( ^5 U. U2 }                                                                                                        uint32_t Activation,/ f9 q) r. x9 Y; q: {' s
                                                                                                        uint32_t SlaveStartFilterBank)
" k( U7 `: ]- d0 K{* j! f" u$ ^3 R3 h2 h3 w; T
    pFilter->FilterIdHigh         = 0;           //32 位 ID2 z$ _3 `, |: U2 u
    pFilter->FilterIdLow          = 0;
7 X9 @" l% e( g    pFilter->FilterMaskIdHigh     = 0;             //32 位 MASK
# G, S( N; e6 B: P    pFilter->FilterMaskIdLow      = 0;
+ `4 ^: U9 \. G7 s& f9 z6 Y2 x    pFilter->FilterFIFOAssignment = CAN_FILTER_FIFO0;   // FIFO06 J1 M) g- M0 e1 z, @1 ?) E: i
    pFilter->FilterBank           = 0;8 A2 @4 Q  q& T- Q0 S; y) r& E, ?
    pFilter->FilterMode           = CAN_FILTERMODE_IDMASK;
  k0 g) }8 _% Z& V" |    pFilter->FilterScale          = CAN_FILTERSCALE_32BIT;  //32 位
2 A7 ~" _- D7 D' B/ X    pFilter->FilterActivation     = ENABLE;          // //激活过滤器 0( e1 v4 T  e0 l1 h* g8 F0 g  H2 F
    pFilter->SlaveStartFilterBank = 0;
$ ^1 ^  Z+ k) M; f$ {% |2 b}- o2 M. O, Z* h, a, A' n; ^
mmuuss586 回答时间:2020-3-12 16:43:50
三、软件设计
6 m. L3 N6 x2 u9 W  p        在Cube MX中将基本的串口配置和CAN通信的基础配置好后生成Keil 5工程并使用Keil 5打开对应工程;" a2 I# o" C2 V& r4 n# c7 l6 A
在can.c文件下,最开始添加三个宏定义,由于新版HAL库取消了TXheader的初始化,这里需要自行添加想关初始化;如下:3 X+ w& g  X9 S/ b) F6 ^
CAN_TxHeaderTypeDef hCAN1_TxHeader;) o5 _3 U8 S4 ^) M3 r
CAN_RxHeaderTypeDef hCAN1_RxHeader;: {7 |  C. w. g5 {4 t- ?
CAN_FilterTypeDef hCAN1_Filter;1 c% f5 Z0 ^( U0 v4 R* U% E
6 M  L+ R6 B: z; }5 h# F7 H9 c
void CAN_TxHeader_Init(CAN_TxHeaderTypeDef    * pHeader,# w$ u9 \% }3 ?: v5 n0 T& K- N
uint32_t          StdId, 7 D: w, s& x. T5 ?: S# D
                                                                uint32_t          ExtId,
9 A$ v7 O% J4 k9 v  d                                                                uint32_t          IDE,
; S" s1 f# m' e  w" c                                    uint32_t          RTR,
8 V5 I4 {( r; g0 |  W' G                                   uint32_t          DLC)# b9 _6 X  x  k2 k
{
2 n" _& L7 \, W, t& s' E    pHeader->StdId    = StdId;   ) b0 T) U% I( m( ]+ i6 c9 _0 n
    pHeader->ExtId    = ExtId;   
6 `9 w2 Q5 F+ u! b, A    pHeader->IDE      = IDE;     3 ~) E9 G" W& u6 }, I
    pHeader->RTR      = RTR;     ; E% c! B  Y) }5 J
    pHeader->DLC      = DLC;     
8 b! B5 g8 k( q' S9 I" E    pHeader->TransmitGlobalTime    =    ENABLE;5 b, J$ y+ A" I. a
}
5 a& ^  B) X* s, K4 ?. R1 D7 k0 p/ ?. [4 X
void MX_CAN_Init(void)% x! y8 r' J$ e. v* f- D8 J
{
5 X- T# F+ }7 n. t6 Q+ k; p% q7 l2 O
  hcan.Instance                                         = CAN;# ~# F3 S2 d7 W* H9 |- A* Y8 p6 y% m! @
  hcan.Init.Prescaler                         = 6;& U4 l2 Y' I8 `2 P0 g
  hcan.Init.Mode                                         = CAN_MODE_NORMAL;2 E% V. E5 A0 i% {7 M" u: `
  hcan.Init.SyncJumpWidth                = CAN_SJW_1TQ;
- K- [: B2 G( j; r% O& p6 L  hcan.Init.TimeSeg1                         = CAN_BS1_9TQ;9 g8 f5 R/ @) N0 k  x
  hcan.Init.TimeSeg2                         = CAN_BS2_2TQ;9 V& O: R; B* A! D4 Z
  hcan.Init.TimeTriggeredMode         = DISABLE;* Z9 H4 i: H1 |8 \* }% v
  hcan.Init.AutoBusOff                         = DISABLE;9 p' |, B, _$ t# s$ [& g
  hcan.Init.AutoWakeUp                         = DISABLE;' B' ]! @* w6 V: T+ e
  hcan.Init.AutoRetransmission         = DISABLE;
2 r9 c6 h5 Z0 X. u8 s, X! {. R( M  hcan.Init.ReceiveFifoLocked         = DISABLE;
3 p$ H: C8 X9 G- x* E; Z# K  hcan.Init.TransmitFifoPriority= DISABLE;
3 C9 x3 Q( h3 L0 v! y/ H1 y  if (HAL_CAN_Init(&hcan) != HAL_OK)
( c- D7 J) S, E  {
& y% t( p2 t, g4 B( l% z/ S    Error_Handler();7 C+ M5 [- j# A; K9 W: K
  }
! X4 v0 b4 L3 K1 w6 N: P% ?4 A}
+ H1 y3 h8 z" D9 h
mmuuss586 回答时间:2020-3-12 16:34:51
                              
1.png
图2 引脚功能描述
1 N9 ?% V, Q: ~# `6 F
mmuuss586 回答时间:2020-3-12 16:36:02
该芯片具有凉薄的保护功能:
9 ]' `& ]+ b! V" B4 t/ y8 i4 W7 j信号隔离:CA-IS3050 信号隔离是通过基于电容隔离方案的数字隔离器实现的, 在逻辑侧通过数字隔离器采用开关键控(On-OffKey, OOK)调制方式将输入信号调制到高频然后通过起隔离耐压作用的片上二氧化硅电容,在总线侧数字隔离器部分电路将接收到的信号恢复然后转换成符合标准的电平输出至 CAN 总线。同理,总线侧的电平被总线侧电路处理后同样通过数字隔离器调制到高频然后传输回逻辑侧,然后在逻辑侧解调恢复输出至 RXD。逻辑侧和总线侧的地完全可以分开,并通过片上二氧化硅电容实现高达 5 kVRMS 的隔离耐压等级,确保了实际使用时微控制器和高压总线之间信号传输的完整性和安全性。8 p; ^" ?( k  h: Y# f
主动态超时功能:CA-IS3050 具有主动态超时功能,防止 TXD 因为软件或者硬件故障一直被下拉到低电平,造成总线持续进入主动态从而被锁死(阻断整个网络通信)。 主动态超时功能通过使用一个计数器,在 TXD 输入信号的负边沿发生期间被触发,当 TXD 的低电平持续时间长于主动态超时时间 tTXD_DTO 时,收发器会被关断,此时总线被释放并进入被动态。在 TXD输入信号的正边沿期间,计数器会被置位。
  `( s$ ~# h- }2 Y' V热关断保护功能:CA-IS3050 集成有热关断保护功能,可在过温情况下对器件内部电路进行保护。如果器件的结温超过热关断温度TJ(shutdown), 驱动器会被关断,从而阻断 TXD 到总线的信号传输路径,典型的热关断温度为 165°C。 当器件结温低于热关断温度后,驱动器会被重新使能。
, ?+ i( o$ ]# P限流保护:CA-IS3050 集成有限流保护功能,可防止总线侧输出短路至电源或地瞬间过流对器件造成损坏,注意限流保护一旦发生会产生较大的电流,从而带来较大损耗。
  g3 W7 D% v2 Y( @- V
mmuuss586 回答时间:2020-3-12 16:36:58
二、硬件设计
    模块原理图如下图:
1.png 2.png
原理图主要分为隔离电源部分和CAN通信隔离部分;隔离电源主要是通过3510微功率隔离式反激式转换器和变压器将VDD1=3V转换为VDD2=5V,然后CAN模块就可以正常通信。接线图如下表:     
  
设备1
  
CAN通信模块1
CAN通信模块2
设备2
CAN_TX
CAN_TX
CANH
CANH
CAN_TX
CAN_RX
CAN_RX
CAN_RX
CANL
CANL
CAN_RX
CAN_TX
) `  A3 K$ N  C' n! t- s2 l$ @
通信模块最好共地
6 y0 [# f, L; A
mmuuss586 回答时间:2020-3-12 16:38:35
参考PCB图及3D显示:
3 ~- N- u1 Z2 |) t$ F- f. [+ m7 M5 r& i

# _# ?. t7 ?' Z; o5 X( M1 v
1.png
2.png
3.jpg
mmuuss586 回答时间:2020-3-12 16:40:54
模块如下图
& O; w, C1 v* l, U) k% ~ 1.jpg
1 m: W0 A5 z8 n! f 2.jpg
- o+ f4 U2 @# D( B$ k% u
mmuuss586 回答时间:2020-3-12 16:41:30
补充说明:
有条件的最好对CAN接口加保护,电路参考如下图:
1.png

' v' t* J% b" F. {7 g
mmuuss586 回答时间:2020-3-12 16:43:27
要是对成本比较敏感,可以参考如下方案:数字隔离器(或光耦)+CAN芯片(可选择国产的QBD1044:1元多些);
1.png
+ k0 j) [& z4 w( r; G5 o" X; ?
mmuuss586 回答时间:2020-3-12 16:45:03
在初始化函数中,这四个参数hcan.Init.Prescaler, hcan.Init.SyncJumpWidth, hcan.Init.TimeSeg1,hcan.Init.TimeSeg2用来配置CAN通信波特率,CA-IS3050支持传输速率最高可达 1Mbps,即我们既可以用通用的500Kbps通信也可以用1Mbps进行通信,计算公式为:
  }9 H+ x& ^% ~5 v! B  D通信波特率=SYSCLK/(Prescaler*(SyncJumpWidth+TimeSeg1+TimeSeg2))
mmuuss586 回答时间:2020-3-12 16:46:27
//启动测试函数主要为测试单片机CAN功能是否能正常启动,启动成功与否通过串口发送出来,方便我们观测,所以需要包含usart.h文件;# Q  C: B  s$ g& s
配置完成后,在stm32f3xx_it.c文件中添加CAN接收中断函数,, U) ~0 f9 p' u7 r/ U0 u% `
void CAN_RX1_IRQHandler()
, Y6 K( x5 u% B# F{# m/ _  V3 {2 ?( N+ ?' P0 Z
        HAL_CAN_RxFifo0MsgPendingCallback(&hcan);6 d9 E8 f5 L" a2 _; c) h: {
}0 K+ Y& v) `4 X3 S  T9 D% D- p
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
; c& ?3 J  \9 q, D- F$ d8 U  K# x{: |( }7 w6 A& z
    uint8_t aRxData[8], i;
1 q/ m  D8 t/ F9 D0 R" X    if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &hCAN1_RxHeader, aRxData) == HAL_OK), z1 N: E7 F8 i) Y, E! t* K! ]5 [
    {! H1 ]5 l+ i1 F4 O& r; r3 z& W1 C3 y
        printf("\nGet Rx Message Success!!\nData:");- Y4 _0 v. j/ n; @
        for(i=0; i<8; i++)
* E" o- h& V) R# P: x0 w" _# _            printf("%x ", aRxData[i]);
) x' Q) U  d" q$ g- h: E    }
  b3 D4 V  T& S0 A7 G: y}
5 Q% g- T- z. W- E5 d) ?
mmuuss586 回答时间:2020-3-12 16:46:54
中断服务函数中首先用if确定是否接收到数据,若没有接收到数据直接退出,接收到则使用串口将对应数据打印;由于我们在main函数中的发送数据为16进制数据,打印也用16进制数据打印,更便于观察;' V% H0 J  _% O1 U
最后为main.c文件内容
) j0 g7 ^) r/ Y# y) E" Bint main(void)- Q' ]3 L& x: r: K+ G& {
{0 k8 j" k+ c4 u3 J/ h" \; H( F9 e+ h
uint8_t TxData[8] = {0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89};
1 G! a( V) t9 y5 T4 m  HAL_Init();
# l% K* y  X8 _! J. {/ w( I# I  SystemClock_Config();4 ?% M$ t. [: m9 a
  MX_GPIO_Init();
7 N: M4 m" K0 K+ n; d  MX_CAN_Init();5 C: }. L6 B/ K: e' r
  MX_USART1_UART_Init();5 D- g8 K) R  s! z4 A, T
__HAL_CAN_ENABLE_IT(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING); //CAN中断使能函数& Y. U2 M; p. z0 x& I
  User_CAN_Configuration();- j* S6 R0 ~( f! `3 J. K
  while (1)+ D: R- E4 U  c7 k* b, p2 J1 |8 g
  {
$ \1 s' u7 b7 f  I/ c! G5 K- O        User_CAN1_TxMessage(TxData, 8);
7 _( Y2 e3 h, S" s        HAL_Delay(1000);
) [5 O! Z2 Q6 p1 F& K% V8 }: Z  }
0 `' G5 k/ j% _" f! e4 G, C}
( w: }* q0 n5 h; ~! D
mmuuss586 回答时间:2020-3-12 16:47:11
在main函数中,只要是对CAN通信的中断使能,只能之后前面写的中断服务函数才能正常起作用2 P0 X4 r9 u1 \7 x8 B
实验结果:% _% }8 C0 ^( V
程序编译成功后,下载到板卡,两块板卡其中一块可以将main.c的while中的User_CAN1_TxMessage(TxData, 8);函数屏蔽掉,专门用来接收数据,另一个则每隔1秒发送一次数据,打开两个串口通信助手,就可以看到如下信息;  N8 \, c9 x6 ?' \& J
12345下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版