安森美AMIS30663 CANBUS收发器
特性:
- 完全符合ISO 11898标准
- 高达1Mbit/s的传输速率
- 适合12V和24V的工业和汽车应用场景
- 低电磁辐射,扼流圈不再是必需的
- 低功耗模式,可通过总线唤醒
- 欠压锁定
- 增强的总线故障管理功能
- 接收端滤波
- 热关断
- 短路保护
- 保护总线引脚防止汽车环境中的瞬态干扰
在充电桩主控板上使用了两个
AMIS30663用于和车载BMS通信
主控为STM32,先用USB CAN测试CAN口是否正常
- //CAN1初始化
- int CAN1_Configuration(void)
- {
- unsigned char va=0;
- unsigned short int tempid[2];
- CAN_EXTID tempID;
- CAN_InitTypeDef CAN_InitStructure;
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
- CAN_DeInit(CAN1); //将CAN的外设寄存器设为默认值
- CAN_StructInit(&CAN_InitStructure); //将CAN的CAN_InitStructure的成员设为默认值
- CAN_InitStructure.CAN_TTCM = DISABLE; //禁止时间触发通信
- CAN_InitStructure.CAN_ABOM = ENABLE; //使能自动BUS-OFF管理
- CAN_InitStructure.CAN_AWUM = DISABLE; //禁止自动唤醒
- CAN_InitStructure.CAN_NART = ENABLE; //使能非自动传输模式
- CAN_InitStructure.CAN_RFLM = DISABLE; //禁止接收FIFO锁定模式
- CAN_InitStructure.CAN_TXFP = DISABLE; //禁止传输FIFO的优先级
- CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //工作模式:正常模式
- CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
-
- CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
- CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
- CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
- CAN_InitStructure.CAN_Prescaler = 40;
- if (CAN_Init(CAN1,&CAN_InitStructure) == CANINITFAILED) //设置CAN1 并查询是否成功
- {
- va=1;
- }
- CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //指定滤波模式
- CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //滤波器大小
- CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; //滤波器标识号高位
- CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; //滤波器标识号底位
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; //过滤器的屏蔽号高位
- CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; //过滤器的屏蔽号低位
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; //指定FIFO将被分配到的过滤器
- CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //启用过滤器
- CAN_FilterInit(&CAN_FilterInitStructure); //配置可以指定的接收滤波器
- CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //挂号中断,进入中断后读FIFO的报文函数释放报文清中断标志
- return va;
- }
复制代码
在中断中接收上位机发的数据,再转发给上位机
- u8 fla g ;
- Can Rxl4sg Rxl4essage;
- Can Txl1sg CAN2 Send ;
- void CAN1 _ RX0_ IRQHandler(void)
- {
- int i;
- CAN_Receive (CAN1, CAN_ FI FO0, &RxMessage);
- CAN2_Send . Stdid=RxMessage . Stdid ;
- CAN2_Send . Extid=RxMessage . Extid ;
- CAN2_Send . RTR=CAN_RTR_DATA;
- CAN2_Send . IDE=CAN_ ID_ EXT;
- CAN2_Send . DLC=8 ;
- for(i=0 ; i<8 ; i++)
- CAN2_Send . Data [i] =Rxl1essage . Data [i] ;
- CAN_Transmit (CAN1 , &CAN2_Send ) ;
- }
复制代码连接好电源,CAN和仿真器
打开CAN TEST,发送数据测试
BMS的数据通过CAN口采集处理后要通过网口发送给PLC,PLC控制DC充电模块给电池充电,所以我以测试了一下CAN口数据到网口的收发过程
TCPIP测试工具发的数据在CAN TEST上显示,CAN TEST发的数据在TCPIP测试工具上显示,完成CAN口数据到网口的收发过程