STM32的CAN总线中继器设计及应用_潘铜
基于STM32F407的5路CAN总线扩展设计与实现

基于STM32F407的5路CAN总线扩展设计与实现摘要:针对本单位某测试设备的设计需求,需要用到5路CAN总线接口,利用具有总线协议控制器MCP2515通过主控制器STM32F407的3路SPI接口,实现STM32F407的CAN总线扩展,满足了该设备的控制精度、处理速度以及5路CAN 总线接口的设计要求,具有较强的工程实用价值。
关键词:MCP2515, CAN总线,SPI总线,STM32F4070引言CAN(Controller Area Network)即控制器局域网络总线,是德国博世公司提出的一种串行总线通讯技术,是目前国际上应用最广泛的一种现场总线技术之一。
CAN总线的数据通讯在工业应用中相比其他总线在可靠性、实时性和灵活性等方面具有较大优势[1]。
CAN遵从IOS/OSI模型,采用了其中的物理层、数据链路层,通信速率最高可达到1Mbps(通讯距离不超过40m)。
本公司某测试设备需要5路独立的CAN总线接口,才能满足系统对外部数据的实时采集和控制需求。
控制器芯片STM32F407是STMicroelectronics即意法半导体公司开发的一款32位ARM 内核的微控制器芯片,是目前控制领域流行的处理器之一,该微控制器主频168MHz,带浮点数运算功能,精度和数据处理能力均可以满足系统要求。
仅依靠控制器自带2路CAN总线接口,不能满足系统5路独立CAN总线接口的需求,但是同时又自带有3路SPI(Serial Peripheral Interface)即串行外设接口。
MCP2515是Microchip公司开发的CAN控制器芯片,具有SPI接口的独立CAN控制器,它完全支持CAN V2.0B技术规范,因此可以STM32F407的SPI接口与MCP2515进行多路CAN总线接口扩展。
1 系统硬件电路设计硬件主要包括三部分:STM32F407微控制器,CAN控制器MCP2515,CAN收发器CTM8251。
stm32的can现场总线实验

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的CAN总线通信协议转换设计

基于STM32的CAN总线通信协议转换设计阎金【期刊名称】《《电子世界》》【年(卷),期】2019(000)023【总页数】2页(P130-131)【作者】阎金【作者单位】山西大众电子信息产业集团有限公司【正文语种】中文在通信技术中传统RS485接口和CAN总线的技术得到广泛的使用,但是由于其不同的接口电路以及通信协议,两种通信方式不能直接进行数据报文的传输。
因此本文提出一种基于STM32F103系列单片机的CAN总线通信协议与RS485通信协议转换的电路设计,详细介绍了该设计中的硬件结构以及软件设计中的缓存数据结构,通过实验证明本方案可以用于在不同设备之间的协议转换和数据报文传输。
1.引言CAN总线通信技术最早由德国Bosch提出,应用在汽车工业领域中的一种分布式控制的串行通信网络(孙韬,刘宗行,吴斌,基于CAN总线构成的分布式通信网络的应用[J].重庆大学学报,2003,26(1):69-72)。
由于CAN总线通信有着传输距离远,组网灵活方便,同时能够有效纠正传输中的信息错误,搭建成本较低等特点,目前成为各种通信领域中不可缺少的通信协议技术(邓婕,CAN总线通信原理分析[J].电子设计工程,2012,20(7):104-107)。
本文介绍一种CAN总线与传统RS485接口进行通信协议转换的设计,从而满足不同总线设备之间通信协议的相互转换和数据传输。
2.硬件电路设计方案基于STM32F103的协议转换的硬件设计方案示意图如图1所示,整个系统可以分为4个:CAN总线接口模块,单片机模块,RS485电路接口模块,电源模块。
该系统各模块通过MCU的通用异步串行收发(USART)接口相互连接,最高通信波特率可达4.5Mbits/s,能够满足数据通信的及时性(张莉,基于CAN总线的通信系统设计研究[J].自动化与仪器仪表,2018(4):91-94)。
图1 协议转换硬件设计方案框图为了降低信息输入和输出噪声及干扰以及保护电路,设计中需要在CAN总线的收发控制器端和RS485接口端采用数字隔离元器件进行电气隔离处理。
STM32的CAN总线利用指南

CAN大体知识:CAN协议的特点:1、多主机操纵。
在总线空闲时,所有单元都能够发送消息,假设两个以上同时开始发送消息,依照标识符来决定优先级。
优先级高的先发送。
2、系统的假设软性。
与总线相连的单元没有类似地址的信息。
因此在总线上增加单元时,应用层程序大体不需要改变。
3、通信速度快,通信距离远。
最高1Mbps(距离小于40M),最远可达10Km(速度低于5Kbps)。
4、具有错误检测、错误通知和错误恢复功能。
所有单元都能够检测错误,检测犯错误的单元会当即同时通知其他所有单元,正在发送消息的单元一旦检测犯错误,会强制终止当前的发送。
前置终止发送的单元会不断反复地从头发送该消息直到发送成功。
5、故障封锁功能。
CAN能够判定犯错误的类型是总线上的数据错误仍是持续的数据错误。
由此功能,当总线上发生持续数据错误时,能够将引发此故障的单元从总线上隔离出去。
6、连接节点多。
CAN总线是可同时连接多个单元的总线。
可连接的单元总数理论上是没有限制的。
单事实上受到时刻延迟和电气负载的限制。
降低通信速度,可连接单元增加。
反之,反之。
STM32的CAN 时刻特性(有关波特率):与的协议内容相较,STM32的CAN时刻特性略微有些区别。
STM32把传播时刻段和相位缓冲段1归并了,因此STM32的CAN一个位只有3段:同步段(SYNC_SEG)、时刻段1(BS1)和时刻段2(BS2)。
STM的BS1段能够设置为1-16个时刻单元,恰好等于传播时刻段和相位缓冲段1之和。
波特率=1/正常的位时刻正常的位时刻=1×tq+tbs1+tbs2其中:tbps1=tq×(TS1[3:0]+1)tbps2=tq×(TS2[3:0]+1)tq=(BRP[9:0]+1)×tpclktq是一个时刻单元tpclk是APB时钟的时刻周期因此,咱们只需要明白BS1和BS2的设置,和APB1的时钟频率(一样为36MHz),就能够够方便的计算出波特率。
基于ARM的单芯片CAN总线中继器设计

基于ARM的单芯片CAN总线中继器设计
戴敏;曹杰
【期刊名称】《测控技术》
【年(卷),期】2010(029)005
【摘要】在印染企业实施设备自动化改造、构建现场设备网络控制系统、对生产进行在线监控和网络化管理,有利于企业实现节能减排的目的.CAN总线中继器是组建大型CAN网络不可缺少的设备.针对印染生产现场环境的特殊性,提出了基于ARM7的单芯片CAN中继器设计方案.阐述了中继器的硬件组成和工作原理,给出了CAN总线接口电路和ISP接口的具体设计.介绍了中继器固件的模块化设计方法.以及CAN模块初始化、双FIFO转发等软件模块的具体实现.实际使用表明,中继器的使用增加了联网的节点数、延长了网络的传输距离、降低了网络延迟,能够满足印染企业设备联网的实际需求.
【总页数】6页(P64-68,71)
【作者】戴敏;曹杰
【作者单位】东南大学,机械工程学院,江苏,南京,211189;东南大学,机械工程学院,江苏,南京,211189
【正文语种】中文
【中图分类】TP393.05
【相关文献】
1.基于Cortex-M3的CAN总线中继器设计 [J], 余坤;刘文超
2.基于ARM芯片的CAN总线接口设计与实现 [J], 佟鸣宇;彭开香
3.基于ARM7的CAN总线中继器的设计 [J], 余涛;刘晓明;仲元宏
4.基于ARM的单芯片嵌入式网关设计 [J], 任强;程新明;徐洞成;戴喻
5.基于LPC2194的CAN总线中继器设计及其在煤矿设备系统中的应用 [J], 陈伟;因版权原因,仅展示原文概要,查看原文内容请购买。
基于stm32can通讯,已在实际项目中应用

与本程序代码有关部分的原理图及PCB,鉴于 STM32F103VET6,已在项目中应用。
开头篇: STM32的 CAN波特率计算STM32里的CAN支持2.0A,2.0B,带有FIFO,中止等,这里主要提一下内部的时钟应用。
bxCAN挂接在 APB1总线上 , 采纳总线时钟 , 因此我们需要知道APB1的总线时钟是多少。
我们先看看下列图, 看看 APB1总线时钟 :APB1 时钟取自AHB的分频, 而 AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的,而后再看看有了APB1的时钟后, 怎样算CAN的总线速率, 先看下列图 :有了上面的这个图, 基本就清楚了:总线时钟MHz(3+TS1+TS2)*(BRP+1) ======================================================================下边是我的计算:CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;注意 //#define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum*/CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;CAN_InitStructure.CAN_Prescaler = 4;//2nominal bit time(3+5+1)tq=9tqstatic void SetSysClockTo72(void) 函数:对于分频系数,查察下边的/* HCLK = SYSCLK *//* PCLK2 = HCLK *//* PCLK1 = HCLK/2 */因此 can 时钟 72MHZ/2/4=9 Mhz ,tq=1/36Mhz波特率为 1/nominal bit time= 9/9=1MHZ=====================================================================void CAN_Configuration(void){CAN_InitTypeDef CAN_InitStructure;CAN_FilterInitTypeDef CAN_FilterInitStructure;/* CAN register init */CAN_DeInit();CAN_StructInit(&CAN_InitStructure);/* CAN cell init */CAN_InitStructure.CAN_TTCM=DISABLE;CAN_InitStructure.CAN_ABOM=DISABLE;CAN_InitStructure.CAN_AWUM=DISABLE;CAN_InitStructure.CAN_NART=DISABLE;CAN_InitStructure.CAN_RFLM=DISABLE;CAN_InitStructure.CAN_TXFP=DISABLE;CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;CAN_InitStructure.CAN_Prescaler=200;CAN_Init(&CAN_InitStructure);/* CAN filter init */CAN_FilterInitStructure.CAN_FilterNumber=0;CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;CAN_FilterInit(&CAN_FilterInitStructure);}注意 //#define CAN_BS1_3tq((uint8_t)0x02) /*!< 3 time quantum */波特率 10K,公式: 72MHZ/2/200/ (1+9+8) =0.01 ,即 10Kbps正文篇:程序代码/* Includes---------------------------------- --------------------------------*/#include "stm32f10x.h"#include "platform_config.h"#include "stm32f10x_rcc.h"#include "stm32f10x_flash.h"#include "stm32f10x_usart.h"#include "stm32f10x_gpio.h"#include "stm32f10x_tim.h"#include "stdio.h"ErrorStatus HSEStartUpStatus;void Uart1_PutChar(u8 ch);unsigned int j;//j=2-8/* Private typedef-----------------------------------------------------------*/typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus; //状态量__IO uint32_t ret = 0; // 用于中止返回的传达变量volatile TestStatus TestRx;CanTxMsg TxMessage;CanRxMsg RxMessage;unsigned char read_temp;unsigned char open_temp,stop_temp,top_temp;uint16_t CCR1_Val=0 ;#define start 50#define accelerate 10#define Period 999#define Prescaler 9//double percent=0.9;vu32 counter=0;vu32 compare ;uint16_t High_fre=900;unsigned int Tulun_i=0; //500 次作为一个脉冲GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;//Private functions 函数 ---------------------------------------------------------*/ voidUART_Init(void);ErrorStatus HSEStartUpStatus;void RCC_Configuration(void); // 声明时钟初始化函数void GPIO_Configuration(void); // 声明 IO 初始化函数void NVIC_Configuration(void); // 声明中止管理器初始化函数void CAN_Configuration(void); // 声明 CAN初始化函数void CAN_TX(unsigned char add,unsigned char data1,unsigned char data2);// 声明 CAN发送函数TestStatus CAN_RX(void); // 声明带返回参数的 CAN接收函数void LED_RESET(void);void PWM_startN(void);void PWM_start(void);/******Main program ***********/int main(void){u32 n;/* 系统时钟初始化*/RCC_Configuration();/*中止管理器初始化*/NVIC_Configuration();/* IO 初始化 */GPIO_Configuration();UART_Init(); // 初始化串口函数/* CAN初始化*/CAN_Configuration();TIM_TimeBaseStructure.TIM_Period = Period;TIM_TimeBaseStructure.TIM_Prescaler = Prescaler;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);GPIO_ResetBits(GPIOA, GPIO_Pin_4);while (1){CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);//开接收中止for(n=0;n<10000;n++);//延时if(ret == 1){for(j=0;j<8;j++)//发送8组数据到串口{Uart1_PutChar(RxMessage.Data[j]);}open_temp=RxMessage.Data[0];top_temp=RxMessage.Data[1];stop_temp= RxMessage.Data[2];switch(open_temp){case 01:PWM_start(); break;case 02:PWM_startN();break;default: GPIO_ResetBits(GPIOA, GPIO_Pin_2);GPIO_ResetBits(GPIOA, GPIO_Pin_1); break;}ret = 0;}}}/*开始输出 PWM*/void PWM_start(void){TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 1000-CCR1_Val;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC3Init(TIM2, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; TIM_OCInitStructure.TIM_Pulse = 1000-CCR1_Val;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC2Init(TIM2, &TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);/* PWM1 Mode configuration: Channel2 */GPIO_ResetBits(GPIOA, GPIO_Pin_1);TIM_ARRPreloadConfig(TIM2, ENABLE);switch(top_temp){case 01: High_fre=100; break;case 02:High_fre=500 ;break;case 03:High_fre=900 ;break;default:break;}switch(stop_temp){case 01:compare=100000; break;case 02:compare=200000 ;break;case 03:compare=50000 ;break;default:break;}TIM_Cmd(TIM2, ENABLE);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);/* TIM2 enable counter */}/*停止输出 PWM*/void PWM_startN(void){TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 1000-CCR1_Val;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC2Init(TIM2, &TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; TIM_OCInitStructure.TIM_Pulse = 1000-CCR1_Val;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;TIM_OC3Init(TIM2, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);/* PWM1 Mode configuration: Channel2 */GPIO_ResetBits(GPIOA, GPIO_Pin_2);TIM_ARRPreloadConfig(TIM2, ENABLE);switch(top_temp){case 01: High_fre=100; break;case 02:High_fre=500 ;break;case 03:High_fre=900 ;break;default:break;}switch(stop_temp){case 01:compare=100000; break;case 02:compare=200000 ;break;case 03:compare=50000 ;break;default:break;}TIM_Cmd(TIM2, ENABLE);TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);/* TIM2 enable counter */}void TIM2_IRQHandler(void){static unsigned int i=0;static unsigned int j=0;if (TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET){if(counter<compare){if(i<(High_fre-start)/accelerate){TIM2->CCR2=1000-(start+i*accelerate);TIM2->CCR3=1000-(start+i*accelerate);Tulun_i++;counter++;if( Tulun_i==500){i++;Tulun_i=0;}}else{TIM2->CCR2=1000-High_fre;TIM2->CCR3=1000-High_fre;counter++;}}if(counter==compare){TIM2->CCR2=1000-(start+i*accelerate-j*accelerate);TIM2->CCR3=1000-(start+i*accelerate-j*accelerate);Tulun_i++;if( Tulun_i==500){j++;Tulun_i=0;}if(j==i){TIM2->CCR2=1000;TIM2->CCR3=1000;if(Tulun_i==0){TIM_Cmd(TIM2, DISABLE);TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);i=0;j=0;counter=0;}}}TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}}/*关 LED */void LED_RESET(void){GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)0x00); //关LEDGPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)0x00);}/*******************************************************************************Configures the different system clocks.*******************************************************************************/void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;/* RCC system reset(for debug purpose) */RCC_DeInit(); // 时钟控制存放器所有恢复默认值/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON); // 外面高速时钟源开启(8M晶振)/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) // 等候外面时钟就绪// 假如时钟启动成功{/* HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1); // 定义AHB设施时钟为系统时钟 1 分频/* PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1); // 定义AHB2设施时钟为HCLK时钟1 分频/* PCLK1 = HCLK/2 */RCC_PCLK1Config(RCC_HCLK_Div2); // 定义AHB1设施时钟为HCLK时钟2 分频/* Flash 2 wait state */FLASH_SetLatency(FLASH_Latency_2); // 设定内部FLASH的的延时周期为 2 周期/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能FLASH预存取缓冲区/* PLLCLK = 8MHz * 9 = 72 MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 配置PLL 时钟为外面高速时钟的9 倍频/* Enable PLL */RCC_PLLCmd(ENABLE); //使能PLL 时钟/* Wait till PLL is ready */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)//等候PLL时钟设置达成准备就绪{}/* Select PLL as system clock source */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //使用PLL 时钟作为系统时钟源/* Wait till PLL is used as system clock source *//* Wait till PLL is used as system clock source */while(RCC_GetSYSCLKSource() != 0x08) //返回系统所用时钟源确认为外面高速晶振,8M晶振。
基于STM32和FPGA的CAN总线运动控制器的设计

基于STM32和FPGA的CAN总线运动控制器的设计吴辉;罗富文;杜文广【期刊名称】《电子设计工程》【年(卷),期】2013(21)1【摘要】A motion controller based on CAN bus is designed with STM32 and FPGA. A low consumption micro-controller C0rtex-M3 and a FPGA chip STM32F103VBT6 are used. The structure of the system and the main software and hardware design structure is introduced.Some control algorithm are realized by using the high processing capacity of FPGA. STM32 and the CAN bus are used to communicate with outside part/The system is stable and reliable,otherwise, the portability of the system is strong by packaging the FPGA program or C program.%运用低功耗C0rtex-M3微控制器STM32F103VBT6和FPGA芯片设计一种基于CAN总线的运动控制器.介绍系统的体系结构、主要硬件设计和软件结构.利用FPGA高速处理能力实现控制算法,与外界通信采用STM32和CAN总线技术,系统稳定可靠,另外,将设计好的FPGA程序或是C程序进行封装,系统的可移植性强.【总页数】4页(P145-148)【作者】吴辉;罗富文;杜文广【作者单位】西安工程大学电子信息学院,陕西西安710048;西安工程大学电子信息学院,陕西西安710048;西安工程大学电子信息学院,陕西西安710048【正文语种】中文【中图分类】TP2【相关文献】1.基于STM32F4的基板检测输送平台运动控制器设计 [J], 张群;陶晓杰;张蓝;权露;2.基于STM32+FPGA的六自由度机器人运动控制器设计 [J], 陈亚; 史钊亮; 高锦宏; 王殿君3.基于ARM和FPGA的软体机器人的CAN总线运动控制器的设计 [J], 袁俊杰;朱鹏程4.基于STM32+FPGA的多轴运动控制器的设计 [J], 胡呈祖;周军连5.基于STM32和FPGA的多轴运动控制器的设计 [J], 张团善;肖磊;张娜因版权原因,仅展示原文概要,查看原文内容请购买。
基于STM32的CAN与以太网的通信控制器设计

一一一一
订 一一一一
图2 C A N 总 线与 以太 网通信 的 网络模 型
豁 上似 机 监 上侮机
} I 心
三、实现方案
以 人 剐
通
系
l
通信控 制器
3 . 1 硬 件设计 。通 信控 制器 连接 了 毛丝检 测终 端C A N总
线 网络和数 据监 控 中心上位 机 的以太 网网络 ,实现 了终 端和
厂 — —— —— -— —— —— —— —— -— —— —— —— _— - I I — —— —— -— —— —— —— _— _ I
—
议[ 2 】 ,以 太 网采 用 T C P / I P 协议 ,而 通 信 控 制 器 则需 要 连 接 这 两种 结 构 和 协 议 完 全不 同 的 网络 。 因此 通 信 控 制 器 的核
图3通信控 制器 硬件 框 图
C AN/ 以 太 网协 议 转 换 的核 心 部 件 S T M3 2 微 控 制 器 采
太 网控 制 模 块 从T C P / I P  ̄ 文 中解 析 出数 据 放入 缓 存 区 中 , C A N控 制模 块 从 缓存 区 中读取 数 据并 封 装 成 C A N帧发 送 到
心 工作 就 是 对 C AN总 线数 据 帧 和 以太 网数 据 帧行 重 新 封装
让 } 』 奉潮I * …J 】 _ ' J 】 l S T M 3 2
C
l l I I
以使 它 们能 被 以太 网或 C A N总线 所读 取 。 网络模 型 如 冈2 所
示 。通 信 控 制 器 的CA N控 制模 块 从 C AN总线 发 送 来 的数 据
可靠双向通信 ,解决 了工业尼龙丝原丝检测 系统的检测终端和远程监控 中心的通信问题 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*基金项目:西安工程大学研究生创新基金资助(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 收发器,CAN 总线通信距离和网络中节点数被分别限制在10km 和110个之内。
但是在稍大型的CAN 总线系统中,这往往是不够的,这时就需要用CAN 总线中继器对CAN 总线网络进行扩展。
CAN 中继器是系统组网的关键技术设备之一,使用中继器可以提高网络设计的灵活性,并且通过中继器还可以连接两个不同波特率的CAN 总线网络;在两个网络间进行数据转发,极大地扩展其使用范围。
基于此,本文设计出一款基于ST M 32的CA N 总线中继器,并将其应用到齐玛印花机上,完成圆网印花机通信系统的工程改造。
1 系统整体方案及硬件实现以往的CAN 中继器设计大多采用M CU 加CAN 控制器的双芯片或多芯片解决方案。
例如,参考文献[1]使用1片M CU 加2路CAN 控制器的结构实现中继器;参考文献[2]使用双M CU 结构设计CA N 总线中继器;参考文献[3]使用独立双CAN 控制器作为2路CAN 接口的控制器来设计CA N 中继器。
上述方案电路复杂,MCU 与CA N 控制器通过外部总线连接,数据吞吐速度慢,整体可靠性也比较差。
意法半导体的STM 32是以A RM Cortex -M 3为内核的32位微处理器,主频可高达72M H z ,内置Flash 和SRAM ,其容量可分别高达512KB 和64K B ;内部集成双bxCA N 控制器。
它支持CAN 协议V2.0A 和V2.0B ,波特率最高可达1M b /s ,具有3个发送邮箱和2个3级深度的FIFO ,能够以最小的CPU 负荷来高效处理大量收到的报文。
基于此,选用STM 32F105作为主控制器,设计出一款基于STM 32的CAN 总线中继器。
其整体方案如图1所示。
由于STM 32F105内部集成了双路CA N 控制器,CA N 中继器的节点电路变得十分简单,其硬件电路如图图1 系统整体方案2所示。
以往的节点电路,为了降低生产现场的抗干扰能力,保证中继器工作的可靠性,都采用多重的抗干扰措施。
例如,大部分的节点电路都是采用在CAN 控制器和收发器之间加入光电隔离器6N137来实现CAN 节点之间的电气隔离,采用外加DC /DC 电源模块的方法切断系统电源的干扰。
同样着眼于提高系统的抗干扰能力和可靠性的问题,本设计中一反常规的设计方法,直接采用广州致远电子有限公司生产的CA N 通用收发器CTM 8251。
图2CAN 节点电路CT M 8251是一款带隔离的通用CA N 收发器芯片,该芯片内部集成了所有必需的CAN 隔离及CAN 收发器件,这些都被集成在不到3cm 2的芯片上。
芯片的主要功能是将CA N 控制器的逻辑电平转换为CAN 总线的差分电平,并且具有DC 2500V 的隔离功能。
该芯片符合ISO 11898标准,因此,它可以和其他遵从ISO 11898标准的CAN 收发器产品互操作。
实践证明采用CTM 8251不仅使系统真正与外接隔离开,抑制了干扰的串入提高系统的可靠性,简化了CAN 节点外围电路的复杂度,还降低了成本,有较高的性价比。
图2中120Ψ为可选用的终端匹配电阻,如果网络中已经有一对匹配电阻,则不使用该电阻。
另外,电路中设计有相应的拨码开关电路用于CAN 网络的ID 标志和设置相应的波特率。
2 中继器的软件实现CAN 中继器的主要任务是在两个网络中进行数据的过滤和转发。
其软件主要包括以下模块:初始化模块、数据发送模块和接收模块等。
2.1 初始化模块CA N 初始化直接关系到CAN 控制器能否正常工作,在很多情况下,软件不能正常工作并不是CAN 的收发程序有问题,往往是初始化配置不正确造成的。
ST M 32的CA N 初始化主要包括CAN 寄存器初始化、CAN 单元初始化(包括CA N 模式和波特率的设置)、CAN 过滤器的初始化。
由于STM 32开发商提供了大量的固件库函数,所以只需在调用的时间作出相应的设置即可。
初始化子程序如下所示:①CA N 单元初始化子程序。
……CAN InitSt ructure .CAN TTCM =DISABLE ;CAN InitSt ructure .CAN ABOM =DISABLE ;CAN InitSt ructure .CAN AWUM =DISABLE ;CAN InitSt ructure .CAN NART =DISABLE ;CAN InitSt ructure .CAN RFLM =DISABLE ;CAN InitSt ructure .CAN TXFP =DISABLE ;CAN InitSt ructure .CAN Mode =CAN Mode Normal ;//CAN 工作模式的选择CAN InitSt ructure .CAN SJW =CAN SJW 1tq ;CAN InitSt ructure .CAN BS1=CAN BS1 8tq ;CAN InitSt ructure .CAN BS2=CAN BS2 7tq ;CAN InitSt ructure .CAN Prescaler =1;CAN Init (CAN1,&CAN InitS tructure );CAN Init (CAN2,&CAN InitS tructure );……在该初始化子程序中最关键的环节是怎么设置CAN 的波特率,ST M 32数据手册给出了波特率的计算公式:波特率=11×t q +t BS 1+t BS2其中t q 为CA N 时钟周期。
如上述CA N 单元初始化子程序中:SJW =t q ,BS1=8t q ,BS2=7t q ,STM 32的CAN 时钟有A PB1提供。
假设系统时钟为72M Hz ,A PB1为系统时钟的9分频,结合初始化子程序,CA N P rescaler =1,带入波特率计算公式即可求的其波特率为500kb /s 。
②CA N 过滤器的初始化子程序。
……CAN FilterInitStructure .CAN FilterNumber =0;CAN FilterInitS tructure .CAN FilterMode =CAN FilterMode IdMask ;CAN FilterInitS tructure .CAN FilterScale =CAN FilterScale 32bit ;CAN FilterInitS tructure .CAN FilterIdHigh =(0x0000 (CAN ID <<1));CAN FilterInitStructure .CAN FilterIdLow =0x0000;CAN FilterInitStructure .CAN FilterM askIdHigh =0x0FE0;CAN FilterInitStructure .CAN FilterM askIdLow =0x0000;CAN FilterInitStructure.CAN FilterFIFOAssignment=0;CAN FilterInitStructure.CAN FilterActivation=ENABLE;CAN FilterInit(&CAN FilterInitStructure);CAN过滤器设置的得当与否是CAN是否能够成功接收信息的关键,尤其在过滤器组位宽和模式设计上,如何将节点的ID号准确地映射到过滤器组位宽设置寄存器上是过滤器的核心。
为了过滤出一组标识符,设置过滤器工作在屏蔽位模式下,对标识符的任何一位采用“必须匹配”或“不用关心”的原则处理。
2.2 数据发送模块[4]中继器的任务之一就是实现报文的转发。
ST M32F105内部集成了双bxCAN控制器,它包括3个发送邮箱和2个3级深度的FIFO。