一.CAN简介

CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,是国际上应用最广泛的现场总线之一。

CAN控制器通过组成总线的2根线(CAN-H和CAN-L)的电位差来确定总线的电平,信号是以两线之间的“差分”电压形式出现,总线电平分为显性电平和隐性电平。

CAN总线采用两种互补的逻辑数值"显性"和"隐性"。"显性"数值表示逻辑"0",而"隐性"表示逻辑"1"。当总线上同时出现“显性”位和“隐性”位时,最终呈现在总线上的是“显性”位。

在“隐性”状态下,VCAN_H和VCAN_L被固定与平均电压电平,Vdiff近似为零,此时VCAN_H和VCAN_L的标称值为2.5V。

“显性”位以大于最小阀值的差分电压表示,此时VCAN_H的标称值为3.5V,VCAN_L的标称值为1.5V。

本实验采用SN65HVD230芯片作为CAN收发器,其逻辑电路图以及管脚图如下。D为CAN发送,R为CAN 接收。CAN-H,CAN-L为CAN总线。CAN收发器即将TTL电平转换为CAN总线电平。

  

在总线空闲时,所有的单元都可开始发送消息(多主控制)。所有的消息都以固定的格式发送。

二.CAN帧结构

报文传输由以下4个不同的帧类型所表示和控制:

数据帧:数据帧携带数据从发送器至接收器。

远程帧:总线单元发出远程帧,请求发送具有同一识别符的数据帧。

错误帧:任何单元检测到一总线错误就发出错误帧。

帧间空 :数据帧(或远程帧)通过帧间空间与前述的各帧分开。

过载帧:过载帧用以在先行的和后续的数据帧(或远程帧)之间提供一附加的延时。

1.数据帧

数据帧由7个不同的域组成。

(1)帧开始(Start of Frame)

这个域表示数据帧的开始。仅由一个“显性”位组成.

(2)仲裁域(Arbitration Frame)

这个域表示一个帧的优先级,仲裁场由标识符和远程发送请求位(RTR位)组成。RTR位在数据帧中为显性,在远程帧中为隐性。

IDE的全称是“识别符扩展位(Identifier Extension Bit)”,对于扩展格式,IDE位属于仲裁场;对于标准格式,IDE位属于控制场。标准格式的IDE位为“显性”,而扩展格式的IDE位为“隐性”。

(3)控制域(Control Frame):

这个域表示保留位和数据帧长度代码(DLC),控制场由6个位组成,标准格式和扩展格式的控制场格式不同。标准格式里的帧包括数据长度代码、IDE位及保留位r0。扩展格式里的帧包括数据长度代码和两个保留位:r1和r0。

(4)数据域(Data Frame):

这是数据内容,0~8个字节的数据能被发送,首先发送最高有效位。

(5)CRC域(CRC Frame):

这个域用于检查帧的传输错误。

(6)ACK域(CRC Frame):

是对帧已经被正常接收的一个证实。应答场长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimiter)

(7)帧结束(End of Frame):

指示数据帧结束,这个标志序列由7个“隐性”位组成

2.远程帧

作为接收器的节点,可以通过向相应的数据源节点发送远程帧激活该源节点,让该源节点把数据发送给接收器。而且都由6个不同的位场组成:帧起始、仲裁场、控制场、CRC场、应答场、帧结尾。与数据帧相反,远程帧的远程发送请求位(RTR)是“隐性”的。它没有数据场,数据长度代码DLC的数值可以是任意值。

3.错误帧

错误帧由两个不同的场组成,

(1) 错误标志

主动(Active)错误标志。它由6个连续显性位组成。

被动(Passive)错误标志。它由6个连续隐性位组成。

(2)错误界定:错误界定符由8个隐性位组成。

4.帧间空间

帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。

过载帧和错误帧前不能插入帧间隔。

5.过载帧

过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。

(1) 过载标志 6个位的显性位。  过载标志的构成与主动错误标志的构成相同。

(2) 过载界定符 8个位的隐性位。  过载界定符的构成与错误界定符的构成相同。

三.  波特率

CAN控制器只需进行少量设置就可以进行通信,其中较难设置部分就是波特率计算。CAN总线的波特率是一个范围。假如波特率为250KB/s,实际波特率可能为200~300KB/s.这样使得CAN总线有很强大容错性。

CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多时间段(Tscl),这些时间段包括:

A. 同步段(SYNC_SEG):位变化应该在此时间段内发生。只有一个时间片的固定长度(1 x tq)

B. 位段1(BS1):定义采样点的位置。其持续长度可以在 1 到 16 个时间片之间调整

C. 位段2(BS2):定义发送点的位置。其持续长度可以在 1 到 8 个时间片之间调整

D.同步跳转宽度(SJW):定义位段加长或缩短的上限。它可以在 1 到 4 个时间片之间调整

这个结合STM32cubeMX软件设置讲解一下CAN的波特率设置。

上面设置分频为Prescaler=9, BS1=5, BS2=6, SJW=1

CAN外接是接到APB1上面,设置系统时钟为216MHz时,APB1外设时钟为54MHz.

经过分频后的频率为54MHz / 9 =6MHz  = ~ 166.666ns

CAN波特率为 54MHz / 9 / (SJW+BS1 +BS2 ) = 54MHz /9 /12 = 500KHz = 2000ns

四. 标识符筛选

在CAN通信中接收到信息时,接收器节点会根据标识符的值来判断信息是否需要,若不需要则丢弃信息。

五.新建工程

复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置,开启CAN1,CAN2,管脚配置如下。

CAN1,CNA2只需配置时间参数,波特率为500KHz,其他为默认不作修改。

生成报告以及代码,编译程序。在can.c文件中可以看到CAN初始化函数。在stm327xx_hal_can.h文件后面可以看到CAN操作函数。

在main.c文件前面添加变量,sFilterConfig为CAN滤波器结构体变量,TxMessage,RxMessage分别存储CAN发送和接收的消息。

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

CAN_FilterConfTypeDef sFilterConfig;

static CanTxMsgTypeDef TxMessage;

static CanRxMsgTypeDef RxMessage;

/* USER CODE END PV */

在main函数中,初始化发送消息邮箱,设置为标准数据帧,数据长度为8个字节,数据为“CAN Test"。设置滤波器。

/* USER CODE BEGIN 2 */

hcan2.pTxMsg = &TxMessage;

hcan1.pRxMsg = &RxMessage;

printf("**** This is CAN test program ****\r\n\r\n");

/*##-1- Configure CAN2 Transmission Massage #####################################*/

hcan2.pTxMsg->StdId = 0x123;

hcan2.pTxMsg->RTR = CAN_RTR_DATA;

hcan2.pTxMsg->IDE = CAN_ID_STD;

hcan2.pTxMsg->DLC = 8;

hcan2.pTxMsg->Data[0] = 'C';

hcan2.pTxMsg->Data[1] = 'A';

hcan2.pTxMsg->Data[2] = 'N';

hcan2.pTxMsg->Data[3] = ' ';

hcan2.pTxMsg->Data[4] = 'T';

hcan2.pTxMsg->Data[5] = 'e';

hcan2.pTxMsg->Data[6] = 's';

hcan2.pTxMsg->Data[7] = 't';

/*##-2- Configure the CAN1 Filter ###########################################*/

sFilterConfig.FilterNumber = 0;

sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;

sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;

sFilterConfig.FilterIdHigh = 0x0000;

sFilterConfig.FilterIdLow = 0x0000;

sFilterConfig.FilterMaskIdHigh = 0x0000;

sFilterConfig.FilterMaskIdLow = 0x0000;

sFilterConfig.FilterFIFOAssignment = 0;

sFilterConfig.FilterActivation = ENABLE;

sFilterConfig.BankNumber = 14;

HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig);

/* USER CODE END 2 */

在while循环中添加应用程序,CAN2发送信息给CAN1接收,正确接收到信息后打印输出。

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

/*##-3- Start the CAN2 Transmission process #####################################*/

if(HAL_CAN_Transmit(&hcan2, 10) != HAL_OK)

{

/* Transmition Error */

Error_Handler();

}

if(HAL_CAN_GetState(&hcan2) != HAL_CAN_STATE_READY)

{

Error_Handler();

}

/*##-4- Start the CAN1 Reception process ########################################*/

if(HAL_CAN_Receive(&hcan1, CAN_FIFO0,10) != HAL_OK)

{

/* Reception Error */

Error_Handler();

}

if(HAL_CAN_GetState(&hcan1) != HAL_CAN_STATE_READY)

{

Error_Handler();

}

printf("StdId : %x\r\n",hcan1.pRxMsg->StdId);

printf("RxMsg : %s",hcan1.pRxMsg->Data);

printf("\r\n\r\n");

HAL_Delay(1000);

}

/* USER CODE END 3 */

编译程序并下载到开发板。将两个 SN65HVD230 CAN Board模块分别连接到板上的 CAN1 和 CAN2 接口。 用杜邦线连接两个 CAN 模块(CANL -> CANL, CANH -> CANH)。打开串口调试助手,设置波特率为115200,按下复位串口助手上面会显示如下信息。

can硬件滤波 stm32cubemx_STM32CubeMX系列教程12:控制器局域网络(CAN)相关推荐

  1. STM32 基础系列教程 12 – ADC 中断

    前言 学习stm32 adc模数转换接口使用,学会用STM32对模拟信号时行采样,通过中断模式得到ADC结果. 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM ...

  2. 玩转RT-Thread系列教程(12)--WIFI模组的使用

    玩转RT-Thread系列教程(12)–WIFI模组的使用 本章节也是最有意思的章节,我将带你手把手物联网,让你直观的感受RTT软件包的便捷以及强大之处! 一.添加at_device软件包 1.1.配 ...

  3. 用Altium Designer,AD不专业-EDA工具的选择-PCB系列教程1-2

    绘制PCB需要用到EDA(Electronic design automation,电子设计自动化)工具,这个工具简单来说,就是个画图软件,跟PhotoShop差不多.我原以为,提交给板厂的设计文件应 ...

  4. Hyper-V 2016 系列教程12 Hyper-V 体系结构

    以下内容部分摘自微软官网: Hyper-V 是基于虚拟机监控程序的虚拟化技术,适用于某些 x64 版本的 Windows. 虚拟机监控程序是虚拟化的核心. 它是特定于处理器的虚拟化平台,允许多个独立的 ...

  5. 【TypeScript系列教程12】Number对象的基本使用

    目录 TypeScript Number 语法 Number 对象属性 JavaScript NaN 实例 prototype 实例 Number 对象方法 TypeScript Number Typ ...

  6. go 修改结构体方法_「GCTT 出品」Go 系列教程——26. 结构体取代类

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Go 支持面向对象吗? Go 并不是完全面向对象的编程语言.Go 官网的 FAQ 回答了 Go 是否是面向对象语言,摘 ...

  7. go 自定义error怎么判断是否相等_「GCTT 出品」Go 系列教程——30. 错误处理

    Go语言中文网,致力于每日分享编码.开源等知识,欢迎关注我,会有意想不到的收获! Go 系列教程是非常棒的一套初学者教程,入门就它了. 这是 Golang 系列教程中的第 30 篇.在本章教程中,我们 ...

  8. 【视频教程】帝国CMS制作网站系列教程14—标签模板及标签讲解

    作为一个程序员,搭建一个自己的博客网站是件非常容易的事情,但是作为很多非程序员非计算机专业的学习者来讲,可能就需要花点时间进行学习,而如果你想通过自学来学习怎么制作一个属于自己的网站的话,那这套帝国C ...

  9. 【视频教程】帝国CMS制作网站系列教程16—帝国CMS总结

    作为一个程序员,搭建一个自己的博客网站是件非常容易的事情,但是作为很多非程序员非计算机专业的学习者来讲,可能就需要花点时间进行学习,而如果你想通过自学来学习怎么制作一个属于自己的网站的话,那这套帝国C ...

最新文章

  1. 我是如何在3个月内写出博士论文的?
  2. 阿里、腾讯基本薪资曝光,资深算法工程师24万美元,高级研究员26万美元
  3. Python 中re.split()方法
  4. 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...
  5. Jerry的通过CDS view + Smart Template 开发Fiori应用的blog合集
  6. openstreetmap地图下载的几种方法
  7. 计算长方体、四棱锥的表面积和体积_JAVA
  8. java apktool if_apktool使用教程
  9. Autovue 版本有关的几个问题
  10. 前端证券项目_富途证券WEB前端团队招募令
  11. OpenStack——nove组件部署
  12. 桌面计算机图标怎样优化,桌面图标怎么变小,详细教您电脑桌面图标的太大怎么调小...
  13. HTML 显示系统时间
  14. ASP.NET MVC4 音乐商店,Entity Framework 5.0
  15. Daily Pathtracer!安利下不错的Pathtracer学习资料
  16. uCOS-III 基础
  17. 用ado打开Excel文件时报外部表不是预期的格式的解决方法
  18. LE AUDIO介绍
  19. 我本将心向明月,奈何明月照沟渠_百度百科
  20. 法蒂玛机器人_通讯:执著追梦机器人的阿富汗女孩

热门文章

  1. 数学不好的人可以学python吗_哪些人适合学金融工程专业 数学不好能学吗
  2. JAVA数据库访问设置的实验_实验十一 连接数据库实验(V2.0)
  3. python 结束子线程并保证工作完成_python3中在线程中结束工作进程的方法
  4. 太阳的光和灯光有什么区别_墙体彩绘机UV(油性)和水性墨水怎么选择?有什么区别?...
  5. python单例模式的五种实现方式
  6. 3种python调用其他脚本的方法,你还知道其他的方法吗?
  7. Python练习题:计算平均分
  8. python性能测试方法_Python实现测试磁盘性能的方法
  9. html div标签的 class属性是干嘛用的?
  10. tensorflow教程 开始——Premade Estimators(预制评估器)