中国汽车工程师之家--聚集了汽车行业80%专业人士 

论坛口号:知无不言,言无不尽!QQ:542334618 

本站手机访问:直接在浏览器中输入本站域名即可 

搜索附件  
汽车工程师之家 附件中心 结构原理专业知识特区 『汽车控制器VCU/BMS/MCU/域控』 使用Simulink学习STM32-(7)CAN总线收发实验w23.jpg
左侧广告
附件中心&附件聚合2.0
For Discuz! X2.5 © hgcad.com

使用Simulink学习STM32-(7)CAN总线收发实验w23.jpg

 

使用Simulink学习STM32-(7)CAN总线收发实验:
前 言

       CAN总线以其高可靠性广泛应用与汽车总线通信、工业总线通信,STM32 CAN总线是STM32学习中的关键一环,根据笔者多年的经验而言学习CAN总线遇到的问题其中硬件问题占70%以上,这是因为专业的CAN总线调试设备贵,另外就是CAN总线对终端电阻和接线有严格要求,还有就是学习过程中很难有实际使用CAN总线的机会,这里需要大家特别引起重视。simulink针对CAN网络和数据有重点支持,如果能将STM32的CAN总线数据引入到simulink中,那对于很多数据的分析是非常有意义的。matlab针对STM32的CAN支持包暂时没有覆盖全部型号,ST的mat-target包存在诸多bug,且不再维护(维护到到2021 Q1季度),笔者踩了众多的坑,查看调试源码,终于经历半个多月在和大家的呼声中将CAN总线收发模型搭建出来了。
实验环境

Matlab版本:2018b

Target版本:en.stm32-mat_target5.6.0.zip

Visual Studio 版本:Community 2019

Keil软件版:5.27.0.0

操作系统:Win10专业版

硬件平台:YF-STM32-ALPHA 1R5

USB-CAN工具:开源PCAN模块和和谐版PCAN-View

实验内容:CAN总线数据收发实验



模型与原理图

本次CAN实验所用到的simulink模型如图5.2所示,CAN总线电路原理如图5.3所示,实验演示过程中通过USB-CAN设备给STM32发送数据并通过simulink硬件在环显示出来,同时STM32也往CAN总线上发送数据,如图5.1所示。



图5.1 CAN总线收发实验效果

??注 意:本实验中simulink工程(图5.2)不能去掉发送部分模型,否则接收部分无法正常工作,具体是什么原因引起的还在进一步查找中,另外必须使用USB-CAN往总线上发送数据整个模型才会工作,否则也不能发送数据,具体原因暂时还没找到,单独在CubeMx中将CAN总线配置为不中断接收,则可以单独使用CAN总线发送功能,后期笔者将再进一步探索使用非中断模式接收数据。


图5.2 CAN总线收发模型



图5.3 CAN总线中断接收数据显示模型

?温馨提示:YF-STM32-ALPHA 1R5硬件平台没有CAN总线通信接口模块,只留有GPIO口,可以通过外挂CAN接口转换模块(SN65HVD230,TJA1050,PCA82C251芯片型号都可以),如图5.5所示,注意模块供电电压。



图5.4 CAN总线通信原理图



图5.5 CAN总线转换接口模块

??小知识:关于CAN总线通信的硬件电路,针对很多读者实际使用过程中出的问题这里啰嗦几句。

      我们以往使用RS485总线时,也有120Ω终端电阻的概念,但是很多时候终端电阻没接或者接的不规范也不影响使用,但是在CAN总线通信过程中,这个终端电阻需要引起重点注意!!!少接,多接,终端电阻位置接的不对都有可能工作不正常,很多时候可能你的代码是对的,但是CAN总线就是不能通信,这是因为RS485总线没有严格的硬件校验功能,很多小的硬件错误或通信过程中波形异常大不了数据出一点点错误,但是还可以继续使用,但是CAN总线不一样,波形出错,或者数据校验错误,波特率不对都会导致其不能正常工作,排除故障后需要重新上电才能继续工作,有些控制器甚至带有软件故障检查保护功能。正确的接法是在整条总线靠近最远端的两个设备上接120Ω终端电阻,其它分支线不宜过长(<40cm,关于长度大家不要抬杠,可能你接长点也能正常工作)。



图5.4 CAN总线终端电阻位置



基础模型介绍与分析

CubeMx工程设置

       关于Cube工程创建大家可以参考其他文章,这里就不做过多介绍,在前面的文章中有介绍将“Timebase Source”设置为“TIM1”的,但是这里又将其重新设置为“SysTick”,如图5.5所示,因为这次使用的CubeMx版本为5.6.0。

?温馨提示:前面使用Matlab2021b + CubeMX6.2.0 + mat_target5.6.0也能实现硬件在环,但是后期经过深度使用和源代码溯源查看,发现问题特别多,所以这里还是建议如果想使用mat_target5.6.0版本学习的话,推荐使用CubeMx5.6.0 + Matlab2018b,这是官方的推荐,同时也是笔者在实际使用过程中遇到问题比较少的一个版本。



图5.5 "SYS"设置

        CAN总线默认使用PA11、PA12引脚,这里笔者使用的引脚为PB8,PB9,读者朋友也可以根据实际需求配置。



图5.6 CAN引脚配置

       CAN总线位于“APB1 peripheral clocks”上如图5.7所示,波特率设置如图5.7所示,波特率计算公式:时钟主频 / 分频 / (tq1 + tq2 + sjw),APB1时钟主频为36MHz=36000 000Hz,代入公式可以得到 波特率=36000000/9(5+2+1) = 500 000ps = 500Kps



图5.7 APB1总线时钟频率



图5.8 CAN波特率和通信模式设置

        这里用到了CAN总线的中断接收功能,所以将“USB low priority or CAN RX0 interrupts”勾选上,当然这里也可以选择勾选“CAN RX1 interrupts",这两个只选择勾选一个,如图5.9所示。



图5.9 CAN中断接收设置
Simulink模型设置

创建好simulink工程后,可以先对“Configuration Parameters”参数进行设置,“xxx.TLC”文件选择为“stm32.tlc”如图5.10所示。



图5.10 simulink工程配置中“Code Generation”设置

        在环工程设置与之前补充版文章基本差不多,只不过这里是2018b版本,如图5.11所示。



图5.11 在环通信接口设置

        此处比较关键,需要在“STM32 Project Files”中添加“can_message.h”头文件,这是mat-target包中提供的头文件,如图5.11所示,如果这一步忘记添加,编译过程中会报没有该头文件的错误,这时可以手动将该头文件复制过去也是可以的。



图5.12 “can_message.h”头文件添加

另外还需要再simulink主界面中选择为“External”,如图5.13所示。



图5.13 硬件在环设置为“External”
Simulink模型解释

        CAN发送数据相对来说比较简单,使用“constant”模型并将其设置为“uint8”,然后通过“mux”模型将8个数据汇聚到一起传输给“CAN Pack”模型打包成CAN数据包,最后通过“CAN_Send”模型将数据发送出去,如图5.14所示,“CAN Pack”中可以设置发送ID和数据长度,如图5.15所示。



图5.14 CAN发送数据模型



图5.15 "CAN Pack"设置

        CAN接收数据相对来说比较复杂,也是坑最多的,整体模型如图5.16所示,本实验中没有设置CAN总线ID过滤,如图5.17所示,“CAN_Receive”模型也是必须要添加的,这里可以不用设置保持默认即可,如图5.18所示。



图5.16 CAN中断方式数据接收模型



图5.17 CAN总线滤波设置



图5.18 “CAN_Receive”模型设置

"CAN_IT"中需要将“RX”勾选上,如图5.19所示。



图5.19 “CAN_IT”设置

        进入到中断处理函数中,这里面放置有“CAN_Read_Data”模型和"CAN Unpack"模型,当有外部CAN数据发送过来时会进入到该中断模型处理中,如图5.20所示,



图5.20“CAN_IT”中断处理模型

“CAN_Read_Data”模型设置如图5.21所示。



图5.21“CAN_Read_Data”设置

        “CAN Unpack”模型自定义信号模型方式如图5.22所示,使用业内标准的DBC文件方式定义信号如图5.23所示,关于这块的进一步使用方法会随着后期的文章不断丰富来给大家一一介绍。



图5.22 “CAN Unpack”模型自定义信号方式设置



图5.23 “CAN Unpack”使用“dbc”文件

??????重点注意:图5.24,图5.25,图5.26是CAN总线接收并在simulink中显示的非常关键的部分,笔者也是在此处卡了很多,通过查阅大量资料和试错才找到答案。??????



图5.24 "External"模型下使用"display"和“scope”设置

        图5.25中的“Duration”原始值为1000,ST官方推荐将其改为100才能正常通过“display”和"scope"显示数据。



图5.25 将“Duration”数据改为“100”

        这里应该是ST官方mat-target库的错误,笔者通过调试查看原来生成的代码一直无法进入到中断中去,必须参照图5.26添加“| CAN_IT_RX_FIFO0_MSG_PENDING”代码。



图5.26 添加“| CAN_IT_RX_FIFO0_MSG_PENDING”代码

完整代码如下:
    const uint32_t activeITs = CAN_IT_ERROR_WARNING|CAN_IT_ERROR_PASSIVE|   
             CAN_IT_LAST_ERROR_CODE| CAN_IT_ERROR | CAN_IT_RX_FIFO0_MSG_PENDING;
    if (HAL_CAN_ActivateNotification(&hcan, activeITs) != HAL_OK) {
      Error_Handler();
    }



总 结

       本篇简单的介绍了使用mat-target包方式在simulink上搭建CAN总线收发数据模型,并通过硬件在环方式将数据直观显示出来,关于CAN总线的重要性就不多说了,但是可以预见的是在未来相当长的一段时间内CAN在高实时,高可靠性场合将持续发光发热。另外如果读者朋友想深入学习CAN的话,建议大家去理解一下CAN总线出现的背景以及CAN总线数据格式的本质,给大家提点思路,可以从串口通信、RS232、RS485的出现顺序以及modbus协议方面去理解下,在笔者看来CAN总线是为了解决串口通信需要自己添加复杂协议,以及通信速度不高,且无法区分错误的情况下诞生的。


使用Simulink学习STM32-(7)CAN总线收发实验w23.jpg
         同一主题附件:
    使用Simulink学习STM32-(7)CAN总线收发实验w1.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w2.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w3.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w4.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w5.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w6.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w7.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w9.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w10.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w11.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w12.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w13.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w14.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w15.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w16.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w17.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w18.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w19.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w20.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w21.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w22.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w23.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w24.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w25.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w26.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w27.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w28.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w29.jpg
    使用Simulink学习STM32-(7)CAN总线收发实验w30.jpg

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 20-5-2024 07:15 , Processed in 0.262666 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.