?? can.c
字號:
#include "f2407_c.h" //引用頭部文件
int CAN_FLAG; //定義標志寄存器
void system_init(); //聲明在程序中需要用到是函數
void CANMBX_ISR();
void CAN_INIT();
void inline disable()
{
asm(" setc INTM");
}
void inline enable()
{
asm(" clrc INTM");
}
//(1)主程序
main()
{
system_init(); //系統初始化子程序
CAN_FLAG=0x00; //清CAN用戶標志,CAN_FLAG=0表示收到數據
CAN_INIT(); //CAN初始化子程序
enable();
for(;;)
{
TCR=0x20; //MBX3請求發送
while(TCR&0x2000==0) //等待發送應答
continue;
TCR=0x2000; //清TA3和MIF3標志位
while(CAN_FLAG==0)
continue; //等待接收數據
CAN_FLAG=0x0000; //清接收到標志
MDER=0x0000; //郵箱不使能
MCR=0x0140; //CDR=1,數據改變請求
MBX3A=MBX2A+1; //郵箱3中數據加1用來更新2中的數據
MBX3B=MBX2B+1;
MBX3C=MBX2C+1;
MBX3D=MBX2D+1;
}
}
//(2) 系統初始化子程序
void system_init()
{
asm(" setc SXM"); // 抑制符號位擴展
asm(" clrc OVM"); // 累加器中結果正常溢出
asm(" clrc CNF"); // B0被配置為數據存儲空間
asm(" setc INTM"); // 禁止所有中斷
SCSR1=0x81FE; // CLKIN=6M,CLKOUT=4CLKIN=24M
WDCR=0x0E8; // 不使能看門狗,因為SCSR2中的WDOVERRIDE
// 即WD復位后的缺省值,故可以用
// 軟件禁止看門狗
IMR=0x0010; // 開中斷優先級5
IFR=0x0FFFF; // 清除全部中斷標志,"寫1清0"
}
//(3)CAN初始化子程序
void CAN_INIT()
{
MCRB=MCRB|0x0C0; //設置IOPC6、IOPC7為CANRX,CANTX
CAN_IFR=0x0FFFF; //清所有中斷標志
LAM1_H=0x7FFF; //設置郵箱3、2的屏蔽ID寄存器
LAM1_L=0x0FFFF; //0則ID必須匹配
MCR=0x1040; //CCR=1改變配置請求
while(GSR&0x0010==0) continue; //CCE=1時即可配置BCR2、BCR1寄存器
BCR2=0x01; //波特率預分頻寄存器
BCR1=0x033; //波特率設置為500Kbps
MCR=MCR&0x0EFFF; //CCR=0改變配置請求
while(GSR&0x0010!=0) continue; //只有當CCE=0時,配置BCR2、BCR1寄存器成功
MDER=0x040; //不使能郵箱2,郵箱2改為接收方式
MCR=0x0143; //CDR=1,數據區改變請求
MSGID2H=0x2447; //設置郵箱2的控制字及ID
//IDE=0,AME=0,AAM=0
//標準方式為MSGID2H[12~2]
MSGID2L=0x0FFFF;
MSGCTRL2=0x08; //設置控制哉
//數據長度DCL=8,RTR=0數據幀
MBX2A=0x0000; //郵箱2信息初始化
MBX2B=0x0000;
MBX2C=0x0000;
MBX2D=0x0000;
MSGID3H=0x2447; //設置郵箱3的標識符
MSGID3L=0x0FFFF;
MSGCTRL3=0x08; //RTR=0,DCL=8
MBX3A=0x2211; //郵箱3信息初始化
MBX3B=0x4433;
MBX3C=0x6655;
MBX3D=0x8877;
CAN_IMR=0x0F7FF;
CAN_IFR=0x0FFFF;
MCR=0x04c0; //DB0=1,AB0=1,STM=1設置為自測試模式
MDER=0x04C; //使能郵箱2和3,郵箱2為接收方式
}
//(4)中斷程序
void interrupt GRIS5()
{
switch(PIVR)
{
case 64:CANMBX_ISR();
break;
}
}
void CANMBX_ISR()
{
RCR=0x040; //復位RMP2和MIF2
CAN_FLAG=1; //置用戶接收標志
}
// 直接返回中斷服務程序
void interrupt nothing( )
{
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -