STM32学习之利用一个板子进行CAN通信并进行回环模式(一个板子的自收自发并用串口显示)

目录

  • 概述
    • 具体原理
      • 优先级的判断
        • 关于ID号以及掩码模式
      • 波特率
      • 实战例子

概述

CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO国际标准化的串行通信协议。
在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统 被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很 多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个 LAN,进行大量数据的高速通信”的需 要,1986 年德国电气商博世公司开发出面向汽车的 CAN 通信协议。此后,CAN 通过 ISO11898 及 ISO11519 进 行了标准化,现在在欧洲已是汽车网络的标准协议。 现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。

STM32学习之利用一个板子进行CAN通信并进行回环模式(一个板子的自收自发并用串口显示)区分每一帧的方法就是利用不同的时许来发送不同的数据,时序图如下。
而这里面最重要的就是数据帧
数据帧由 7 个段构成。
(1) 帧起始
表示数据帧开始的段。
(2) 仲裁段
表示该帧优先级的段。
(3) 控制段
表示数据的字节数及保留位的段。
(4) 数据段
数据的内容,可发送 0~8 个字节的数据。
(5) CRC 段
检查帧的传输错误的段。
(6) ACK 段
表示确认正常接收的段。
(7) 帧结束
表示数据帧结束的段。
STM32学习之利用一个板子进行CAN通信并进行回环模式(一个板子的自收自发并用串口显示)遥控帧
STM32学习之利用一个板子进行CAN通信并进行回环模式(一个板子的自收自发并用串口显示)错误帧和过载帧
STM32学习之利用一个板子进行CAN通信并进行回环模式(一个板子的自收自发并用串口显示)关于显性和隐性电平
总线上的电平有显性电平和隐性电平两种。 总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。
“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐 性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强。)

优先级的判断

说到通信协议的时候,一定会出现,两个数据同时需要CAN进行传输的情况,这个时候就需要来对两个数据进行优先级判断,看谁先发谁后发

STM32学习之利用一个板子进行CAN通信并进行回环模式(一个板子的自收自发并用串口显示)
#include "can.h"#include "led.h"#include "delay.h"#include "usart.h" //CAN初始化//tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq//tbs2:时间段2的时间单元.   范围:CAN_BS2_1tq~CAN_BS2_8tq;//tbs1:时间段1的时间单元.   范围:CAN_BS1_1tq ~CAN_BS1_16tq//brp :波特率分频器.范围:1~1024;  tq=(brp)*tpclk1//波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);//mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,4,CAN_Mode_LoopBack);//则波特率为:36M/((8+9+1)*4)=500Kbps//返回值:0,初始化OK;// 其他,初始化失败; u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode){ 	GPIO_InitTypeDef 		GPIO_InitStructure; 	CAN_InitTypeDef        	CAN_InitStructure;	CAN_FilterInitTypeDef  	CAN_FilterInitStructure;#if CAN_RX0_INT_ENABLE 	NVIC_InitTypeDef  		NVIC_InitStructure;#endif	//使能PORTA时钟	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	    											 	//使能CAN1时钟	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//复用推挽	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		//初始化IO	GPIO_Init(GPIOA, &GPIO_InitStructure);				GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;	//上拉输入	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;		//初始化IO	GPIO_Init(GPIOA, &GPIO_InitStructure);				//CAN单元设置	CAN_InitStructure.CAN_TTCM=DISABLE;			//非时间触发通信模式  	CAN_InitStructure.CAN_ABOM=DISABLE;			//软件自动离线管理	 	CAN_InitStructure.CAN_AWUM=DISABLE;			//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)	CAN_InitStructure.CAN_NART=ENABLE;			//禁止报文自动传送 	CAN_InitStructure.CAN_RFLM=DISABLE;		 	//报文不锁定,新的覆盖旧的  	CAN_InitStructure.CAN_TXFP=DISABLE;			//优先级由报文标识符决定 	CAN_InitStructure.CAN_Mode= mode;	      //模式设置: mode:0,普通模式;1,回环模式; 	//设置波特率	CAN_InitStructure.CAN_SJW=tsjw;				//重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位  CAN_SJW_1tq	 CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq	CAN_InitStructure.CAN_BS1=tbs1; 			//Tbs1=tbs1+1个时间单位CAN_BS1_1tq ~CAN_BS1_16tq	CAN_InitStructure.CAN_BS2=tbs2;				//Tbs2=tbs2+1个时间单位CAN_BS2_1tq ~	CAN_BS2_8tq	CAN_InitStructure.CAN_Prescaler=brp;        //分频系数(Fdiv)为brp+1		CAN_Init(CAN1, &CAN_InitStructure);        	//初始化CAN1 	//过滤器初始化,掩码模式	CAN_FilterInitStructure.CAN_FilterNumber=0;	//过滤器0	CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 	//屏蔽位模式,设置为掩码模式	CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; 	//32位宽 	//过滤器配置,能通过的标准ID号	CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;	//32位ID			CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;			//屏蔽器配置,接收到的ID号需要严格检测的位,否则不能通过	CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x00fF;//32位MASK	0表示此位不关心	CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;		CAN_FilterInitStructur

来源:暮尘依旧

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年6月25日
下一篇 2020年6月25日

相关推荐