《振南电子STM32视频教程》第十三讲:CAN总线
- 格式:docx
- 大小:8.68 KB
- 文档页数:2
STM32的can现场总线实验心得最近在搞stm32实验板的can现场总线实验,之前只是搞过STC51的串口通信,相比之下,发觉can总线都挺复杂的。
开始时,知道自己是新手,只知道can总线跟串行通信,485通信,I2C通信一样都是用来传输数据通信的,对其工作原理一窍不通,还是从基础开始看书看资料,先了解它的基本原理吧。
原来can总线有以下特点:主要特点支持CAN协议2.0A和2.0B主动模式波特率最高可达1兆位/秒支持时间触发通信功能发送3个发送邮箱发送报文的优先级特性可软件配置记录发送SOF时刻的时间戳接收3级深度的2个接收FIFO14个位宽可变的过滤器组-由整个CAN共享标识符列表FIFO溢出处理方式可配置记录接收SOF时刻的时间戳可支持时间触发通信模式禁止自动重传模式16位自由运行定时器定时器分辨率可配置可在最后2个数据字节发送时间戳管理中断可屏蔽邮箱占用单独1块地址空间,便于提高软件效率看完这些特点后,疑问一个一个地出现,1.什么是时间触发功能?2.发送邮箱是什么来的?3.报文是什么来的?4.什么叫时间戳?5.什么叫接收FIFO?6.什么叫过滤器?好了,带着疑问往下看,看完一遍后,报文:报文包含了将要发送的完整的数据信息发送邮箱:共有3个发送邮箱供软件来发送报文。
发送调度器根据优先级决定哪个邮箱的报文先被发送。
接收过滤器:共有14个位宽可变/可配置的标识符过滤器组,软件通过对它们编程,从而在引脚收到的报文中选择它需要的报文,而把其它报文丢弃掉。
接收FIFO共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。
它们完全由硬件来管理工作模式bxCAN有3个主要的工作模式:初始化、正常和睡眠模式。
初始化模式*软件通过对CAN_MCR寄存器的INRQ位置1,来请求bxCAN进入初始化模式,然后等待硬件对CAN_MSR寄存器的INAK位置1来进行确认*软件通过对CAN_MCR寄存器的INRQ位清0,来请求bxCAN退出初始化模式,当硬件对CAN_MSR寄存器的INAK位清0就确认了初始化模式的退出。
《振南电子STM32视频教程》课时讲解介绍
《振南电子STM32视频教程》共14讲,本文详细讲解:每个课时的主要内容。
学习本套视频教程请复制以下链接到地址栏查看:
http:///emb/arm/20161009440169l
-------------------------------------------------------------------------------------------
●●●【第一讲】ARM处理器和STM32微控制器(37分钟)
(1) ARM处理器家族
-----ARM7系列介绍
-----ARM9系列介绍
-----ARM10和ARM11系列介绍
-----ARM Cortex系列介绍
(2)ARM Cortex-M3的应用介绍
(3)STM32微控制器
-----特征和资源讲解
-----管脚的配置灵活性讲解(即管脚的重映射功能)
-----微控制器功能框图讲解
(4)开发工具IAR EWARM介绍
(5)STM32微控制器最小系统
-----电源电路讲解(芯片电源功能块及开发板电源电路设计讲解)
-----时钟电路讲解(芯片时钟树及开发板时钟电路设计讲解)
-----复位电路讲解(芯片复位功能块及开发板手动和上电复位电路设计讲解)
-----启动配置电路讲解(芯片启动模式的讲解)
-----调试电路讲解(调试电路接口设计和所需仿真器讲解)
(6)STM32微控制器的应用领域介绍。
stm32 can控制器原理
STM32CAN控制器是一种用于控制器局域网(CAN)通信的微控制器。
它通常用于工业控制和汽车电子系统中。
CAN通信是一种高可靠性、高速度、多节点通信的协议,可以在工业环境和汽车电子系统中广泛应用。
STM32 CAN控制器具有多个硬件过滤器,可用于过滤接收的CAN 消息。
它还具有错误管理机制,可检测和纠正CAN总线上的错误。
STM32 CAN控制器还可以与其他芯片进行通信,如外部存储器、传感器等。
STM32 CAN控制器可以通过两种模式进行通信:基本CAN模式和FIFO模式。
基本CAN模式适用于低数据量和低速度的通信,而FIFO 模式适用于高速度和高数据量的通信。
在使用STM32 CAN控制器时,需要编写CAN驱动程序来配置控制器、发送和接收CAN消息。
通常使用C语言编写CAN驱动程序。
总之,STM32 CAN控制器是一种强大的工具,可用于控制器局域网通信。
它具有多个硬件过滤器、错误管理机制和通信模式,可在工业控制和汽车电子系统中广泛应用。
- 1 -。
STM32的CAN总线的标识符过滤器组使用注意事项CAN 总线的标识符过滤器很重要。
1. 标识符过滤器是用于接收的,发送的时候无需设置过滤器,这点一定要整明白。
根据发送端发送来的帧数据,通过标识符过滤器就可以设置仅接收需要接收的帧数据有效降低CPU 多余的处理时间。
2 什么是标识符?标识符主要包括如下,也可以简单的理解仅包含ID 号,但是在这里下面这些都是要包含的。
比如:数据帧和遥控帧,标识符就包含在其中,所以发送端发帧数据给接收端后,接收端就可以通过硬件标识符过滤器进行筛选,节省了CPU 时间:3. 下面就是最重要的,STM32 的CAN 总线标识符滤波器组包含两种实现方法:屏蔽位模式和标识符列表模式,这两种方式怎么理解呢,重点看下面的截图:书面上解释屏蔽位模式和标识符列表模式的区别屏蔽位模式在屏蔽位模式下,标识符寄存器和屏蔽寄存器一起,指定报文标识符的任何一位,应该按照必须匹配或不用关心处理。
标识符列表模式在标识符列表模式下,屏蔽寄存器也被当作标识符寄存器用。
因此,不是采用一个标识符加一个屏蔽位的方式,而是使用2 个标识符寄存器。
接收报文标识符的每一位都必须跟过滤器标识符相同。
===================================标识符的列表模式比较好理解,就是指的所有的过滤器寄存器位全部用于过滤,简单的说就是发送端发送的标识符所有的位必须跟接收端的滤波器寄存器定义一样。
有一个位定义不一样,拒收此消息。
比STM32F103 有14 个过滤器组,如果采用两个16 位的过滤器形式,那么就可以固定识别出14 * 4 = 56 个不同的标识符,实际使用中也够用了。
为什么是乘以4,注意看上面的截图,4 个16 位过滤器--标识符列表===================================屏蔽位模式要稍麻烦一些,我们以2 个16 位过滤器---标识符屏蔽为例进行。
*基金项目:西安工程大学研究生创新基金资助(chx100813)。
STM32的CAN 总线中继器设计及应用*潘铜,叶小荣,张娜,范建峰(西安工程大学电子信息学院,西安710048)摘要:CA N 中继器是系统组网的关键,通过中继器可以扩展节点的数量和实现不同波特率之间的通信。
本文充分利用ST M 32F105内部集成双bxCAN 控制器的特性,设计出一款基于ST M 32的单芯片CAN 总线中继器,并将其应用到齐玛印花机上。
实践证明该方法有效可行,不仅实现了齐玛印花机的改造,还降低了系统设备的成本。
关键词:CA N 总线;中继器;ST M 32F105;齐玛印花机中图分类号:T P336 文献标识码:ADesign an d Application of CAN Bus Repeater Based on STM32Pan Tong ,Ye Xiaorong ,Zhang Na ,Fan Jianfeng(Elect ronic Information College ,Xi 'an Polytechnic University ,Xi an 710048,China )Abstract :CAN repeater is the key to netw orking .The repeater can expand the num ber of nodes and realize communication betw een dif -ferent baud rates .M aking full use of internal integrated dual CAN controllers of S TM 32f105,the paper designs a single -chip CAN bus repeater based on STM32.The repeater can be applied to the Zimmer printing machine .The result proves that the method is effective and feasible ,not only realizing the transformation of Zimmer printing machine but also reducing the cost of system equipment .Key words :CAN bus ;repeater ;STM32F105;Zimmer printing machine引 言CAN 总线是一种多主方式的串行通信总线,具有优良的稳定性、实时性、远程通信能力以及超强的硬件CRC 纠错等特性;CAN 总线技术的应用不再仅限于汽车行业,而是扩展到了机械、纺织、控制等行业,并被公认为是最有前途的现场总线之一。
can总线-stm32⼀、什么是can总线?can总线因为使⽤电压差表⽰逻辑1和0,所以抗⼲扰性强,传播距离远(500kbps 时130M),⽐特率越⼩越远1.can有⼏根线? 2根,can_H,can_L2.can怎么表⽰1,0? can_H - can_L > 0.9V ,为逻辑 0,也称为显性电平。
can_H - can_L < 0.5v ,为逻辑1,也称为隐性电平。
⼀般can_H为3.5V , 2.5V⼀般can_L为2.5V ,1.5V⼆、stm32 怎么使⽤can总线1.can接⼝在哪? stm32有can总线控制器,以及有库函数stm32f10x_can.c可以驱动该控制器 但stm32只是有can总线控制器,要真正连接can总线,她还要外接can总线收发器,才能分出来can_H ,can_L,例如如下芯⽚: 这个芯⽚的主要作⽤是发送时根据TXD的电平来决定can_H 和can_L的电平,以及接收时根据can_H 和 can_L的电平差来决定RXD的电平。
2.can概念⼊门⽐较好的⽂档这个⽂档⽐较详细的介绍了can帧的类型,以及各个帧每个字节,每个bit的含义,以及优先级仲裁机制。
下⾯的例程是数据帧。
3.can例程。
1 #ifndef CAN_H_2#define CAN_H_3 #include "stm32f10x.h"4#define RCC_APBxPeriph_CAN_IO RCC_APB2Periph_GPIOA5#define CAN_RXD GPIO_Pin_116#define CAN_TXD GPIO_Pin_127#define CAN_IO GPIOA89enum canrate_e10 {11 CANRATE125K=125,12 CANRATE250K=250,13 CANRATE500K=500,14 CANNOTLINK,15 };1617enum canStdExt_e18 {19 CANSTD=0,20 CANEXT=1,21 };22struct canrxtx_s23 {24 CanRxMsg rxMessage[3];25 u8 rx_newflag;26 uint32_t f;27 CanTxMsg txMessage;2829 };3031/*std ID*/32#define CAN1_TX_STD_ID 0x7DF //11 Bits ID,Functional3334#define CAN1_TX_STD_ID_ECM 0x7E0 //11 Bits ECM ID,physical35#define CAN1_RX_STD_ID_ECM 0x7E8 //11 Bits ECM ID,physical36#define CAN1_RX_STD_Filter 0x7FF //11 bits ECM Filter3738/*extend ID*/39#define CAN1_TX_EXT_ID 0x18DB33F1 //29 Bits ID,Functional40#define CAN_Id_Extended_HONDA 0x18DBEFF1 //29 Bits ID,Functional HONDA41#endif1 #include "can.h"2 #include <string.h>3 u8 std_or_ext;4struct canrxtx_s canrxtx;5void CAN1_init(enum canrate_e canrate)6 {78 GPIO_InitTypeDef GPIO_InitStructure;9 CAN_InitTypeDef CAN_InitStructure;1011 RCC_APB2PeriphClockCmd(RCC_APBxPeriph_CAN_IO | RCC_APB2Periph_AFIO,ENABLE);12 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);13 GPIO_InitStructure.GPIO_Pin = CAN_RXD;14 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;15 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;16 GPIO_Init(CAN_IO, &GPIO_InitStructure);1718 GPIO_InitStructure.GPIO_Pin = CAN_TXD;19 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;20 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;21 GPIO_Init(CAN_IO, &GPIO_InitStructure);2223 CAN_DeInit(CAN1);24 CAN_StructInit(&CAN_InitStructure);2526 CAN_InitStructure.CAN_TTCM = DISABLE;27 CAN_InitStructure.CAN_ABOM = DISABLE;28 CAN_InitStructure.CAN_AWUM = DISABLE;29 CAN_InitStructure.CAN_NART = DISABLE;30 CAN_InitStructure.CAN_RFLM = DISABLE;31 CAN_InitStructure.CAN_TXFP = DISABLE;32 CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;33 CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;34 CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;35 CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;36//CAN BaudRate = 72MHz/(CAN_SJW+CAN_BS1+CAN_BS2)/CAN_Prescaler37if(canrate==CANRATE125K) /* 125KBps */38 CAN_InitStructure.CAN_Prescaler =96;39else if(canrate==CANRATE250K) /* 250KBps */40 CAN_InitStructure.CAN_Prescaler =48;41else/* 500KBps */42 CAN_InitStructure.CAN_Prescaler = 24;4344 CAN_Init(CAN1, &CAN_InitStructure);45 }4647void CAN1_ConfigFilter(u32 id1, u32 id2, u32 mask1, u32 mask2, u8 std_or_ext)48 {49 CAN_FilterInitTypeDef CAN_FilterInitStructure;50 NVIC_InitTypeDef NVIC_InitStructure;5152 CAN_FilterInitStructure.CAN_FilterNumber=1; //use which filter,0~1353 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;54if(std_or_ext == CANSTD)55 {56 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;57 CAN_FilterInitStructure.CAN_FilterIdHigh=id1<<5;58 CAN_FilterInitStructure.CAN_FilterIdLow=id2<<5;59 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=mask1<<5;60 CAN_FilterInitStructure.CAN_FilterMaskIdLow=mask2<<5;6162 }63else64 {65 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;66 CAN_FilterInitStructure.CAN_FilterIdHigh=(u16) (id1>>13);67 CAN_FilterInitStructure.CAN_FilterIdLow=(u16) (((id1&0x00001FFF)<<3)|CAN_Id_Extended|CAN_RTR_DATA);68 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=(u16) (mask1>>13);69 CAN_FilterInitStructure.CAN_FilterMaskIdLow=(u16) ((mask1&0x00001FFF)<<3);7071 }7273 CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;74 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;75 CAN_FilterInit(&CAN_FilterInitStructure);7677 NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;7879 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;80 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;81 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;82 NVIC_Init(&NVIC_InitStructure);8384 CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);85 }86/************************init******************************/87void init_demo()88 {89 std_or_ext = CANEXT;90 CAN1_init(CANRATE500K);91 CAN1_ConfigFilter(0x18DAF110,0x18DAF110,0x1FFFF100,0x1FFFF100,std_or_ext);//extend ID92 }93/************************tx******************************/94/*datalen<=8*/95int CAN1_TransASerialData(u8* pdata,u8 datalen)96 {97 u8 i=0;9899 Delay_ms(20);100101if(std_or_ext == CANEXT)102 {103 canrxtx.txMessage.StdId=0x00;104 canrxtx.txMessage.ExtId=CAN_Id_Extended_HONDA;//bentian105 canrxtx.txMessage.RTR=CAN_RTR_DATA;106 canrxtx.txMessage.IDE=CAN_Id_Extended;// 29 bits107108 }109if(std_or_ext== CANSTD)110 {111 canrxtx.txMessage.StdId=CAN1_TX_STD_ID;112 canrxtx.txMessage.ExtId=0x00;113 canrxtx.txMessage.RTR=CAN_RTR_DATA;114 canrxtx.txMessage.IDE=CAN_Id_Standard;//11 bits115 }116117 canrxtx.txMessage.DLC=0x08;118 canrxtx.txMessage.Data[0]=datalen;119 memcpy(&(canrxtx.txMessage.Data[1]),pdata,datalen);120121122while(((i++)<3)&&(CAN_TxStatus_NoMailBox==CAN_Transmit( CAN1,&canrxtx.txMessage)))123124if(i>=3) //timeout125 {126return (-1);127 }128129 canrxtx.rx_newflag=0;130return (0);131132 }133/************************rx******************************/134void CAN1_RX1_IRQHandler(void)135 {136 memset(&canrxtx.rxMessage,0,sizeof(CanRxMsg));137if(CAN_MessagePending(CAN1,CAN_FIFO0))138 {139 CAN_Receive(CAN1,CAN_FIFO0,&canrxtx.rxMessage[0]);140 }141 canrxtx.rx_newflag=1;142 }三、标识符过滤器的解释过滤器只是⽤于接收,判断某个报⽂是否能通过过滤器,过滤器初始化如下:53 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;56 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;57 CAN_FilterInitStructure.CAN_FilterIdHigh=id1<<5;58 CAN_FilterInitStructure.CAN_FilterIdLow=id2<<5;59 CAN_FilterInitStructure.CAN_FilterMaskIdHigh=mask1<<5;60 CAN_FilterInitStructure.CAN_FilterMaskIdLow=mask2<<5;stm32有0~13个过滤器组,每个过滤器组有两个32位的寄存器,通过设置下⾯两个结构体成员的值可以有四种组合:CAN_FilterMode和CAN_FilterScale四、关于邮箱如下图,发送3个邮箱,接收每个FIFO 3个邮箱,这是硬件⾃动管理的,软件不⽤管,只要判断发送成不成功,中断接收哪个FIFO就⾏了(要接收过滤器初始化时绑定的那个FIFO)。
STM32 CAN 过滤器、滤波屏蔽器配置总结下面容为:一、在STM32互联型产品中,CAN1和CAN2分享28个过滤器组,其它STM32F103xx系列产品中有14个过滤器组,用以对接收到的帧进行过滤。
1、过滤器组每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。
这些过滤器相当于关卡,每当收到一条报文时,CAN要先将收到的报文从这些过滤器上"过"一下,能通过的报文是有效报文,收进相关联FIFO(FIFO1或FIFO2),不能通过的是无效报文(不是发给"我"的报文),直接丢弃。
(标准CAN的标志位长度是11位。
扩展格式CAN的标志位长度是29。
CAN2.0A协议规定CAN控制器必须有一个11位的标识符。
CAN2.0B协议中规定CAN控制器的标示符长度可以是11位或29位。
STM32同时支持CAN2.0A/CAN2.0B 协议。
)每组过滤器组有两种工作模式:标识符列表模式和标识符屏蔽位模式。
标识符屏蔽位模式:可过滤出一组标识符。
此时,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。
标识符列表模式:可过滤出一个标识。
此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。
注意:CAN_FilterIdHigh是指高16位CAN_FilterIdLow是低16位应该将需要得到的帧的和过滤器的设置值左对齐起。
所有的过滤器是并联的,即一个报文只要通过了一个过滤器,就是算是有效的。
按工作模式和宽度,一个过滤器组可以变成以下几中形式之一:(1) 1个32位的屏蔽位模式的过滤器。