基于Stm32F3+CA-IS3050 隔离CAN设计参考原理图/PCB图/教程/源码等开源分享 资料下载见附件的,电脑登入 一、概述 控制器区域网络(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 封装。 & M# n/ ?2 F* p( i2 ] H+ ^引脚配置和引脚功能描述如下图: |
CA-IS3050 datasheet_cn_revision.0(é离CAN).pdf
下载1.85 MB, 下载次数: 54
CANéä¿¡ä¾ç¨.zipx.gz
下载11.37 MB, 下载次数: 181
QBD1044 datasheet 2019-11-4(1).pdf
下载509.29 KB, 下载次数: 33
åºäºStm32F3 CA-IS3050 é离CAN设计åèåçå¾PCBå¾æç¨æºç çå¼æºå享.pdf.pdf
下载682.4 KB, 下载次数: 53
游åç§æ产åç®å½ï¼2020-7-21ï¼.pdf
下载1.05 MB, 下载次数: 13
/***********************CAN通信发送函数***************************/" x. l/ H" R# x9 I, H
void CAN_TxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef * pTxHeader, uint8_t aData[], uint8_t DLC)
{
uint32_t Tx_MailBox;
pTxHeader->DLC = DLC;: y# F" n' g" Y/ L; ~
while(HAL_CAN_AddTxMessage(hcan, pTxHeader, aData, &Tx_MailBox) != HAL_OK)
{; y7 H" f! e! j( |; K0 [# |; w, c7 B
printf("TxMsg Failed!!");
HAL_Delay(100);6 a$ S$ J3 r- p+ q2 m7 }6 c( |
}2 n, L, J, [& s- V! {, r" [" }+ ?
printf("\nSend Tx Message Success!!Tx_Mail:%d", Tx_MailBox);
}
void User_CAN1_TxMessage(uint8_t aTxData[], uint8_t DLC)
{, ~- \; E$ a) U8 P0 e% u
CAN_TxMessage(&hcan, &hCAN1_TxHeader, aTxData, DLC);8 W6 c9 K$ y# X6 x0 T9 A C9 i" E
}" ?; C2 b6 ~. R, @7 |
/*********************** CAN启动测试函数****************************/
void CAN_Configuration(CAN_TxHeaderTypeDef * pTxHeader,
CAN_FilterTypeDef * pFilter,. r8 t4 L0 f+ c' d
uint32_t StdId,
uint32_t ExtId,
uint32_t IDE, 2 L: q( j- }' t# X: F; r
uint32_t RTR,
uint32_t DLC,
uint32_t IdHigh,5 v; ]6 {5 X0 y: p
uint32_t IdLow,- ]' L Z) ~; z
uint32_t MaskIdHigh,6 b/ K0 x2 [. ]2 ]& f
uint32_t MaskIdLow,* \. L5 G8 ?8 P% \8 D# ?5 |
uint32_t FIFOAssignment,/ ?. b. Q" ~ @( Z2 y5 X2 [% ~* M
uint32_t Bank,4 A2 {9 }+ Y% C9 o4 R
uint32_t Mode,
uint32_t Scale," v' a' }) v+ o& ]' ~1 }" {
uint32_t Activation,4 B' W) S6 a. c6 A! n) |3 E
uint32_t SlaveStartFilterBank)
{
CAN_TxHeader_Init(pTxHeader, StdId, ExtId, IDE, RTR, DLC);
CAN_Filter_Init(pFilter, IdHigh, IdLow, MaskIdHigh, MaskIdLow, FIFOAssignment, Bank, Mode, Scale, Activation, SlaveStartFilterBank);
HAL_CAN_ConfigFilter(&hcan, pFilter);
# E: P+ N5 G% D) z- g% c8 ]
while(HAL_CAN_Start(&hcan) != HAL_OK )5 g% r( [+ w+ ]! L4 _0 }* K3 L
{1 }4 `( @5 |2 h' @" V" i- J3 G
printf("\nCAN_Start Failed!!");( d. i- A$ O- e
HAL_Delay(100);
}
printf("\nCAN_Start Success!!");+ p) L0 N7 J, e; J$ n
* X8 b4 O) y3 G/ J" K7 P
HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
}4 B, G7 a c. z& v
然后添加如下几个功能函数:* H; \0 G8 Z1 H* u
void CAN_Filter_Init(CAN_FilterTypeDef * pFilter,
uint32_t IdHigh,
uint32_t IdLow,9 N' P* a( R) l4 C: U8 ^# f0 V
uint32_t MaskIdHigh,* L2 Z3 I4 U/ M. D
uint32_t MaskIdLow,5 B9 w/ l- A+ E4 h$ T6 I
uint32_t FIFOAssignment,
uint32_t Bank,
uint32_t Mode,
uint32_t Scale,
uint32_t Activation,
uint32_t SlaveStartFilterBank)" \+ J! c' c7 ]: ]
{# _+ j0 y/ K8 a, e
pFilter->FilterIdHigh = 0; //32 位 ID m* C5 Y+ B: B
pFilter->FilterIdLow = 0;
pFilter->FilterMaskIdHigh = 0; //32 位 MASK
pFilter->FilterMaskIdLow = 0;) R* a) S- Z3 y( V3 E& A; N
pFilter->FilterFIFOAssignment = CAN_FILTER_FIFO0; // FIFO0: x9 }9 J( w3 C
pFilter->FilterBank = 0;1 O: n- t' W' \5 |/ r: S, m) L) ^
pFilter->FilterMode = CAN_FILTERMODE_IDMASK;9 g8 ^# S: }" {: p; v! P
pFilter->FilterScale = CAN_FILTERSCALE_32BIT; //32 位
pFilter->FilterActivation = ENABLE; // //激活过滤器 0
pFilter->SlaveStartFilterBank = 0;7 N2 ^1 m% V6 n6 ]6 R( |
}, y- ]% y* ~4 o8 m- \. j1 {
在Cube MX中将基本的串口配置和CAN通信的基础配置好后生成Keil 5工程并使用Keil 5打开对应工程;
在can.c文件下,最开始添加三个宏定义,由于新版HAL库取消了TXheader的初始化,这里需要自行添加想关初始化;如下:
CAN_TxHeaderTypeDef hCAN1_TxHeader;- m! Z. M/ L7 B/ x
CAN_RxHeaderTypeDef hCAN1_RxHeader;
CAN_FilterTypeDef hCAN1_Filter;
void CAN_TxHeader_Init(CAN_TxHeaderTypeDef * pHeader,5 o+ D4 b* S& f
uint32_t StdId, ' D; E/ N6 f5 a: J% s- @ _- R$ u5 \
uint32_t ExtId,
uint32_t IDE, : T9 e2 ~1 U3 ~; Z
uint32_t RTR, - v; h; P/ u- N5 J: v9 l" T
uint32_t DLC)
{
pHeader->StdId = StdId; 2 t7 A" l H& \0 n) A
pHeader->ExtId = ExtId;
pHeader->IDE = IDE; ; V' |* H; N5 p" o( N
pHeader->RTR = RTR;
pHeader->DLC = DLC;
pHeader->TransmitGlobalTime = ENABLE;
}
void MX_CAN_Init(void)
{
q( j. v& }" {. T
hcan.Instance = CAN;
hcan.Init.Prescaler = 6;2 s' {3 B& N2 w/ E' J2 \
hcan.Init.Mode = CAN_MODE_NORMAL;( J, J7 M6 J. m. u" D% G
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_9TQ;) p) F2 {4 Q5 n# S" L
hcan.Init.TimeSeg2 = CAN_BS2_2TQ;5 J- l) K8 I# E( U v
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = DISABLE;: @* g8 s0 K( l, F, P
hcan.Init.AutoWakeUp = DISABLE;& c- X4 b$ Y; Z6 L
hcan.Init.AutoRetransmission = DISABLE;
hcan.Init.ReceiveFifoLocked = DISABLE;* |7 p3 y- d. e. m1 v7 G T
hcan.Init.TransmitFifoPriority= DISABLE;9 z- r: ^, P# j
if (HAL_CAN_Init(&hcan) != HAL_OK)
{! R; z/ t4 \6 c
Error_Handler();
}
} v5 J7 B) f8 n! J$ {2 ^
信号隔离:CA-IS3050 信号隔离是通过基于电容隔离方案的数字隔离器实现的, 在逻辑侧通过数字隔离器采用开关键控(On-OffKey, OOK)调制方式将输入信号调制到高频然后通过起隔离耐压作用的片上二氧化硅电容,在总线侧数字隔离器部分电路将接收到的信号恢复然后转换成符合标准的电平输出至 CAN 总线。同理,总线侧的电平被总线侧电路处理后同样通过数字隔离器调制到高频然后传输回逻辑侧,然后在逻辑侧解调恢复输出至 RXD。逻辑侧和总线侧的地完全可以分开,并通过片上二氧化硅电容实现高达 5 kVRMS 的隔离耐压等级,确保了实际使用时微控制器和高压总线之间信号传输的完整性和安全性。
主动态超时功能:CA-IS3050 具有主动态超时功能,防止 TXD 因为软件或者硬件故障一直被下拉到低电平,造成总线持续进入主动态从而被锁死(阻断整个网络通信)。 主动态超时功能通过使用一个计数器,在 TXD 输入信号的负边沿发生期间被触发,当 TXD 的低电平持续时间长于主动态超时时间 tTXD_DTO 时,收发器会被关断,此时总线被释放并进入被动态。在 TXD输入信号的正边沿期间,计数器会被置位。
热关断保护功能:CA-IS3050 集成有热关断保护功能,可在过温情况下对器件内部电路进行保护。如果器件的结温超过热关断温度TJ(shutdown), 驱动器会被关断,从而阻断 TXD 到总线的信号传输路径,典型的热关断温度为 165°C。 当器件结温低于热关断温度后,驱动器会被重新使能。& a6 B4 H s- R) L$ [/ F
限流保护:CA-IS3050 集成有限流保护功能,可防止总线侧输出短路至电源或地瞬间过流对器件造成损坏,注意限流保护一旦发生会产生较大的电流,从而带来较大损耗。! o4 J5 N# Y1 C
通信波特率=SYSCLK/(Prescaler*(SyncJumpWidth+TimeSeg1+TimeSeg2))
配置完成后,在stm32f3xx_it.c文件中添加CAN接收中断函数,1 D, \: g1 d0 W0 {3 h' R0 @
void CAN_RX1_IRQHandler()& A8 Z# M" r$ l+ t \
{
HAL_CAN_RxFifo0MsgPendingCallback(&hcan);
}* R) S, }" }' R/ J6 f
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)0 Z% L% k% _! w5 c( G, a2 u3 o7 q( L
{
uint8_t aRxData[8], i;' _' m9 l7 H! Z- }- h2 Z
if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &hCAN1_RxHeader, aRxData) == HAL_OK)
{# m- J# Z. ]5 { F* w
printf("\nGet Rx Message Success!!\nData:"); D5 L: Y( U( S0 b9 r* A4 V
for(i=0; i<8; i++) v- T( ]' z* ~) A6 }
printf("%x ", aRxData[i]);0 k3 X5 @* R/ s- H+ j% Y
}. |/ v; D& D3 I ?' g
}( j; ]4 Y6 E9 h$ ~- _' g$ ~
最后为main.c文件内容! Q. ^' }& i. J
int main(void)
{
uint8_t TxData[8] = {0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89};: Y; P& v, T% D/ h) b
HAL_Init();
SystemClock_Config();
MX_GPIO_Init(); p. I! R' Y8 ]( i& A7 r" D( R
MX_CAN_Init();
MX_USART1_UART_Init();2 X Y% G6 H" n5 L
__HAL_CAN_ENABLE_IT(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING); //CAN中断使能函数
User_CAN_Configuration();6 e& M$ n& L( N. P
while (1)
{# K$ \( D6 [7 q
User_CAN1_TxMessage(TxData, 8);
HAL_Delay(1000);! U) f7 o. y+ Q9 g- u; j
}
}! F0 `: T; y Y& n
实验结果: z$ k$ W3 X4 v/ F
程序编译成功后,下载到板卡,两块板卡其中一块可以将main.c的while中的User_CAN1_TxMessage(TxData, 8);函数屏蔽掉,专门用来接收数据,另一个则每隔1秒发送一次数据,打开两个串口通信助手,就可以看到如下信息;