飞思卡尔MC9S12X:CAN驱动函数在主函数中的应用

关于CAN驱动的配置,我已经有详细的介绍了。
接下来主要介绍之前配置的CAN驱动函数在主函数中的应用。


一、CAN驱动函数

1. CAN初始化函数

具体详细介绍:飞思卡尔MC9S12X:CAN初始化配置

void INIT_MSCAN0(void);

2. CAN发送函数

具体详细介绍:飞思卡尔MC9S12X:CAN发送配置

int MSCAN0_Send(struct can_msg msg);

3. CAN接收函数

具体详细介绍:飞思卡尔MC9S12X:CAN接收配置

int MSCAN0_Receive(struct can_msg msg);

二、CAN驱动函数在主函数中的应用

以上已经详细介绍了CAN驱动函数的配置,但是具体怎么使用我们还不知道,接下来具体介绍CAN驱动函数在主函数中的应用。

具体代码如下:

/*
其他调用和宏定义已省略
*/
#include "CAN.h"	//调用CAN驱动文件  
#include "CAN0_CSS.h"	//调用CAN数据处理文件

typedef struct can_msg     //定义报文的结构体
{
    
    
	unsigned long ID;		//扩展帧ID
    unsigned int id;		//标准帧id
    unsigned char RTR;		// RTR: 1为远程帧,0为数据帧
    unsigned char data[8];	//帧数据
    unsigned char len;		//数据长度
    unsigned char prty;		//优先级
};

struct can_msg  msg_send, msg_get;	//定义接收和发送结构体变量

/*
初始化锁相环和初始化ECT模块已省略                     
*/

/*************************************************************/
/*                         延时函数                          */
/*************************************************************/
void delay1ms(unsigned int n) 
{
    
    
    unsigned int i;
    for(i=0;i<n;i++) 
    {
    
    
        TFLG1_C0F = 1;              //清除标志位
        TC0 = TCNT + 250;           //设置输出比较时间为1ms
        while(TFLG1_C0F == 0);      //等待,直到发生输出比较事件
    }
}
/*************************************************************/
/*                      中断接收函数                         */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt CAN_receive(void) 
{
    
    
    if(MSCAN0_Receive(msg_get)) 
    {
    
    
	  Can0ReceiveDataAnalysis(msg_get);		//对CAN接收的数据进行处理
 	}
}
#pragma CODE_SEG DEFAULT

/*************************************************************/
/*                        主函数                             */
/************************************************************/
void main(void) 
{
    
    
  /*其他初始化函数省略*/
  INIT_CAN0();//初始化CAN

  for(;;) 
  {
    
    
  	  Can0Send_data();	//CAN数据发送函数
      delay1ms(500);
  }
}

以下是CAN数据处理函数,写到CAN数据处理文件CAN0_CSS.c中,主函数直接调用。

/*************************************************************/
/*                   CAN接收处理函数                         */
/***********************************************************/
void Can0ReceiveDataAnalysis(can_msg msg)
{
    
    
	if(msg.id==0x001//对不同ID的数据进行处理
	{
    
    
		if(msg.data[0]==0x01)
    	{
    
    
      		//相对应的操作:灯亮
    	}
    	else    
    	{
    
    
    		//相对应的操作:灯灭
    	}
	}
	
}
/*************************************************************/
/*                   CAN发送处理函数                         */
/***********************************************************/
void Can0Send_data(void)	//举例发送标准帧id:0x001
{
    
    
	can_msg msg = {
    
    0,0,0,{
    
    0x00,0x001,0x00,0x00,0x00,0x00,0x00,0x00},0,0};         //报文
	unsigned char data[8]={
    
    0,1,2,3,4,5,6,7};
	msg.id = 0x001;		//设置id
	msg.RTR = 0;		// RTR: 1为远程帧,0为数据帧
	msg.len = 8;		//设置数据长度	
	
	//对数据赋值,加上强制转换不会出错
	msg.data[0] = (unsigned char) data[0];
	msg.data[1] = (unsigned char) data[1];
	msg.data[2] = (unsigned char) data[2];
	msg.data[3] = (unsigned char) data[3];
	msg.data[4] = (unsigned char) data[4];
	msg.data[5] = (unsigned char) data[5];
	msg.data[6] = (unsigned char) data[6];
	msg.data[7] = (unsigned char) data[7];
	
	msg.prty=1;	//设置优先级
	
	MSCAN0_Send(msg);	//将以上设置的数据发送出去
}

点击下载,关于MSCAN寄存器的详细中文介绍

猜你喜欢

转载自blog.csdn.net/MQ0522/article/details/112820678