?? can程序.c
字號:
/*
* Field Bus & Embedded System LAB (B&E LAB) OF IMUST
*
*
* FileName : candemo.c can示例小程序
* FileID :
* Abstract : 同期性的以ID號為0x100發(fā)送 1 2 3 4 5 6 7 8 信息,
* 再接收到ID號0x200發(fā)送的一字節(jié)信息后,閃一下PB0口的小燈。
*
*
* Version :
* Author :
* Professor :
* FinishDate :
*
* HistoryVersion : None
* HistoryAuthor : None
* FinishDate : None
*
* CPU : AT90CAN128
* Oscillator : 4MHz
* CompileIDE : ImageCraft ICCAVR 6.31A & UltraEdit
*
* Testbench : 程序工作在250K, 擴(kuò)展格式
* 測試平臺IXXAT PCI和USB2CAN模塊,及CanAnayler32分析軟件。
*
*/
/*********************************/
/* Std HeaderFile 標(biāo)準(zhǔn)頭文件包含 */
/*********************************/
#include <ioCAN128v.h>
#include <macros.h>
/***********************************/
/* My HeaderFile 自定義頭文件包含 */
/***********************************/
/*********************/
/* Definition 宏定義 */
/*********************/
#define uchar unsigned char
#define uint unsigned int
/*********************************/
/* Function Declaraton 函數(shù)聲明 */
/*********************************/
void CAN_Init(void);
void DELAY(void);
uchar tflag=1;
#pragma interrupt_handler canit_isr:19
void canit_isr(void)
{
if((CANSIT2 & 0x01) == 0x01) /* 發(fā)生發(fā)送中斷 */
{
CANPAGE = 0x00; /* 選中中斷的MOB0 */
CANSTMOB &= 0xBF; /* 清除中斷標(biāo)志 */
CANCDMOB &= 0x3F;
tflag = 0; /* 置一個標(biāo)置為0, 以便讓main的while(tflag)跳出循環(huán) */
}
else /* 發(fā)生接收中斷 */
{
CANPAGE = 0x10; /* 選中中斷的MOB1 */
CANSTMOB &= 0xDF; /* 清接收中斷標(biāo)志 */
PORTC = 0xFE;
DELAY();
PORTC = 0xFF;
DELAY(); /* 讓小燈閃一下,證明進(jìn)入這個中斷 */
CANCDMOB |= 0x80; /* 再次啟用接收 */
}
}
/* 主函數(shù) */
void main(void)
{
CLI(); /* 關(guān)中斷 */
/* 其它初始化程序 */
PORTC = 0xFF;
DDRC = 0xFF;
CAN_Init(); /* CAN控制器初始化 */
SEI(); /* 開中斷 */
CANPAGE = 0x10; /* 選中接收的MOB */
CANCDMOB |= 0x80; /* 開啟接收 */
while(1)
{
CANPAGE = 0x00; /* 選中發(fā)送的MOB0 */
CANCDMOB |= 0x40; /* 開始發(fā)送 */
while(tflag == 1) /* 等待發(fā)送中斷產(chǎn)生 */
{}
tflag = 1;
DELAY();
DELAY(); /* 延時一下 */
}
}
/**************************************/
/* CAN控制器初始化 */
void CAN_Init(void)
{
uchar i;
CANGCON = 0x02; /* 啟用CAN控制器 */
while(ENFG == 0) /* 等待啟用成功 */
{
}
CANGIE = 0xB0; /* 啟用發(fā)、收、CAN總中斷 */
CANIE2 = 0x03; /* 允許MOB0和MOB1中斷 */
CANIE1 = 0x00; /* 禁止MOB0和MOB1以外的MOB中斷 */
CANBT1 = 0x02;
CANBT2 = 0x04;
CANBT3 = 0x13; /* 設(shè)定波特率,可以在AT90CAN128手冊中查到,也可以自己計算 */
/* 我這用的是250K */
CANPAGE = 0x00; /* 選中MOB0 用于發(fā)送MOB */
CANCDMOB = 0x18; /* 設(shè)定為擴(kuò)展幀格式29位標(biāo)識, 8字節(jié) */
CANIDT1 = 0x00;
CANIDT2 = 0x00;
CANIDT3 = 0x08;
CANIDT4 = 0x00; /* 發(fā)送ID號為0x100 */
for(i=1; i<9; i++)
{
CANMSG = i;
} /* 發(fā)送的數(shù)據(jù)為 1 2 3 4 5 6 7 8 */
CANPAGE = 0x10; /* 選中MOB1作為接收中斷用 */
CANCDMOB = 0x11; /* 設(shè)定為擴(kuò)展29位標(biāo)識, 接收1字節(jié) */
CANIDT1 = 0x00;
CANIDT2 = 0x00;
CANIDT3 = 0x10;
CANIDT4 = 0x00; /* 只接收ID號為0x200的標(biāo)識發(fā)來的信息 */
CANIDM1 = 0xFF;
CANIDM2 = 0xFF;
CANIDM3 = 0xFF;
CANIDM4 = 0xFF;
}
/***********************************/
/* 延時函數(shù) */
void DELAY(void)
{
uint i;
uint j;
for(i=0; i<900; i++)
{
for(j=0; j<500; j++)
{
NOP();
NOP();
}
}
}
/***********************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -