一、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 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); //将以上设置的数据发送出去 }
上一篇:基于MC9S12G使用编码器(控制)输出PWM
下一篇:MC9S12G128 PWM
推荐阅读最新更新时间:2024-10-30 19:36
设计资源 培训 开发板 精华推荐
- A_30_V10基于IPS2电机换向传感器的设计
- LTC3624EDD-25 5V 输出电压、2A 同步降压型稳压器的典型应用,具有 1MHz、突发模式操作
- 使用 ROHM Semiconductor 的 BD49K38G-TL 的参考设计
- ZR431FTA 可调精密齐纳并联稳压器的典型应用
- AD5306 四路电压输出、8 位数模转换器的典型应用
- 使用废弃水瓶生产3D打印机线材回收机
- LTC3892HUH 具有 6V 栅极驱动器的高效、双路 3.3V/8.5V 输出同步降压转换器的典型应用电路
- CH522G编程器PRGMR-PC100
- 使用 RECOM Power GmbH 的 RSO-4812DZ 的参考设计
- LT1171HVIT、5V/2.5A 升压转换器的典型应用