基于stm32的can总线实验
- 格式:pdf
- 大小:225.66 KB
- 文档页数:10
一、介绍STMicroelectronics的STM32F470微处理器系列是一款性能强大的32位ARM Cortex-M4微控制器,具有丰富的外设和高度集成的特点。
其中,CAN2外设是其重要的通信接口之一,用于在汽车电子、工业控制和其它领域中实现可靠的数据传输。
本文将介绍如何在STM32F470微控制器上进行CAN2的开发,为读者提供完整的开发例程。
二、硬件准备在进行CAN2开发前,首先需要准备好硬件评台。
通常情况下,可以选择ST提供的开发板,例如STM32F4DISCOVERY或NUCLEO-F429ZI。
如果需要自行设计板子,可以使用STM32F470微控制器配合外部电路进行开发。
三、软件配置1. 硬件抽象层(HAL)库的使用使用STM32CubeMX软件进行初始化配置,打开CAN2外设,并根据具体需求进行参数设置,生成相应的初始化代码。
2. HAL库函数的调用在生成的初始化代码中,通过调用HAL库提供的函数来对CAN2进行初始化,包括设置波特率、过滤器设置等操作。
3. 中断配置根据具体的需求,可以选择轮询模式或中断模式来处理CAN2的数据接收和发送。
四、CAN2的初始化1. 初始化CAN2外设通过调用HAL_CAN_Init()函数对CAN2进行初始化,设置波特率、工作模式等参数。
2. 接收过滤器设置调用HAL_CAN_ConfigFilter()函数来配置CAN2的接收过滤器,筛选出需要接收的数据帧。
五、CAN2的数据收发1. 数据发送调用HAL_CAN_AddTxMessage()函数向CAN2发送数据帧,可以选择阻塞模式或非阻塞模式。
2. 数据接收在中断模式下,通过HAL_CAN_RxFifo0MsgPendingCallback()函数来处理CAN2接收到的数据帧。
六、错误处理和调试1. 错误处理根据需要,通过调用HAL_CAN_ErrorCallback()函数来处理CAN2通信中的错误情况。
STM32扩展6路CAN简介STM32是一款由STMicroelectronics公司推出的32位ARM Cortex-M系列微控制器。
它具有高性能、低功耗和丰富的外设资源,被广泛应用于各种嵌入式系统中。
其中,CAN(Controller Area Network)是一种常用的通信协议,用于在嵌入式系统中实现设备之间的高速通信。
本文将介绍如何通过扩展6路CAN来进一步增强STM32的通信能力。
我们将详细介绍扩展6路CAN的硬件连接和软件配置,以及如何在STM32上编写代码实现CAN通信。
硬件连接在扩展6路CAN之前,首先需要确认所选的STM32开发板是否支持CAN功能。
如果不支持,可以考虑更换支持CAN功能的开发板。
扩展6路CAN需要使用外部CAN模块来实现。
常用的外部CAN模块有MCP2515和SN65HVD232,它们可以通过SPI或UART接口与STM32连接。
具体的硬件连接方式取决于所选的外部CAN模块和STM32开发板的引脚分配。
通常,外部CAN模块的连接方式如下:1.将外部CAN模块的VCC引脚连接到STM32开发板的3.3V电源引脚。
2.将外部CAN模块的GND引脚连接到STM32开发板的地引脚。
3.将外部CAN模块的CS引脚(如果有)连接到STM32开发板的某个GPIO引脚,用于片选信号。
4.将外部CAN模块的SCK引脚连接到STM32开发板的SPI时钟引脚。
5.将外部CAN模块的MISO引脚连接到STM32开发板的SPI MISO引脚。
6.将外部CAN模块的MOSI引脚连接到STM32开发板的SPI MOSI引脚。
7.将外部CAN模块的INT引脚(如果有)连接到STM32开发板的某个GPIO引脚,用于中断信号。
请注意,具体的硬件连接方式可能因外部CAN模块和STM32开发板的型号而异。
在进行硬件连接之前,请务必仔细查阅外部CAN模块和STM32开发板的引脚定义和连接方式。
软件配置在进行软件配置之前,需要确保已经安装了适用于STM32的开发环境,例如Keil MDK或STM32CubeIDE。
第05期刘大鹏:基于S T M32单片机的C A N-U S B转换器设计基于STM32单片机的CAN-USB转换器设计刘大鹏(中国软件评测中心,物联网促进中心,北京,100048)摘 要:随着人们对资源的消耗以及由此带来的环境污染,而引发社会的广泛关注,新能源汽车技术发展也由此受到青睐。
在新能源汽车中,电动车电池性能及电量的准确测量与显示是电池技术的重要一部分。
本系统以STM32微处理器为核心控制器,设计了USB-CAN转换器,可实现电池电量的实时测量与显示。
该系统置于电动汽车电子系统中,可将电池电量等状态信息放至CAN总线上,再通过CAN-USB转换器传入PC上位机,将数据通过人机交互界面显示出来,实现数据信息的交互。
关键词:电量显示;CAN-USB转换器;STM32处理器;CAN总线;信息交互中图分类号:TP212 文献标识码:A 文章编号:2095-8412 (2014)05-589-05工业技术创新 URL: http// DOI: 10.14103/j.issn.2095-8412.2014.05.015引言目前,CAN总线已经普遍应用到中高级车辆中,并且在低级车中的应用也不断扩展,很多汽车电子模块都需要通过CAN总线和其他模块进行通信。
在进行汽车电子相关模块的开发中,需要使用上位机中的数据监测、程序分析,进而对车内CAN 总线中的数据进行解析[1],以便确定各节点模块之间通信数据的准确性和可靠性。
此时就需要一个转换器,将CAN总线的数据转换后提供给上位机以供分析。
实际开发中一般使用普通PC机或笔记本电脑作上位机,PC机或笔记本电脑提供的PCI、RS232及USB接口都可以比较方便地经过转换器和CAN总线相连[2]。
但是,基于USB接口拥有易扩展性、传输的快速性及热插拔性等优点,并考虑到硬件资源、传输速率及现场调试的方便性,故大多数情况下选用USB接口。
电动车电池电量的检测以及在汽车屏幕显示是工业技术创新第01卷第05期2014年12月Industrial Technology Innovation Vol.01 No.05 Dec.2014Design of The CAN-USB Converter Base on STM32 MCUDape ng L iu(C hi na Soft w are Te st i ng C ent er & Int erne t Promot ion Center, B ei jing, 100048, China )Abstract: With the consumption of resources and the resulting pollution, caused widespread concern in society, the development of new energy automotive technology has thus favored. In the new energy vehicles, electric vehicle batteries and power performance measurement and accurate display is the important part of the battery technology. This system has taken the STM32 microprocessor as the core controller, and designed the USB-CAN converter, enabling real-time measurement and display battery charge. It has been arranged in the electric vehicle electronic system, the battery charge state information can be put to the CAN bus, and then through the CAN-USB converter incoming PC host computer, the data is displayed through man-machine interface, and it realizes the data information interaction.Key words:Battery Indicator; CAN-USB Converter; STM32 MCU; CAN-Bus; Information interaction主控芯片使用S T M32f103R B T6,U S B控制器使用P D I U S B D12,C A N控制器使用的是STM32f103RBT6内置的CAN控制器,而CAN收发器则采用TJA1050。
1 几个重要概念根据ISO11898有如下几个重要的与CAN相关的定义:Fault confinement(错误界定)CAN nodes shall be able to distinguish short disturbances from permanent failures. Defective transmitting nodes shall be switched off. Switched off means a node is logically disconnected from the bus, so that it can neither send nor receive any frames.CAN节点可以区分常规错误和永久故障。
有故障的发送节点将切换到离线状态。
离线意味着在逻辑上与总线断开,既不能发送也不能接收。
Error-active(主动错误)An error-active node shall normally take part in bus communication and send an active error flag when an error has been detected. The active error flag shall consist of six (6) consecutive dominant bits and shall violate the rule of bit stuffing and all fixed formats appearing in a regular frame .处于主动错误状态的节点能正常参与总线通信的收发和当检测到错误时将发送错误标志,错误标志由6个连续的显示位组成(这种连续的6个显示位与常规的填充位和其它帧固定格式不相同,正因为如此,硬件才容易区别)。
Error-passive(被动错误)An error-passive node shall not send an active error flag. It takes part in bus communication, but when an error has been detected a passive error flag shall be sent. The passive error flag shall consist of six (6) consecutive recessive bits. After transmission, an error-passive node shall wait some additional time before initiating a further transmission .处于被动错误状态的节点不能发送主动错误标志。
基于STM32的CAN转USB模块设计汪双印;叶峰;刘顺;陈衡;魏绍明【摘要】在有关CAN总线通信的嵌入式设计中,经常需要PC机作为调试工具,以便在PC机上直观地观察数据,这就需要CAN转USB设备进行连接。
笔者选用低成本的内部集成了CAN控制器和串口的ARM内核32位处理器STM32作为主体芯片完成CAN转USB模块的设计。
该模块速度快、可靠性高,能够满足大部分场合的要求。
%In the embedded design concerning CAN bus , PC as a debugging tool and data displayer asks for CAN-USB conversion .The commercial conversion always cost too much and it ’ s difficult to popularize in low cost applications .The STM32 micro controller which internally integrating CAN controller and serial port con-troller was adopted to implement CAN-USB conversion .This module can satisfy most application because of high running speed and high reliability .【期刊名称】《化工自动化及仪表》【年(卷),期】2016(043)011【总页数】4页(P1189-1191,1226)【关键词】CAN总线;STM32芯片;CAN转USB【作者】汪双印;叶峰;刘顺;陈衡;魏绍明【作者单位】中广核检测技术有限公司,江苏苏州215004;中广核检测技术有限公司,江苏苏州215004;中广核检测技术有限公司,江苏苏州215004;中广核检测技术有限公司,江苏苏州215004;中广核检测技术有限公司,江苏苏州215004【正文语种】中文【中图分类】TH862控制器局域网总线(Controller Area Network,CAN)是由德国Bosch公司为汽车应用而开发的多主机串行通信协议。
基于单片机的CAN总线通讯实现CAN(Controller Area Network)总线是一种现代的串行通信总线,广泛应用于汽车电子系统和工控领域。
它具有高可靠性、抗干扰能力强、高速传输、多节点连接等特点,成为实时控制系统的首选通信方式。
实现基于单片机的CAN总线通讯,需要经过以下几个步骤:1.硬件准备:选择合适的CAN控制器和单片机,常用的CAN控制器有MCP2515、SJA1000等。
接下来需要连接CAN控制器和单片机,包括连接CAN高低线路、配置引脚等。
2.引脚配置:根据所使用的单片机和CAN控制器的规格,配置相应的引脚。
通常需要配置CAN_TX、CAN_RX引脚,同时还需要配置中断引脚。
3. 初始化CAN总线:初始化CAN总线的过程包括设置波特率、模式选择、滤波器设置等。
波特率是通信的重要参数,需要保证发送和接收端的波特率一致,通常使用比较常见的波特率如500kbps。
4.发送数据:CAN总线通信是基于消息的,发送数据需要构建CAN消息帧。
消息帧包括标识符、数据长度、数据内容等。
在发送数据之前,需要准备好发送的数据,并将数据放入CAN消息帧中,最后将消息帧发送到总线上。
5.接收数据:接收数据需要配置CAN总线的工作模式和接收过滤器。
当有数据从总线上接收时,CAN控制器将数据存入接收缓冲器,并产生中断或者置位标志位来提醒主控处理接收到的数据。
6.数据处理:接收到的数据可以根据需要进行处理,包括解析、判断、存储等。
根据数据的标识符和长度等信息,可以将数据分发给不同的处理程序进行处理。
7.错误处理:在CAN总线通信过程中,可能会出现数据错误、通信超时等问题。
需要设置相应的错误处理机制,包括错误标志位的监测、错误计数器的清零等。
8.电源管理:在使用CAN总线通信时,需要合理管理系统的功耗和电源。
对于低功耗应用,可以将CAN控制器和单片机配置为睡眠模式,待接收到唤醒信号后再恢复正常工作。
总结:基于单片机的CAN总线通讯实现需要进行硬件准备、引脚配置、初始化CAN总线、发送数据、接收数据、数据处理、错误处理和电源管理等一系列步骤。
基于单片机的智能传感器CAN总线接口硬件设计随着智能化技术的不断发展,人们越来越关注智能系统的搭建,传感器技术的应用也越来越广泛,单片机技术更是在这个背景下广受关注。
在实现智能传感器的联网和信息处理方面,CAN总线作为一种主要网络协议,已经被广泛应用。
在这种情况下,智能传感器必须具有相应的CAN总线接口设计。
本文将介绍基于单片机的智能传感器CAN总线接口硬件设计。
1、 CAN总线介绍CAN(Controller Area Network)总线是一种串行通信协议,主要用于多个控制节点之间的实时数据传输。
CAN总线的通讯速度高,误码率低,具有自适应性等特点。
CAN总线的应用包括工业控制系统、汽车电子控制系统等。
2、硬件设计原理基于单片机的智能传感器CAN总线接口硬件设计需要根据自己的实际需求进行选择。
以STM32单片机为例,STM32单片机的CAN总线接口包括CAN1和CAN2,这两个接口在硬件电路上都有Rx和Tx引脚和节点电阻。
3、硬件设计流程(1)选择STM32单片机在选取单片机的时候,需要根据实际应用场景来选择。
STM32单片机有许多系列,每个系列又有不同的型号,不同型号的单片机内置了不同的外设,需要根据实际需求进行选择。
同时,要根据芯片性价比、性能、功耗等因素进行考虑。
(2)CAN总线选择在硬件设计中,需要选择CAN总线芯片,这个芯片需要支持CAN2.0A和CAN2.0B协议,并且需要支持高速通讯。
同时,要注意芯片的封装和额定工作温度等特性。
(3) CAN总线硬件连接在硬件连接中,需要将CAN总线芯片的Rx和Tx引脚和单片机的CAN1或CAN2接口相连,同时还需添加适当的电流限制电阻和终端电阻。
(4) CAN总线软件调试最后,需要对硬件电路进行软件调试,包括使用标准的CAN总线协议进行通信、CAN总线的数据传输、接收和发送数据、调试CAN中断等。
4、总结基于单片机的智能传感器CAN总线接口硬件设计需要根据实际需求进行选择,在硬件设计中需要选择合适的单片机、CAN总线芯片,并进行正确的硬件连接。
STM32之CAN---TTCAN模式浅析1 前言传统CAN 采用事件触发消息传输机制,CSMA/ CD+ AMP( Carrier-Sense Mult iple Access w ith Co llision Detect ion and Arbit ration on Message Priorit ies, 载波侦听、多路访问、冲突检测、优先级仲裁) 介质访问控制机制, 即多个消息同时发送时, 按照消息标识符的优先级顺序, 低优先级消息自动退出, 高优先级消息继续发送。
这种介质访问方式提高了网络的利用率和高优先级消息的实时性, 但在重负载CAN 中, 低优先级消息经常由于总线冲突而被迫退出发送, 导致低优先级消息传输时延长, 且传输时延不可预测, 因此, CAN 不适合实时性和可靠性要求特别高或有安全性要求的场合, 如汽车电子钟的X-by-w ir e( 线控技术) 。
为此国外有专家自2000 年起研究时间触发机制的CAN --TT CAN。
2004 年国际标准化组织将TT CAN 制定为ISO 11898-4国际标准。
2 什么是TTCAN?TT CA N 是CAN 的高层协议, 其数据链路层需要帧起始时刻信息。
T TCAN 在CAN 的物理层和数据链路层基础上, 通过调度表实现网路上节点的分时同步通信。
网路上各节点取得同步后, 消息只能根据调度表在规定的时间隙传输, 避免了消息传输的冲突、仲裁,消息传输时延短, 且可预知。
具体介绍请参考ISO11898-4。
3 STM32中的TTCAN实现3.1 开启TTCAN模式STM32是通过主控制寄存器(CAN_MCR)的TTCM位来控制TTCAN模式的使能开关的。
CAN_MCR寄存器如下所示:地址偏移量: 0x00复位值: 0x0001 0002如上,只需要将CAN_MCR寄存器的TTCM位置1则开启了TTCAN模式。
此时STM32的CAN模式以TTCAN模式进行通信。
stm32 canopen 例子摘要:1.STM32 和CANopen 简介2.STM32 CANopen 的优点3.STM32 CANopen 的实现方法4.STM32 CANopen 的例子5.总结正文:1.STM32 和CANopen 简介STM32 是一种基于ARM Cortex-M 内核的微控制器,广泛应用于各种嵌入式系统中,如机器人、智能家居和自动控制等领域。
CANopen 是一种用于实时控制的通信协议,特别适用于工业自动化领域。
2.STM32 CANopen 的优点STM32 CANopen 具有许多优点,如高可靠性、实时性和灵活性。
CANopen 协议可以实现多主控制器的通信,使得系统更加稳定。
此外,CANopen 还具有丰富的错误处理机制,可以保证通信的可靠性。
3.STM32 CANopen 的实现方法要实现STM32 CANopen,需要先配置STM32 的CAN 控制器,包括设置工作模式、时钟源和滤波器等参数。
然后,需要编写CANopen 协议的报文,包括标识符、数据长度和校验码等。
最后,通过CAN 控制器发送和接收报文,实现实时控制。
4.STM32 CANopen 的例子以下是一个简单的STM32 CANopen 例子:假设有一个机器人系统,由一个主控制器和两个从控制器组成。
主控制器通过CANopen 协议发送控制命令,如移动和旋转等,从控制器接收命令并执行相应的动作。
通过这种方式,可以实现对机器人系统的实时控制。
5.总结STM32 CANopen 是一种强大的实时控制方案,可以应用于各种嵌入式系统中。
通过配置STM32 的CAN 控制器和编写CANopen 协议的报文,可以实现实时控制和通信。
在STM32中都是有标准的数据结构和函数供大家使用,那么对于具体的每一部分对应那些数据、每一位代表什么意思都没有具体说明。
特别在使用某些协议,需要辨别该部分的具体信息时,就必须对数据结构中的每位的意义清楚才能提取出具体的含义。
先来看一下下面的东西吧。
CAN帧结构。
这个就不具体介绍了,不过先提一点疑问:在STM32中直接给结构体中各成员直接赋值或读取,那么其实际的发送或接收的最底层的结构又是怎么样的呢?typedef struct{uint32_t StdId;uint32_t ExtId;uint8_t IDE;uint8_t RTR;uint8_t DLC;uint8_t Data[8];uint8_t FMI;} CanRxMsg; 接受结构体和发送结构体一样,就只是结构体名不一样而已(CanTxMsg)。
对于上面的问题,在一些协议中进行解析时,如何将这些标识符与协议的具体项对应呢?由于在做J1939协议的编程,所以就以这个为例说明一下。
如上所示,在J1939中CAN帧结构为32位,包含优先级、PDU格式(PF)、PS、SA。
而在STM32的结构体中却是32位的ID,8位的IDE、RTR、DLC。
如果要单独提取标识符中的某一个有如何提取呢?这就涉及到STM32的收发邮箱的寄存器存储结构了。
来看一下其标识符寄存器结构吧(接收和发送寄存器结构除0位外都一样)对于J1939协议来说,必须对帧数据和优先级、PF、PS、SA进行双向解析。
所以我们在发送数据或收到数据时必须做一定的处理。
在STM32的固件库函数中该寄存器中的各个部分的值提取出来赋给其结构体中个部分的值。
发送数据时:u32 Id_Ext = 0x00000000;Id_Ext = Id_Ext|Priority<<26;Id_Ext = ((Id_Ext>>16)|Pdu_PF)<<16;Id_Ext = ((Id_Ext>>8)|Pdu_Ps)<<8;Id_Ext = Id_Ext|Pdu_Sa;接收数据时:PDU_PF = (RxMessage.ExtId&0x00ff0000)>>16;PDU_PS = (RxMessage.ExtId&0x0000ff00)>>8;PDU_SA = RxMessage.ExtId&0x000000FF;注意:在帧结构图中我们看到PF被分成了两部分,而在上面的处理中PF却是连在一起的8位。
stm32f407CAN配置-2020-11-021、虽然stm32f4系列具有两个CAN控制器,但是stm32f407只有⼀个CAN。
2、CAN_Prescaler最终值是等于设置值加⼀,存储于BRP寄存器⾥,Fpclk1是APB1总线的时钟,最⼤值为APB2总线时钟84MHz/2=42MHz。
3、CAN波特率=Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler),举例:CAN波特率=42MHz/((7tq+6tq+1)*6)=500kbps。
4.0、CAN_InitStruct关键成员的含义如下:4.1、CAN_Prescaler控制时间⽚tq的长度;4.2、CAN_Mode包括正常模式、回环模式、静默模式、回环静默模式;4.3、CAN_SJW⽤于设置极限长度,即重新同步时单次可增加或缩短的最⼤长度,范围为1~4tq;4.4、CAN_BS1、CAN_BS2位时序,前者范围1~16tq,后者1~8tq;4.5、FunctionalState使能或失能某些的状态;4.6、CAN_TICM是否使⽤为时间触发的功能;4.7、CAN_ABOM是否使⽤⾃动离线管理,使能后可在节点离线后⾃动恢复⽽不需要软件来⼲预;4.8、CAN_AWUM是否使⽤⾃动唤醒功能,使能后可在监测到总线活动后⾃动唤醒;4.9、CAN_NART是否使⽤⾃动重传功能,使能后会⼀直发送报⽂直到成功为⽌;4.10、CAN_RFLM是否使⽤锁定接收FIFO,如果使能锁定,那么当FIFO溢出后就会丢弃新的数据,否则就是使⽤新的数据覆盖原有数据;4.11、CAN_TXFP⽤于设置发送报⽂的优先级⽅法,使能之后将以报⽂存⼊邮箱的先后顺序来发送,否则按照报⽂的ID的优先级进⾏发送;5.0、CAN_FilterInitStruct的关键成员含义如下:5.1、CAN_FilterMaskId有两种情况,当筛选器处于标识符列表模式下时,和CAN_FilterId类似,都是存储要筛选的ID,⽽当筛选器⼯作在掩码模式下,存储的是CAN_FilterId对应的掩码;5.2、CAN_FilterFIFOAssignment⽤于设置当报⽂通过筛选器以后存储到哪⼀个接收的FIFO⾥,范围为FIFO0或FIFO1;5.3、CAN_FilterNumber的范围为0~27,⼀共28个筛选器;5.4、CAN_FilterMode可设置成列表模式和掩码模式;5.5、CAN_FilterScale⽤于设置筛选器的位宽,可选16位或32位;5.6、CAN_FilterActivation⽤于设置是否激活该筛选器;6、CAN_IT_FMPO:消息挂号允许中断7.0、CanTxMsg结构体关键成员含义如下:7.1、StdId存储报⽂的11位标准标识符,范围为0x0~0x7FF;7.2、ExtId存储报⽂的29位扩展标识符;7.3、IDE⽤于配置选择使⽤StdId还是ExtId;7.4、RTR是⽤于存储报⽂类型的标志,可配置选择为数据帧还是遥控帧,通常配置成使⽤数据帧,因为遥控帧没有数据段,所以Data[8]中的成员是没有内容的;7.5、DLC⽤于存储数据帧的数据长度,范围0~8字节,如果已配置成遥控帧,该参数可配置为0;8、CanRxMsg结构体中的FMI⽤于存储筛选器的编号,也表⽰了是经过哪个FIFO进⾏接收的,可⽤于简化软件处理。
#include "sysdef.h"#define MAX_MAIL_NUM 3//CAN总线调试:0=运行 1=自环调试#define CAN_DEBUG 0//CAN总线波特率:0=250kbps,1=500kbps,2=1Mbps#define CAN1_BPS 0unsigned char can1_addr = 0;unsigned short Can1_Tx_Count =0;unsigned short Can1_Rx_Count =0;unsigned short Can1_Send_Delay =0;unsigned char Can1_Send_Buf[10]={0xeb,0x90,0x01,0x55,0xAA}; unsigned char Can1_Recv_Buf[10]={0};extern int angle_num ;extern unsigned int angle_data ;static u8 CAN_msg_num[MAX_MAIL_NUM]; // 发送邮箱标记void CAN1_Config_init(void){CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;/* CAN register init */CAN_DeInit(CAN1);CAN_StructInit(&CAN_InitStructure);/* CAN cell init *///36MHz 500KbpsCAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式CAN_InitStructure.CAN_ABOM=DISABLE;//软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测//到128次11位连续的隐性位,就退出离线状态CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒CAN_InitStructure.CAN_NART=DISABLE;//CAN报文是否只发1次,不管发送的结果如何(成功/出错或仲裁丢失)CAN_InitStructure.CAN_RFLM=DISABLE;//在接收到溢出时FIFO未被锁定,当接收到FIFO报文未被读出,下一个收到的报文会覆盖原有的报文CAN_InitStructure.CAN_TXFP=DISABLE;//发送的FIFO优先级由报文的标识符来决定#if CAN_DEBUGCAN_InitStructure.CAN_Mode= CAN_Mode_LoopBack;#elseCAN_InitStructure.CAN_Mode= CAN_Mode_Normal;#endif//传输波特率if(CAN1_BPS == 0){CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位CAN_InitStructure.CAN_BS1=CAN_BS1_12tq;//时间段1为9个时间单位CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;//时间段2为8个时间单位CAN_InitStructure.CAN_Prescaler= 9;//36M/(1+12+3)/9= 250kbps//36M/(1+5+2)/9 = 500kbps//36M(1+2+1)/9 = 1M}else if(CAN1_BPS == 1){CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;//时间段1为9个时间单位CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//时间段2为8个时间单位CAN_InitStructure.CAN_Prescaler= 9;//36M/(1+12+3)/9= 250kbps}else{CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳跃宽度1个时间单位CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;//时间段1为9个时间单位CAN_InitStructure.CAN_BS2=CAN_BS2_1tq;//时间段2为8个时间单位CAN_InitStructure.CAN_Prescaler= 9;//36M/(1+12+3)/9= 250kbps}CAN_Init(CAN1,&CAN_InitStructure);/* CAN filter init */CAN_FilterInitStructure.CAN_FilterNumber=0; //指定了待初始化的过滤器0CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMas k;//指定了过滤器将被初始化到的模式为标识符屏蔽位模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32b it;;//给出了过滤器位宽1个32位过滤器CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//用来设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;;//用来设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个)CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0; ;//设定了指向过滤器的FIFO0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能过滤器CAN_FilterInit(&CAN_FilterInitStructure);}// ***************************************************************// BaudRate = 1 / NominalBitTime// NominalBitTime = 1tq + tBS1 + tBS2// tq = (BRP[9:0] + 1) x tPCLK// tPCLK = CAN's clock = APB1's clock// 1Mbps 速率下,采用点的位置在6tq位置处,BS1=5, BS2=2// 500kbps 速率下,采用点的位置在8tq位置处,BS1=7, BS2=3// 250kbps 速率下,采用点的位置在14tq位置处,BS1=13, BS2=2// 125k, 100k, 50k, 20k, 10k 的采用点位置与 250K 相同// ****************************************************************void CAN1_Com_init(void){GPIO_InitTypeDef GPIO_InitStruct;NVIC_InitTypeDef NVIC_InitStructure;/* Enable CAN RX0 interrupt IRQ channel */NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = USB_HP_CAN1_TX_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//Can RxGPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIO_InitStruct);//Can TxGPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&GPIO_InitStruct);CAN1_Config_init();CAN_ITConfig(CAN1,CAN_IT_FMP0 | CAN_IT_FF0 | CAN_IT_FOV0, ENABLE); // fifo0中断CAN_ITConfig(CAN1,CAN_IT_FMP1 | CAN_IT_FF1 | CAN_IT_FOV1, ENABLE); // fifo1中断CAN_ITConfig(CAN1,CAN_IT_TME,DISABLE); // 发送中断CAN_ITConfig(CAN1,CAN_IT_EWG | CAN_IT_EPV | CAN_IT_BOF | CAN_IT_LEC | CAN_IT_ERR | CAN_IT_WKU | CAN_IT_SLK, ENABLE); // ERR 中断// CAN缓存初始化memset(CAN_msg_num,0,MAX_MAIL_NUM);}int CAN1_Tx_msg(CanTxMsg TxMessage){u8 TransmitMailbox = 0;TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);if(CAN_NO_MB == TransmitMailbox){//发送失败return0;}else{CAN_msg_num[TransmitMailbox] = 1;}CAN_ITConfig(CAN1,CAN_IT_TME, ENABLE);return1;}u16 angle=0,angle_h=0,angle_l=0;extern unsigned char angle_dir;int CAN1_Tx_data(void){CanTxMsg TxMessage;u8 TransmitMailbox = 0,i=0;/* transmit */TxMessage.StdId=0x6f1;//设定标准标识符TxMessage.ExtId=0x1234;//设置扩展标识符TxMessage.RTR=CAN_RTR_DATA;//设定待传输消息的帧类型TxMessage.IDE=CAN_ID_STD;//设定消息标识符的类型TxMessage.DLC=6; //数据长度angle=angle_data/10;if(angle>9999) angle=9999;angle_h=angle/100;angle_h=angle_h/10*16+angle_h%10;angle_l=angle%100;angle_l=angle_l/10*16+angle_l%10;Can1_Send_Buf[0]=angle_num; //圈数Can1_Send_Buf[1]=angle_h; //总角度Can1_Send_Buf[2]=angle_l;Can1_Send_Buf[3]=0;Can1_Send_Buf[4]=0;Can1_Send_Buf[5]=angle_dir;for(i=0;i < TxMessage.DLC;i++){TxMessage.Data[i] = Can1_Send_Buf[i];}TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);if(CAN_NO_MB == TransmitMailbox){//发送失败,没有空邮箱return0;}else{CAN_msg_num[TransmitMailbox] = 1;}CAN_ITConfig(CAN1,CAN_IT_TME, ENABLE);Can1_Tx_Count++;if(Can1_Tx_Count > 10000)Can1_Tx_Count =0;Can1_Send_Delay =200;return1;}//解析数据void CAN1_Rx_Data(CanRxMsg RxMessage){u8 i =0;if((RxMessage.StdId==0x6f1) && (RxMessage.IDE==CAN_ID_STD) && ((RxMessage.Data[1]|RxMessage.Data[0]<<8)==0xEB90)){for(i=0;i < RxMessage.DLC;i++){Can1_Recv_Buf[i] = RxMessage.Data[i];}Can1_Rx_Count++;if(Can1_Rx_Count > 10000)Can1_Rx_Count =0;}}//发送完中断函数void CAN1_Send(void){if(CAN_msg_num[0]){if(CAN_GetITStatus(CAN1,CAN_IT_RQCP0)){CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP0);CAN_ITConfig(CAN1,CAN_IT_TME, DISABLE);CAN_msg_num[0] = 0;}}if(CAN_msg_num[1]){if(CAN_GetITStatus(CAN1,CAN_IT_RQCP1)){CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP1);CAN_ITConfig(CAN1,CAN_IT_TME, DISABLE);CAN_msg_num[1] = 0;}}if(CAN_msg_num[2]){if(CAN_GetITStatus(CAN1,CAN_IT_RQCP2)){CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP2);CAN_ITConfig(CAN1,CAN_IT_TME, DISABLE);CAN_msg_num[2] = 0;}}}//接收中断函数void CAN1_Recv(unsigned char num){CanRxMsg RxMessage;switch(num){case0:if(CAN_GetITStatus(CAN1,CAN_IT_FF0)){CAN_ClearITPendingBit(CAN1,CAN_IT_FF0);}else if(CAN_GetITStatus(CAN1,CAN_IT_FOV0)){CAN_ClearITPendingBit(CAN1,CAN_IT_FOV0);}else{CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);//解析数据:CAN1_Rx_Data(RxMessage);}break;case1:if(CAN_GetITStatus(CAN1,CAN_IT_FF1)){CAN_ClearITPendingBit(CAN1,CAN_IT_FF1);}else if(CAN_GetITStatus(CAN1,CAN_IT_FOV1)){CAN_ClearITPendingBit(CAN1,CAN_IT_FOV1);}else{CAN_Receive(CAN1,CAN_FIFO1, &RxMessage);//解析数据CAN1_Rx_Data(RxMessage);}break;}}。
S T M32C A N接收过滤和发送分析通过对CANBUS协议的理解,我们知道:CAN总线上的节点接收或发送数据都是以帧为单位的!!!CAN协议规定了好几种帧类型,但是对于我们应用来说,只有数据帧和远程帧可以通过软件编程来控制。
(其他几种帧都是由CAN控制器硬件实现的,我们想管也管不了)。
而数据帧和远程帧最大的区别在于:远程帧没有数据域。
数据帧分为标准数据帧和扩展数据帧,它们之间最大的区别在于:标识符(ID)长度不同(标准帧为11位,扩展帧为29位)。
为了能更好地理解下面的内容,让我们先来回忆一下标准数据帧是什么样子的:0x5A,!!!我们必须按照帧的格式填充它!TNND,我们来看一下uint32_tuint8_tuint8_tuint8_tuint8_t}CanTxMsg;StdIdStdId用来设定标准标识符。
它的取值范围为0到0x7FF。
ExtIdExtId用来设定扩展标识符。
它的取值范围为0到0x1FFFFFFF。
IDEIDE用来设定消息标识符的类型。
IDE值IDE描述CAN_Id_Standard使用标准标识符CAN_Id_Extended使用扩展标识符RTRRTR用来设定待传输消息的帧类型。
它可以设置为数据帧或者远程帧。
RTR值RTR描述CAN_RTR_Data数据帧CAN_RTR_Remote远程帧DLCDLC用来设定待传输消息的帧长度。
它的取值范围是0到0x8。
Data[8]Data[8]包含了待传输数据,它的取值范围为0到0xFF。
先声明一个CanTxMsg类型的变量,然后按照自己具体的需要,填充此结构变量就可以发送了(帧结构中其他没有填充的部分由硬件自动完成)。
强调:这里的StdId或者ExtId是根据自己的实际需要设置的!我们先抛开它们所代表的实际意义,认为它们存在的目的是为了“进攻”。
(发送出去让别人过滤)接下来,我们来看接收,第一个问题就是它是怎样接收的?------过滤!!!无数的初学者都倒在了这里。
CANopen从站协议在stm32f103zet6单片机上的实现摘要:本文对CANopen从站协议在stm32f103zet6单片机上的实现做了分析和说明。
介绍了CANopen 协议的SDO(服务数据对象),PDO(过程数据对象)等报文处理的工作和实现原理,实现了向主站发送数据及处理主站报文等功能。
本文中,做了一个从站与一个主站进行数据交互的实现,实验表明CANopen 从站协议可以正常使用在stm32f103zet6单片机上,并且可以与CANopen主站进行数据传输等交互操作。
关键词:CANopen;从站协议;服务数据对象;过程数据对象;单片机1引言(STM32F103ZET6)(STM32F103ZET6)(STM32F103ZET6)从站设备(STM32F103ZET6)图1 CANOPEN连接示意图CANopen是一种架构在控制局域网路(Control Area Network, CAN)上的高层通讯协定,其协议在嵌入式系统及单片机上广泛使用,是工业控制常用到的一种现场总线。
依靠CANopen协议集的支持,可以对不同的从站设备通过总线进行配置和系统重构。
相信在不久的将来随着国内对CANo pen协议的研究深入,CANopen协议会在各个领域有广泛的应用。
CANopen 是OSI模型中的网络层以上(包括网络层)的协定。
CANopen 支持网络管理、设备监控及节点间的通讯,其中包括一个简易的传输层,可处理资料的传送。
数据的传输和接收都基于CAN总线。
如图1,通常多个从站设备靠CANopen网络传输数据给一个CANopen主站设备。
CANopen需要有对象字典,SDO(服务数据对象)处理功能,PDO(过程数据对象)处理功能,定时器,NMT(网络管理)处理功能等。
本文着重介绍了CANopen协议的各个功能以及CANopen协议在单片机上stm32f103zet6的设计与实现。
2 CANopen对象字典介绍及设计对象字典(od:object dictionary)是CAN open协议的核心。
Science &Technology Vision0引言STM32系列的微控制器,由于其性能优势,性价比高,稳定性好,广泛用在嵌入式设备中;在物联网、智能家居、智能汽车以及智能医疗系统中都有应用[1-2]。
目前市场上,STM32系列微控制器的烧录设备比较单一,固件烧录定制化的功能不足;或者使用定制化的烧录设备,但成本就会比较高,对于生产线要求高,难以推广。
本文介绍在定制化STM32烧录器过程中,基于Arduino 快速实现烧录器CAN 通信需求的一种方案,以一种比较低成本的方法,最大限度满足生产特殊的需求。
1烧录器功能概述STM32系列微控制器可以通过ST 公司提供的调试开发工具ST-Link 烧录固件。
本文介绍的定制化烧录器通过集成多路ST-Link 的方法,实现多路的差异化烧录STM32微控制器方法。
烧录器上集成多路ST-Link 通过USB 总线连接到上位机PC 端。
上位机PC 控制固件的加载导入,可以分别加载不同的固件。
定制化的烧录器上,需要有控制器控制烧录器的电源,指示灯机以及按键。
另外由于烧录器有接入CAN 网络总线的需求,需要增加CAN 控制器模块。
烧录器的控制主要是I/O 的控制,以及CAN 网络总线的传输。
CAN 传输的数据量并不大,不需要非常高的负载,只需要满足500KBPS 的速率即可。
所以这里选择了比较便捷灵活的Arduino 开发系统及其套件来实现。
Arduino 是开源的电子开发系统,由于其便捷、灵活及开放的开发方式,深受广大电子爱好者们的喜欢[3]。
从2005年Arduino 项目诞生以来,吸引了无数发开这参与到其中,衍生出许多种控制器;也为后来的开发者引入许多开发案例。
在此基础上可以非常灵活迅速地搭建出一个控制系统。
在本文的案例中,我们选用了Arduino UNO 主控板,CAN 控制器选择MCP2515芯片的开发套件。
Arduino UNO 是最基础的主控板,ATmega328P 微控制器,5V 工作电压,16MHz 的工作频率,32KB 的Flash ,2KB 的RAM ,有14个数字I/O ,6个模拟I/O ,I/O 驱动电流可达20mA 。
STM32之CAN---发送管理分析1 CAN发送邮箱STM32共有三个CAN发送邮箱,在检测到总线空闲时交发送,但需要注意的是,有可能会发送失败,有可能因为仲裁失败从而导致失败,也有可能是其它错误,原则上bxCAN将自动重发,但bxCAN也可以配置不自动重发。
正因为如此,发送邮箱中有可能同时存在多个需要发送的报文,一旦出现这种情况,那么发送邮箱中的多个报文又将是谁先发送谁后发送呢?有两种模式:ID模式和FIFO模式。
ID模式由报文的ID值决定,即ID值越小,优先级越高,另一种FIFO模式,顾名思义,即为消息队列方式,谁先到谁先发送,此种模式下三个邮箱与接收FIFO类似。
下图是发送邮箱的状态图:图1由上图可知,发送邮箱共有四种状态,空状态,挂号状态,预定发送状态(scheduled),发送状态。
发送报文的流程为:应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器的TXRQ位置’1’,来请求发送。
TXRQ位置’1’后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄存器就不再有写的权限。
TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的邮箱,参见发送优先级。
一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。
一旦CAN总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。
一旦邮箱中的报文被成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一次成功发送。
如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置’1’,由于发送错误引起的就对TERR位置’1’。
2 发送优先级如之前所述,如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。
此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。
STM32之CAN---错误管理分析1 几个重要概念根据ISO11898有如下几个重要的与CAN相关的定义:∙Fault confinement(错误界定)CAN nodes shall be able to distinguish short disturbances from permanent failures. Defective transmitting nodes shall be switched off. Switched off means a node is logically disconnected from the bus, so that it can neither send nor receive any frames.CAN节点可以区分常规错误和永久故障。
有故障的发送节点将切换到离线状态。
离线意味着在逻辑上与总线断开,既不能发送也不能接收。
∙Error-active(主动错误)An error-active node shall normally take part in bus communication and send an active error flag when an error has been detected. The active error flag shall consist of six (6) consecutive dominant bits and shall violate the rule of bit stuffing and all fixed formats appearing in a regular frame .处于主动错误状态的节点能正常参与总线通信的收发和当检测到错误时将发送错误标志,错误标志由6个连续的显示位组成(这种连续的6个显示位与常规的填充位和其它帧固定格式不相同,正因为如此,硬件才容易区别)。
∙Error-passive(被动错误)An error-passive node shall not send an active error flag. It takes part in bus communication, but when an error has been detected a passive error flag shall be sent. The passive error flag shall consist of six (6) consecutive recessive bits. After transmission, an error-passive node shall wait some additional time before initiating a further transmission .处于被动错误状态的节点不能发送主动错误标志。