您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > CAN模块的详解及测试代码
CAN模块的详解及测试代码一、功能描述bxCAN是基本扩展CAN(BasicExtendedCAN)的缩写,它支持CAN协议2.0A和2.0B。它的设计目标是以最小的CPU负荷来高效处理大量收到的报文。它也支持报文发送的优先级要求(优先级特性可软件配置)。二、CAN模块的主要特性1、支持CAN协议2.0A和2.0B主动模式;波特率最高可达1兆位/秒;支持时间触发通信功能;2、发送个发送邮箱;发送报文的优先级特性可软件配置;记录发送SOF时刻的时间;3、接收级深度的2个FIFO;个位宽可变的过滤器组-由整个CAN共享;标识符列表;溢出处理方式可配置;记录接收SOF时刻的时间;4、可支持时间触发通信模式禁止自动重传模式;位自由运行定时器;定时器分辨率可配置;可在最后2个数据字节发送时间;5、管理中断可屏蔽;邮箱占用单独1块地址空间,便于提高软件效率;6、发送邮箱共有3个发送邮箱供软件来发送报文。发送调度器根据优先级决定哪个邮箱的报文先被发送。7、接收过滤器共有14个位宽可变/可配置的标识符过滤器组,软件通过对它们编程,从而在引脚收到的报文中选择它需要的报文,而把其他报文丢弃掉。8、接收FIFO共有2个接收FIFO,每个FIFO都可以存放3个完整的报文。它们完全由硬件来管理三、CAN功能框图四、CAN总线通讯模块CAN总线测控系统的通信软件分为3部分:CAN初始化、数据发送和数据接收。①CAN初始化其主要是设置CAN的通信参数。需要初始化的寄存器有:模式寄存器(PeliCAN模式)、时分寄存器、接收代码寄存器、屏蔽寄存器、总线定时寄存器、输出控制寄存器等。需要注意的是,这些寄存器仅能在复位期间可写访向,因此,在对这些寄存器初始化前,必须确保系统进入了复位状态,并且系统中各CAN控制器的总线定时寄存器的初始化字必须相同。②数据发送现场的各传感器把环境多参数的检测信号(数字量、模拟量、开关量)进行转换处理后,发向CAN控制器的发送缓冲区,然后启动CAN控制器的发送命令,此时CAN控制器将自动向总线发送数据,不再需传感器的微控制器进行干预。若系统中有多个传感CAN控制器同时向总线发送数据,则CAN控制器通过信息帧中的标识符来进行仲裁,标识符数值最小的CAN控制器具有对总线的优先使用权。③数据接收整个温室微机测控系统中的CAN控制器检测到总线上有数据时会自动接收总线上的数据,存入其接收缓冲区,并向89C52微控制器发送接收中断,启动中断接收服务程序,89C52通过执行中断接收服务程序,从CAN控制器的接收缓冲区读取数据,并对其进行进一步处理工作。(2)监控模块集成了所有的数据采集、参数设定、数据统计分析等功能。同时,为了实现操作人员对生产过程的人工干预,如修改给定值、控制参数和报警限等,添加了参数的修改功能;为了建立人机信息联系,并且能将各节点传输来的数据以图形、图表或其它动态方式显示出来,本系统可以使用任何具有DDE(DynamicDataExchange)接口的MMI(Man-Machineinterface)软件;为了更好的管理各种数据,采取了组态控制方式,能够接收来自MMI软件以及用户软件的DDE连接请求,并将该请求传递给通信驱动部分,由通信驱动转换为通信信号通过传输媒体传递给智能模块的固化软件。并将模块的应答作为DDE操作的结果返回给MMI软件及用户软件。五、CAN模块与单片机AT89C51连接的结构六、测试软件代码/*********************************************************************说明:CAN总线,让CAN工作在回环测试模式下,来测试CAN总线是否正常。在CAN发送邮箱中,发送2个数据的数据帧,看接收FIFO中是否接收到这两个数据********************************************************************/#includestm32f10x_lib.h#defineGPIO_CANGPIOB#defineGPIO_Pin_CAN_RXGPIO_Pin_8#defineGPIO_Pin_CAN_TXGPIO_Pin_9#defineGPIO_Remap_CANGPIO_Remap1_CANtypedefenum{FAILED=0,PASSED=!FAILED}TestStatus;/*******************************************************************函数名称:TestStatusCAN_Polling_Configuration(void)*功能描述:采用查询的方式来测试CAN总线*入口参数:无*出口参数:TestStatus测试的状态码,若发送与接收的数据一致返回1否则,返回0******************************************************************/TestStatusCAN_Polling_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;CAN_InitTypeDefCAN_InitStructure;CAN_FilterInitTypeDefCAN_FilterInitStructure;CanTxMsgTxMessage;CanRxMsgRxMessage;u8TransmitMailbox=0;u32i;/***********************************************************CAN总线的引脚配置************************************************************//*ConfigureCANpin:RX*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_CAN_RX;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIO_CAN,&GPIO_InitStructure);/*ConfigureCANpin:TX*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_CAN_TX;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIO_CAN,&GPIO_InitStructure);GPIO_PinRemapConfig(GPIO_Remap_CAN,ENABLE);/***********************************************************CAN总线的配置************************************************************//*CANregisterinit*/CAN_DeInit();CAN_StructInit(&CAN_InitStructure);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_LoopBack;//回环模式,自发自收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=5;//分频值CAN_Init(&CAN_InitStructure);/***********************************************************CAN总线的过滤设置************************************************************/CAN_FilterInitStructure.CAN_FilterNumber=0;//指定初始化的过滤器编号为0(0~13)CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//标识符屏蔽位模式CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//1个32位的过滤器CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//设定过滤器的标识符(32位为其高段,16位为第一个)范围是0x0000~0xffffCAN_FilterInitStructure.CAN_FilterIdLow=0x0000;//设定过滤器的标识符(32位为其低段,16位为第二个)范围是0x0000~0xffffCAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//设定过滤器屏蔽标识符或者过滤标识符CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;//设定过滤器屏蔽标识符或者过滤标识符CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FilterFIFO0;//过滤器FIFO指向过滤器0CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//使能过滤器CAN_FilterInit(&CAN_FilterInitStructure);/***********************************************************CAN总线的发送设置************************************************************/TxMessage.StdId=0x11;//标准标识符//TxMessage.ExtId=//扩展标识符TxMessage.IDE=CAN_ID_STD;//使用标准标识符TxMessage.RTR=CAN_RTR_DATA;//数据帧TxMessage.DLC=2;//设定传输消息的帧长度为2TxMessage.Data[0]=0xCA;//数据1TxMessage.Data[1]=0xFE;//数据2TransmitMailbox=CAN_Transmit(&TxMessage);i=0;while((CAN_TransmitStatus(TransmitMailbox)!=CANTXOK)&&(i!=0xFF)){i++;}i=0;while((CAN_MessagePending(CAN_FIFO0)1)&&(i!=0xFF)){i++;}/***********************************************************CAN总线的接收设置******
本文标题:CAN模块的详解及测试代码
链接地址:https://www.777doc.com/doc-2903229 .html