|
基于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 封装。 引脚配置和引脚功能描述如下图:
|
微信公众号
手机版
信号隔离:CA-IS3050 信号隔离是通过基于电容隔离方案的数字隔离器实现的, 在逻辑侧通过数字隔离器采用开关键控(On-OffKey, OOK)调制方式将输入信号调制到高频然后通过起隔离耐压作用的片上二氧化硅电容,在总线侧数字隔离器部分电路将接收到的信号恢复然后转换成符合标准的电平输出至 CAN 总线。同理,总线侧的电平被总线侧电路处理后同样通过数字隔离器调制到高频然后传输回逻辑侧,然后在逻辑侧解调恢复输出至 RXD。逻辑侧和总线侧的地完全可以分开,并通过片上二氧化硅电容实现高达 5 kVRMS 的隔离耐压等级,确保了实际使用时微控制器和高压总线之间信号传输的完整性和安全性。
主动态超时功能:CA-IS3050 具有主动态超时功能,防止 TXD 因为软件或者硬件故障一直被下拉到低电平,造成总线持续进入主动态从而被锁死(阻断整个网络通信)。 主动态超时功能通过使用一个计数器,在 TXD 输入信号的负边沿发生期间被触发,当 TXD 的低电平持续时间长于主动态超时时间 tTXD_DTO 时,收发器会被关断,此时总线被释放并进入被动态。在 TXD输入信号的正边沿期间,计数器会被置位。
热关断保护功能:CA-IS3050 集成有热关断保护功能,可在过温情况下对器件内部电路进行保护。如果器件的结温超过热关断温度TJ(shutdown), 驱动器会被关断,从而阻断 TXD 到总线的信号传输路径,典型的热关断温度为 165°C。 当器件结温低于热关断温度后,驱动器会被重新使能。
限流保护:CA-IS3050 集成有限流保护功能,可防止总线侧输出短路至电源或地瞬间过流对器件造成损坏,注意限流保护一旦发生会产生较大的电流,从而带来较大损耗。
在Cube MX中将基本的串口配置和CAN通信的基础配置好后生成Keil 5工程并使用Keil 5打开对应工程;
在can.c文件下,最开始添加三个宏定义,由于新版HAL库取消了TXheader的初始化,这里需要自行添加想关初始化;如下:
CAN_TxHeaderTypeDef hCAN1_TxHeader;
CAN_RxHeaderTypeDef hCAN1_RxHeader;
CAN_FilterTypeDef hCAN1_Filter;
void CAN_TxHeader_Init(CAN_TxHeaderTypeDef * pHeader,
uint32_t StdId,
uint32_t ExtId,
uint32_t IDE,
uint32_t RTR,
uint32_t DLC)
{
pHeader->StdId = StdId;
pHeader->ExtId = ExtId;
pHeader->IDE = IDE;
pHeader->RTR = RTR;
pHeader->DLC = DLC;
pHeader->TransmitGlobalTime = ENABLE;
}
void MX_CAN_Init(void)
{
hcan.Instance = CAN;
hcan.Init.Prescaler = 6;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_9TQ;
hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
hcan.Init.AutoBusOff = DISABLE;
hcan.Init.AutoWakeUp = DISABLE;
hcan.Init.AutoRetransmission = DISABLE;
hcan.Init.ReceiveFifoLocked = DISABLE;
hcan.Init.TransmitFifoPriority= DISABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
Error_Handler();
}
}
通信波特率=SYSCLK/(Prescaler*(SyncJumpWidth+TimeSeg1+TimeSeg2))