关于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); //将以上设置的数据发送出去
}