STM32的CAN总线中继器设计及应用_潘铜

合集下载

基于STM32F407的5路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现场总线实验心得最近在搞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总线通信协议转换设计

基于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总线利用指南

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总线中继器设计

基于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通讯,已在实际项目中应用

基于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总线运动控制器的设计

基于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与以太网的通信控制器设计

基于STM32的CAN与以太网的通信控制器设计

一一一一
订 一一一一
图2 C A N 总 线与 以太 网通信 的 网络模 型
豁 上似 机 监 上侮机
} I 心
三、实现方案
以 人 剐



通信控 制器
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

l l I I
以使 它 们能 被 以太 网或 C A N总线 所读 取 。 网络模 型 如 冈2 所
示 。通 信 控 制 器 的CA N控 制模 块 从 C AN总线 发 送 来 的数 据
可靠双向通信 ,解决 了工业尼龙丝原丝检测 系统的检测终端和远程监控 中心的通信问题 。

基于STM32的CAN总线接口设计与实现

基于STM32的CAN总线接口设计与实现

图1 系统总体框图是一款带隔离的高速CAN收发器芯片,该芯片内部集成了所有必需的CAN隔离及CAN收发器件。

芯片的主要功能是将CAN控制器的逻辑电平转换为CAN总线的差分电平,并且具有DC 2500V的隔离功能及ESD保护作用,其是CAN收发器的理想选择[2]。

2 CAN总线收发模块的硬件设计CAN总线收发模块的硬件结构如图2所示。

CAN总线(1978-),男,江西宜春人,研究生,工程师。

研究方向:汽车电子项目管理。

公飞(1989-),男,山东临沂人,本科,助理工程师。

研究方向:汽车电子硬件设计。

收发模块的主要功能是控制开关和与RS232进行数据通信,开关可以用来控制现场设备的运行,后者可以方便与外界进行通信,提供通讯接口。

其硬件结构节点可以划分为最小系统模块、功能模块。

电源STM32的工作电压(VDD)为2.0~3.6V[3]。

通过内置的电压调节器提供所需的1.8V电源。

当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源。

使用电池或其他电源连接到VBAT脚上,当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。

VBAT脚也图3 设置时钟流程图2.2 开关和RS232功能模块该节点具有两个功能,控制开关状态和与RS232通讯,开关选用八个TX2-5V继电器,两片MC1413作为驱动芯片,MC1413可以实现单片机端口电压到12V电平的转换。

与RS232通讯部分选用MAX232做为电平转换芯片。

2.3 CAN收发模块CAN收发模块主要是CAN收发器,CAN收发器的常用型号有CTM1050,CTM1050是一款带隔离的高速CAN收发器芯片,该芯片内部集成了所有必需的CAN隔离及CAN发器件。

芯片的主要功能是将CAN控制器的逻辑电平转换为CAN总线的差分电平,并且具有DC 2500V的隔离功能及ESD保护作用。

该芯片符合ISO 11898标准,因此,它可以和图2 节点硬件结构图图4 CAN初始化流程图选用的测试模式是环回模式,该模式下数据是自发自收的,即在发送成功的同时就接收到数据了。

基于STM32的CAN总线上下位机通信实验设计

基于STM32的CAN总线上下位机通信实验设计

基于STM32的CAN总线上下位机通信实验设计作者:刘泰廷李新建来源:《电脑知识与技术》2017年第05期摘要:随着技术的成熟和设备的完善,CAN总线在数据的实时传输和自动控制中展现出良好的灵活性与可靠性。

笔者以STM32为主控芯片搭建硬件电路,利用软件对其进行初始化设置,上位机与电路的连接使用USB—CAN转换器,并采用Visual C++的MFC编写的CAN 调试界面实现数据的实时收发,使上下位机完成通信。

本实验对于CAN总线的使用有一定的指导作用。

关键词:STM32;CAN总线;MFC;通信中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)05-0199-02CAN简称为控制器局域网络(Controller Area Network),它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,是国际上应用最广泛的现场总线之一,并最终成为国际标准(ISO11519)。

近年来,由于它的高可靠性和良好的错误检测能力受到人们的关注,CAN 总线协议逐渐成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,被广泛应用于汽车控制系统和环境温度恶劣、电磁辐射强的工业环境。

1 实验系统结构组成利用CAN总线可以将传统分布式控制系统的功能分散到不同的现场节点中,本实验只选用一个节点作为下位机的收发模块。

实验的系统框图如图1所示,系统主要分为三个部分:上位机(PC机)、CAN转换器、下位机(CAN收发模块电路)。

一般调试员的PC机(多为笔记本电脑)接入CAN总线往往没有串行接口,为此我们采用USB—CAN协议的转换器接入CAN总线,实现数据之间的转发。

下位机是以STM32F103RCT6单片机作为主控芯片的CAN 收发电路,主要完成数据采集和处理的任务,并实现与CAN总线的数据互传。

上位机利用MFC编写的控制界面,对CAN总线上收到的数据进行显示,同时也可以完成向CAN总线发送数据的指令。

基于STM32芯片及CAN总线在汽车上的应用

基于STM32芯片及CAN总线在汽车上的应用

基于STM32芯片及CAN总线在汽车上的应用作者:滕守明鲁奕李响来源:《无线互联科技》2013年第03期摘要:随着时代的不断发展和科技的不断进步越来越多的微控制芯片被创造出来,在我们的生活中它们无处不在,小到手机、电视等家用电器,大到航空航天设备。

它们在各个领域中发挥着自己作用。

STM32系列的微控制器就是其中的一种,它们中集成的CAN总线控制器更是在汽车电子应用上有着不可撼动的地位。

关键词:STM32;CAN总线1、STM32控制器的介绍STM32系列MCU是由意法半导体公司基于超低功耗的ARM Cortex-M3处理器内核,采用意法半导体独有的两大节能技术:130hm专用低泄漏电流制造工艺和优化的节能架构,专为要求高性能、低成本、低功耗的嵌入式应用专门设计的。

它按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。

增强型系列时钟频率达到721~Iz,是同类产品中性能最高的产品:基本型时钟频率为36M11z,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。

两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。

时钟频~72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。

2、STM32 MCU的性能特点内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPs/MHz。

单周期乘法和硬件除法。

存储器:片上集成32-512KB的F1ash存储器。

6-64KB的sRAM存储器。

时钟、复位和电源管理:2.0-3.6v的电源供电和I/0接口的驱动电压。

POR、PDR和可编程的电压探测器(PVD)。

4-16MHz的晶振。

内嵌出厂前调校的8MHz RC振荡电路.内部40 kHz的Rc振荡电路。

用于cPU时钟的PLL。

带校准用于眦的321dlz的晶振。

基于STM32F1O5的CAN总线中继器的设计与实现

基于STM32F1O5的CAN总线中继器的设计与实现

基于STM32F1O5的CAN总线中继器的设计与实现摘要:提出了一种用MCU 自带的双CAN 接口实现CAN 总线中继器的设计方法,并给出了基于STM32F105 的CAN 总线中继器的软硬件实现方案。

采用单CPU 的设计可以很好地解决两个CAN 接口的主从状态转换,使系统具有结构简单、性能稳定、实时性高等特点。

关键词:CAN 总线;中继器:STM32F105;CAN 控制器;0 引言CAN 总线最初是为了解决汽车内部的信号传输问题而提出来的,目前广泛应用于工业现场控制单元、智能楼宇单元、矿业控制通讯、远程通讯节点等控制领域。

受到CAN 收发器的闲宣,总线上挂接的节点不能超过110 个,两个节点间的最大通讯距离为10km,挂在总线上的节点要通讯必须具有相同的波特率。

为了能够在总线上挂接更多的节点,增加通信距离以及使具有不同波特率的节点或网络间进行通信,本文提出了一种使用具有双CAN 口的MCU 实现的CAN 总线中继器。

该中继器可大大缩短采用两个CPU 时CAN 接口的主从状态切换和CPU 间通信的时间,提高系统的实时性。

1 CAN 中继器硬件的设计1.1 系统的硬件结构本文设计的CAN 总线中继器的系统框图如图1 所示。

此中继器以带有双CAN 接口的STM32F105 为核心,外围电路主要由光电隔离电路、DC /DC 电路、CAN 收发器、状态显示电路、波特率设置电路、ID 设置电路和电源电路组成。

光电隔离电路采用高速光耦将主控电路CPU 的I/O 口和收发器进行电气隔离,可消除总线上的噪声对主控电路的干扰;为了能使总线和主控电路完全的电气隔离,用DC/DC 隔离电源单独对CAN 收发器电路部分供电;状态显示电路指示当前各个CAN 口的收发状态;波特率设置电路可分别设置两个CAN 接口的波特率;ID 设置电路可根据用户需求设置当前CAN 中继器的ID;电源电路主要将输入的9~36V 的直流电压转成5V 和3.3V 两种电压,分别给DC/DC 电路。

STM32的CAN总线中继器设计及应用

STM32的CAN总线中继器设计及应用

良的 稳 定 性 、 时 性 、 程 通 信 能 力 以及 超 强 的 硬 件 CRC 实 远
纠 错 等 特 性 ; AN 总线 技 术 的应 用 不 再 仅 限 于 汽 车 行 业 , C
而 是 扩 展 到 了机 械 、 织 、 制 等 行 业 , 被 公 认 为 是 最 有 纺 控 并
文 献 E ] 用 独 立 双 CAN 控 制 器 作 为 2路 C 3使 AN接 口的控
制器来设计 C AN 中 继 器 。 上 述 方 案 电路 复 杂 , MCU 与
CAN 控 制 器 通 过 外 部 总 线 连 接 , 据 吞 吐 速 度 慢 , 体 可 数 整
靠 性 也 比较 差 。
Pa n Ye Xi o o g,Zh n n To g, a r n a g Na, n J a e g Fa i nf n
(El cr ni n or a i le e, 'n Po y e h c U nie st X i n 71 04 Chi ) e t o c I f m ton Co lg Xi l t c ni a v r iy, ’ 0 8, a na
Байду номын сангаас
Key wor ds:CA N s;r p a e bu e e t r;STM 32 05;Zi r rprntng m a hi F1 m ne i i c ne
引 言
C AN 总线 是 一种 多 主 方 式 的 串 行 通 信 总 线 , 有 优 具
1 系统 整 体 方 案及 硬 件 实 现
意法半导 体 的 S TM3 2是 以 ARM re Co tx—M3为 内
前途的现 场 总 线 之 一。然 而 由于受 制 于 C AN 收 发 器 , C AN 总线 通信 距 离 和 网 络 中 节 点 数 被 分 别 限 制 在 1 m 0k 和 1 0个 之 内 。但 是 在 稍 大 型 的 C 1 AN 总 线 系 统 中 . 往 这 往是不够 的, 时就 需要 用 C 这 AN 总 线 中 继 器 对 C AN 总 线 网络 进 行 扩 展 。

STM32的CAN现场总线应用经验总结

STM32的CAN现场总线应用经验总结

STM32的CAN现场总线应用经验总结CAN现场总线的应用最重要的就是其接口端口映射、初始化及数据的发送、接收。

1.接口映射STM32中的CAN物理引脚可以设置成三种:默认模式、重定义地址1模式、重定义地址2模式。

CAN信号可以被映射到端口A、端口B或端口D上,如下表所示,对于端口D,在36、48和64脚的封装上没有重映射功能。

表1:CAN复用功能重映射复用功能CAN_REMAP[1:0]="00"CAN_REMAP[1:0]="10"CAN_REMAP[1:0]="11" CAN_RX PA11PB8 PD0CAN_TX PA12 PB9 PD1重映射不适用于36脚的封装当PD0和PD1没有被重映射到OSC_IN和OSC_OUT时,重映射功能只适用于100脚和144脚的封装上---------------------------------------------------------------------------------------------------------------------- 默认模式/* Configure CAN pin: RX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/* Configure CAN pin: TX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);---------------------------------------------------------------------------------------------------------------------- 重定义地址1模式/* Configure CAN pin: RX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/* Configure CAN pin: TX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/*Configure CAN Remap 重映射*/GPIO_PinRemapConfig(GPIO_Remap1_CAN,ENABLE);---------------------------------------------------------------------------------------------------------------------- /* Configure CAN pin: RX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/* Configure CAN pin: TX */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIO_CAN_Key, &GPIO_InitStructure);/*Configure CAN Remap 重映射 */GPIO_PinRemapConfig(GPIO_Remap2_CAN,ENABLE);---------------------------------------------------------------------------------------------------------------------- 设置完CAN 的引脚之后还需要打开CAN 的时钟: /* CAN Periph clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN,ENABLE); 2. 初始化2.1.1 CAN 单元初始化CAN 单元初始化最重要的就是波特率的设置,原理如下:位时间同步段 时间段1(BS1)时间段2(BS2) 1×t q t BS1=(TS1[3:0]+1)×t qt BS2= (TS2[2:0]+1)×t q波特率=1/位时间位时间 = (1 + t BS1 + t BS2)× t q t q = (BRP[9:0] + 1)× t PCLKt PCLK = APB1例如现有一STM32系统时钟为72MHz ,关于CAN 波特率有以下设置: CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位 CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; //时间段1为8个时间单位 CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; //时间段2为7个时间单位 CAN_InitStructure.CAN_Prescaler = 45; //设定了一个时间单位的长度为45即:CAN_InitStructure.CAN_Prescaler即:CAN_InitStructure.CAN_BS1即:CAN_InitStructure.CAN_BS则其CAN 的波特率为1÷[(1+8+7)×45÷(36×106)]=50KHzCAN 单元的初始化,除了波特率的设置以外还包括以下设置:CAN_InitTypeDef CAN_InitStructure; //定义一个CAN 单元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;// 使/失能接收FIFO 锁定模式(失能) CAN_InitStructure.CAN_TXFP = DISABLE; //使/失能发送FIFO 优先级(失能)CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//设置CAN 工作模式(正常模式) 2.1.2 CAN 报文过滤器初始化STM32共有14组过滤器,每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。

基于STM32的铜线放线监测系统设计

基于STM32的铜线放线监测系统设计

基于STM32的铜线放线监测系统设计目录一、内容综述 (2)1.1 研究背景和意义 (3)1.2 国内外研究现状 (4)1.3 系统设计目标与任务 (5)二、系统总体设计方案 (6)2.1 系统架构设计 (7)2.2 系统硬件选型 (9)2.3 系统软件设计思路 (10)三、硬件设计 (12)3.1 STM32主控模块设计 (13)3.2 铜线放线模块设计 (14)3.3 数据采集与处理模块设计 (15)3.4 通讯模块设计 (17)3.5 电源及接口设计 (18)四、软件设计 (19)4.1 软件开发环境搭建 (20)4.2 主程序设计 (21)4.3 数据采集与处理程序设计 (22)4.4 通讯程序设计 (24)4.5 人机交互界面设计 (25)五、系统调试与优化 (27)5.1 调试准备 (28)5.2 调试过程 (31)5.3 问题与优化方案 (32)六、系统测试与评估 (33)6.1 测试环境搭建 (34)6.2 测试方法与步骤 (35)6.3 测试结果分析 (36)七、应用实例分析 (37)7.1 应用场景描述 (38)7.2 系统在实际应用中的表现 (40)7.3 效果评估与反馈 (41)八、总结与展望 (42)8.1 研究成果总结 (43)8.2 存在问题与不足 (44)8.3 未来研究方向和展望 (45)一、内容综述随着现代工业的发展,电气化作为工业制造的关键要素,其安全和准确性在工程实践中日益受到重视。

在此背景下,铜线作为电气化传输的重要介质,其放线过程中的张力控制、轨迹跟踪及故障检测成为确保生产效率和设备安全的关键环节。

本文围绕STM32微控制器为核心,设计并实现了一种高效的铜线放线监测系统。

该系统结合了STM32的高性能与嵌入式系统的特点,通过精密的传感器部署和先进的信号处理算法,实现了对铜线放线过程的全面监控。

在张力控制方面,系统采用了闭环PID控制策略,根据实时采集的线缆张力数据,动态调整控制参数,确保放线过程的稳定性和精确性。

基于STM32的CAN总线接口控制系统设计

基于STM32的CAN总线接口控制系统设计

基于STM32的CAN总线接口控制系统设计梁妍;原立格;郝洋洲【摘要】本文设计了一种汽车的接口控制系统,以STM32为主控器,搭配传输速度快且性能稳定的TJA1042CAN收发器,可以与CAN总线数据和串行数据同时通信,该接口与多种多媒体设备连接,使车身在融合了强大的娱乐功能的同时又可以更加方便地对车辆进行监控和控制,实现汽车智能化.【期刊名称】《河南科技》【年(卷),期】2016(000)011【总页数】4页(P95-98)【关键词】接口控制;STM32;CAN总线;通信;智能化【作者】梁妍;原立格;郝洋洲【作者单位】郑州工商学院,河南郑州451400;郑州工商学院,河南郑州451400;河南省航空物探遥感中心,河南郑州450053【正文语种】中文【中图分类】TP273.5近年来,嵌入式在车身上的应用愈加流行,与CAN总线的高效通信也提高了车辆的总体性能。

CAN总线是一种实时总线,有一定的通信协议来作为标准,数据的传输可以用普通的线束也可以用双绞线,而且是一种多主多控的通信总线,带有自检功能,还能有效抵抗电子干扰,传输速率最高可达1Mbps。

随着嵌入式技术的快速发展,在汽车应用中将嵌入式与CAN总线配合使用,不仅降低了制造成本,提高了运算传输速度和安全性,还更加灵活、易操控[1]。

本文采用具有CAN接口的STM32开发板作为通信的主芯片,搭配具有CAN收发控制功能的TJA1042模块,来实现一个完整的CAN通信网络系统。

总线连接的各模块除了和主芯片通信以外,还可以依据总线协议相互通信。

在汽车上将汽车CAN总线数据转化为串口数据与智能产品对接,用作监控车辆信息,指示车身动态,还可以警示开车人员等,同样将与串口对接的电子产品发出的串口数据转化成能够控制汽车的CAN总线数据,就能控制车载空调、倒车雷达、车辆照明、车辆设置等车辆已有的与总线对接的车载电子,使汽车智能化的功能更加强大[2]。

硬件总体是以STM32为主控芯片,通过CAN收发器与CAN总线对接,从而控制CAN总线的收发。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档