can总线源代码
源代码在线查看: can程序.c
/*
* Field Bus & Embedded System LAB (B&E LAB) OF IMUST
*
*
* FileName : candemo.c can示例小程序
* FileID :
* Abstract : 同期性的以ID号为0x100发送 1 2 3 4 5 6 7 8 信息,
* 再接收到ID号0x200发送的一字节信息后,闪一下PB0口的小灯。
*
*
* Version :
* Author :
* Professor :
* FinishDate :
*
* HistoryVersion : None
* HistoryAuthor : None
* FinishDate : None
*
* CPU : AT90CAN128
* Oscillator : 4MHz
* CompileIDE : ImageCraft ICCAVR 6.31A & UltraEdit
*
* Testbench : 程序工作在250K, 扩展格式
* 测试平台IXXAT PCI和USB2CAN模块,及CanAnayler32分析软件。
*
*/
/*********************************/
/* Std HeaderFile 标准头文件包含 */
/*********************************/
#include
#include
/***********************************/
/* My HeaderFile 自定义头文件包含 */
/***********************************/
/*********************/
/* Definition 宏定义 */
/*********************/
#define uchar unsigned char
#define uint unsigned int
/*********************************/
/* Function Declaraton 函数声明 */
/*********************************/
void CAN_Init(void);
void DELAY(void);
uchar tflag=1;
#pragma interrupt_handler canit_isr:19
void canit_isr(void)
{
if((CANSIT2 & 0x01) == 0x01) /* 发生发送中断 */
{
CANPAGE = 0x00; /* 选中中断的MOB0 */
CANSTMOB &= 0xBF; /* 清除中断标志 */
CANCDMOB &= 0x3F;
tflag = 0; /* 置一个标置为0, 以便让main的while(tflag)跳出循环 */
}
else /* 发生接收中断 */
{
CANPAGE = 0x10; /* 选中中断的MOB1 */
CANSTMOB &= 0xDF; /* 清接收中断标志 */
PORTC = 0xFE;
DELAY();
PORTC = 0xFF;
DELAY(); /* 让小灯闪一下,证明进入这个中断 */
CANCDMOB |= 0x80; /* 再次启用接收 */
}
}
/* 主函数 */
void main(void)
{
CLI(); /* 关中断 */
/* 其它初始化程序 */
PORTC = 0xFF;
DDRC = 0xFF;
CAN_Init(); /* CAN控制器初始化 */
SEI(); /* 开中断 */
CANPAGE = 0x10; /* 选中接收的MOB */
CANCDMOB |= 0x80; /* 开启接收 */
while(1)
{
CANPAGE = 0x00; /* 选中发送的MOB0 */
CANCDMOB |= 0x40; /* 开始发送 */
while(tflag == 1) /* 等待发送中断产生 */
{}
tflag = 1;
DELAY();
DELAY(); /* 延时一下 */
}
}
/**************************************/
/* CAN控制器初始化 */
void CAN_Init(void)
{
uchar i;
CANGCON = 0x02; /* 启用CAN控制器 */
while(ENFG == 0) /* 等待启用成功 */
{
}
CANGIE = 0xB0; /* 启用发、收、CAN总中断 */
CANIE2 = 0x03; /* 允许MOB0和MOB1中断 */
CANIE1 = 0x00; /* 禁止MOB0和MOB1以外的MOB中断 */
CANBT1 = 0x02;
CANBT2 = 0x04;
CANBT3 = 0x13; /* 设定波特率,可以在AT90CAN128手册中查到,也可以自己计算 */
/* 我这用的是250K */
CANPAGE = 0x00; /* 选中MOB0 用于发送MOB */
CANCDMOB = 0x18; /* 设定为扩展帧格式29位标识, 8字节 */
CANIDT1 = 0x00;
CANIDT2 = 0x00;
CANIDT3 = 0x08;
CANIDT4 = 0x00; /* 发送ID号为0x100 */
for(i=1; i {
CANMSG = i;
} /* 发送的数据为 1 2 3 4 5 6 7 8 */
CANPAGE = 0x10; /* 选中MOB1作为接收中断用 */
CANCDMOB = 0x11; /* 设定为扩展29位标识, 接收1字节 */
CANIDT1 = 0x00;
CANIDT2 = 0x00;
CANIDT3 = 0x10;
CANIDT4 = 0x00; /* 只接收ID号为0x200的标识发来的信息 */
CANIDM1 = 0xFF;
CANIDM2 = 0xFF;
CANIDM3 = 0xFF;
CANIDM4 = 0xFF;
}
/***********************************/
/* 延时函数 */
void DELAY(void)
{
uint i;
uint j;
for(i=0; i {
for(j=0; j {
NOP();
NOP();
}
}
}
/***********************************/